/ Hex Artifact Content
Login

Artifact 0177d9f411d96f99218c69759a98393baa674b76:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
12c0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
12d0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
12e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
12f0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1300: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1320: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1330: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1340: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1350: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1360: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1370: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1380: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1390: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
13a0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
13b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
13c0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
13d0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
13e0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
13f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1400: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1410: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1420: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1450: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1460: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1470: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1480: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1490: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
14a0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14b0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14c0: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
14d0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14e0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14f0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1500: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1510: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1520: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1530: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1540: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1550: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1560: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1570: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1580: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1590: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15a0: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
15b0: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
15c0: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
15d0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
15e0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
15f0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1600: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1610: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
1620: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1630: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1640: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1650: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1670: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1680: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1690: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
16a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16b0: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
16c0: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
16d0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
16e0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
16f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1700: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
1710: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
1720: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1730: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1740: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1750: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1760: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1770: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1780: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1790: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
17a0: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
17b0: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
17c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
17d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
17e0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
17f0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1800: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1810: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1820: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1830: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1840: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1850: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1860: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1870: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1880: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1890: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
18a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
18d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
18e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1900: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1910: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1920: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1930: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1950: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1960: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1970: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1980: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1990: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
19a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
19b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
19c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
19d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
19e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1a00: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1a10: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1a20: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1a30: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1a40: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1a50: 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49  entry */.  unixI
1a60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a80: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1a90: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ae0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1af0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b10: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b20: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b40: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b50: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b60: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b70: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1b80: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bb0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1bc0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bd0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1be0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1bf0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c00: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c10: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c20: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c50: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c70: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c90: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1ca0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cd0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1ce0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1cf0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d20: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d30: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1d90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1da0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1dd0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1de0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e40: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e70: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e80: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1e90: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ea0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1eb0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ec0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ed0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ee0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1ef0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f00: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f10: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f20: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f30: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f50: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f60: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f70: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f80: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1f90: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fa0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fb0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fc0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fd0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1fe0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1ff0: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2000: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2010: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2020: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2030: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2040: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2050: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2060: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2070: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2080: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20a0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20b0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20c0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20d0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20e0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
20f0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2100: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2110: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2120: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2130: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2140: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2160: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2170: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2180: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2190: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21a0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21c0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21d0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21e0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
21f0: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2200: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2210: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2220: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2230: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2240: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2250: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2260: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2270: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2280: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2290: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22a0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
22b0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
22c0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
22d0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
22e0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
22f0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2300: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2310: 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   mode */.#define
2320: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2330: 43 20 20 20 20 20 30 78 30 38 20 20 20 20 20 2f  C     0x08     /
2340: 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63  * Directory sync
2350: 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a   needed */../*.*
2360: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
2370: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
2380: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
2390: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
23a0: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
23b0: 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75  ** Define variou
23c0: 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72  s macros that ar
23d0: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73  e missing from s
23e0: 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ome systems..*/.
23f0: 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  #ifndef O_LARGEF
2400: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
2410: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
2420: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2430: 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e  DISABLE_LFS.# un
2440: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
2450: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
2460: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2470: 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  fndef O_NOFOLLOW
2480: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f  .# define O_NOFO
2490: 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69  LLOW 0.#endif.#i
24a0: 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23  fndef O_BINARY.#
24b0: 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59   define O_BINARY
24c0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
24d0: 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61   The threadid ma
24e0: 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20  cro resolves to 
24f0: 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72  the thread-id or
2500: 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72   to 0.  Used for
2510: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
2520: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
2530: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
2540: 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65  READSAFE.#define
2550: 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61   threadid pthrea
2560: 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23  d_self().#else.#
2570: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
2580: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2590: 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73  Different Unix s
25a0: 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f  ystems declare o
25b0: 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65  pen() in differe
25c0: 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75  nt ways.  Same u
25d0: 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74  se.** open(const
25e0: 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f   char*,int,mode_
25f0: 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20  t).  Others use 
2600: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
2610: 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68  ,int,...)..** Th
2620: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  e difference is 
2630: 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75  important when u
2640: 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  sing a pointer t
2650: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  o the function..
2660: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74  **.** The safest
2670: 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74   way to deal wit
2680: 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  h the problem is
2690: 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74   to always use t
26a0: 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77  his wrapper.** w
26b0: 68 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20  hich always has 
26c0: 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65  the same well-de
26d0: 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e  fined interface.
26e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26f0: 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63  osixOpen(const c
2700: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
2710: 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29  flags, int mode)
2720: 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28  {.  return open(
2730: 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f  zFile, flags, mo
2740: 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  de);.}../* Forwa
2750: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
2760: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
2770: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
2780: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a  har*, int*);../*
2790: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
27a0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
27b0: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
27c0: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
27d0: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
27e0: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
27f0: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
2800: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
2810: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
2820: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
2830: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
2840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
2850: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
2860: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
2870: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
2880: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
2890: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
28a0: 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c  ruct unix_syscal
28b0: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
28c0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
28d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
28e0: 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f  he sytem call */
28f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2900: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
2910: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
2920: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
2930: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
2940: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
2950: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
2960: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
2970: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b  yscall[] = {.  {
2980: 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20   "open",        
2990: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
29a0: 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c  l_ptr)posixOpen,
29b0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
29c0: 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e  osOpen      ((in
29d0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
29e0: 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61  ,int,int))aSysca
29f0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
2a00: 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20  .  { "close",   
2a10: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2a20: 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c  scall_ptr)close,
2a30: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2a40: 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20  ine osClose     
2a50: 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53  ((int(*)(int))aS
2a60: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
2a70: 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73  nt)..  { "access
2a80: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2a90: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63  3_syscall_ptr)ac
2aa0: 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a  cess,     0  },.
2ab0: 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73  #define osAccess
2ac0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
2ad0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53  st char*,int))aS
2ae0: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
2af0: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64  nt)..  { "getcwd
2b00: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2b10: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
2b20: 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  tcwd,     0  },.
2b30: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64  #define osGetcwd
2b40: 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63      ((char*(*)(c
2b50: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
2b60: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
2b70: 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20  t)..  { "stat", 
2b80: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2b90: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61  _syscall_ptr)sta
2ba0: 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  t,       0  },.#
2bb0: 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20  define osStat   
2bc0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2bd0: 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73  t char*,struct s
2be0: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34  tat*))aSyscall[4
2bf0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a  ].pCurrent)../*.
2c00: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
2c10: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
2c20: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
2c30: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
2c40: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
2c50: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
2c60: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
2c70: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
2c80: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
2c90: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
2ca0: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2cb0: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
2cc0: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
2cd0: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
2ce0: 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64   is DOS - what d
2cf0: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
2d00: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
2d10: 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20  __.  { "fstat", 
2d20: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
2d30: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2d40: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28  #define osFstat(
2d50: 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73  a,b,c)    0.#els
2d60: 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61  e     .  { "fsta
2d70: 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  t",        (sqli
2d80: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2d90: 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d  fstat,      0  }
2da0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
2db0: 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  t     ((int(*)(i
2dc0: 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  nt,struct stat*)
2dd0: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
2de0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20  rrent).#endif.. 
2df0: 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20   { "ftruncate", 
2e00: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2e10: 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74  all_ptr)ftruncat
2e20: 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  e,  0  },.#defin
2e30: 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28  e osFtruncate ((
2e40: 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74  int(*)(int,off_t
2e50: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
2e60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
2e70: 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71  ntl",        (sq
2e80: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2e90: 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20  r)fcntl,      0 
2ea0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
2eb0: 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ntl     ((int(*)
2ec0: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
2ed0: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
2ee0: 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c  nt)..  { "read",
2ef0: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2f00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65  3_syscall_ptr)re
2f10: 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  ad,       0  },.
2f20: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20  #define osRead  
2f30: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
2f40: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
2f50: 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  t))aSyscall[8].p
2f60: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2f70: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
2f80: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
2f90: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2fa0: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
2fb0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2fc0: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20  call_ptr)pread, 
2fd0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
2fe0: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
2ff0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3000: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3010: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3020: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
3030: 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ad     ((ssize_t
3040: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
3050: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
3060: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
3070: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3080: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
3090: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
30a0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
30b0: 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20  _ptr)pread64,   
30c0: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
30d0: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
30e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
30f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3100: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
3110: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34  define osPread64
3120: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3130: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3140: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
3150: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
3160: 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20    { "write",    
3170: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3180: 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20  call_ptr)write, 
3190: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
31a0: 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28  ne osWrite     (
31b0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
31c0: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
31d0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d  _t))aSyscall[11]
31e0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
31f0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3200: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
3210: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3220: 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  E.  { "pwrite", 
3230: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3240: 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74  yscall_ptr)pwrit
3250: 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  e,     0  },.#el
3260: 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  se.  { "pwrite",
3270: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3280: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3290: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
32a0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
32b0: 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65  write    ((ssize
32c0: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
32d0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
32e0: 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20  _t))\.          
32f0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
3300: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
3310: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
3320: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
3330: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
3340: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3350: 70 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20  ptr)pwrite64,   
3360: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3370: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
3380: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3390: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
33a0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
33b0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34  efine osPwrite64
33c0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
33d0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
33e0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e     aSyscall[13].
3410: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
3420: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3430: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3440: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
3450: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3460: 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20  ptr)fchmod,     
3470: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3480: 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20  "fchmod",       
3490: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
34a0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
34b0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
34c0: 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20  efine osFchmod  
34d0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d    ((int(*)(int,m
34e0: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
34f0: 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  14].pCurrent)..#
3500: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
3510: 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
3520: 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
3530: 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61  ALLOCATE.  { "fa
3540: 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71  llocate",    (sq
3550: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3560: 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  r)posix_fallocat
3570: 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  e,  0 },.#else. 
3580: 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20   { "fallocate", 
3590: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
35a0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
35b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
35c0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
35d0: 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28  Fallocate ((int(
35e0: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66  *)(int,off_t,off
35f0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d  _t))aSyscall[15]
3600: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3610: 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20  "unlink",       
3620: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3630: 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20  _ptr)unlink,    
3640: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
3650: 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20  ine osUnlink    
3660: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
3670: 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  har*))aSyscall[1
3680: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3690: 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  { "openDirectory
36a0: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
36b0: 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44  yscall_ptr)openD
36c0: 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30  irectory,      0
36d0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
36e0: 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e  enDirectory ((in
36f0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3700: 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  ,int*))aSyscall[
3710: 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  17].pCurrent)..}
3720: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
3730: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
3740: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
3750: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
3760: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
3770: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
3780: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
3790: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
37a0: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
37b0: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
37c0: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
37d0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
37e0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
37f0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
3800: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
3810: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
3820: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
3830: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
3840: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
3850: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
3860: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
3870: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
3880: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
3890: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
38a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
38b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
38c0: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
38d0: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
38e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
38f0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
3900: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
3910: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
3920: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
3930: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
3940: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3950: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
3960: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
3970: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
3980: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
3990: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
39a0: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
39b0: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
39c0: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
39d0: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
39e0: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
39f0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
3a00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3a10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
3a20: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
3a30: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
3a40: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
3a50: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
3a60: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
3a70: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
3a80: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
3a90: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
3aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
3ac0: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
3ad0: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
3ae0: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
3af0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
3b00: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
3b10: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
3b20: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
3b30: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
3b40: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
3b50: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
3b60: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
3b70: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
3b80: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
3b90: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
3ba0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
3bb0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
3bc0: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
3bd0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
3be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
3bf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3c00: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
3c10: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
3c20: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
3c30: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
3c40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3c50: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
3c60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3c80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
3c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3ca0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
3cb0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
3cc0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
3cd0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
3ce0: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
3cf0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
3d00: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
3d10: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
3d20: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
3d30: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
3d40: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
3d50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
3d60: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
3d70: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
3d80: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
3d90: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
3da0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
3db0: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
3dc0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
3dd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
3de0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
3df0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
3e00: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
3e10: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
3e20: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
3e30: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
3e40: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
3e50: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
3e60: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
3e70: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
3e80: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
3e90: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
3ea0: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
3eb0: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
3ec0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
3ed0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
3ee0: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
3ef0: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
3f00: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
3f10: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
3f20: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
3f30: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
3f40: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
3f50: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
3f60: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
3f70: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
3f80: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
3f90: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
3fa0: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
3fb0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
3fc0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
3fd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3fe0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
3ff0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
4000: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4010: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4020: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
4030: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4040: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
4050: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
4060: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
4070: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4080: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
4090: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
40a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
40b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  ;.}../*.** Retry
40c0: 20 6f 70 65 6e 28 29 20 63 61 6c 6c 73 20 74 68   open() calls th
40d0: 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45  at fail due to E
40e0: 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69  INTR.*/.static i
40f0: 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63  nt robust_open(c
4100: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
4110: 74 20 66 2c 20 69 6e 74 20 6d 29 7b 0a 20 20 69  t f, int m){.  i
4120: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
4130: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b  = osOpen(z,f,m);
4140: 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
4150: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
4160: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4170: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
4180: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
4190: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
41a0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
41b0: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
41c0: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
41d0: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e  o protect the un
41e0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a  ixInodeInfo and.
41f0: 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ** vxworksFileId
4200: 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
4210: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
4220: 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
4230: 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75  .** shared by mu
4240: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
4250: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75  **.** Function u
4260: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
4270: 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
4280: 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
4290: 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
42a0: 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
42b0: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
42c0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
42d0: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
42e0: 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
42f0: 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
4300: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
4310: 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
4320: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
4330: 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  );.**   unixEnte
4340: 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74  rLeave().*/.stat
4350: 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65  ic void unixEnte
4360: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
4370: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
4380: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
4390: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
43a0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
43b0: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
43c0: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
43d0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
43e0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
43f0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
4400: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
4410: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
4420: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4430: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75  BUG.static int u
4440: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  nixMutexHeld(voi
4450: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
4460: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4470: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
4480: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
4490: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
44a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64  .}.#endif...#ifd
44b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
44c0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
44d0: 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69  ction for printi
44e0: 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66  ng out trace inf
44f0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65  ormation from de
4500: 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72  bugging.** binar
4510: 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e  ies. This return
4520: 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  s the string rep
4530: 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  resetation of th
4540: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
4550: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
4560: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4570: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
4580: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
4590: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
45a0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
45b0: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
45c0: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
45d0: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
45e0: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
45f0: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
4600: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
4610: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
4620: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
4630: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
4640: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
4650: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
4660: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
4670: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
4680: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
4690: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
46a0: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
46b0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
46c0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
46d0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
46e0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
46f0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4700: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
4710: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
4720: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
4730: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
4740: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
4750: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
4760: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
4770: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
4780: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
4790: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
47a0: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
47b0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
47c0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
47d0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
47e0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
47f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
4800: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
4810: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
4820: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
4830: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
4840: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
4850: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
4860: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
4870: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
4880: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
4890: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
48a0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
48b0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
48c0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
48d0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
48e0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
48f0: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
4900: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
4910: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
4920: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
4930: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
4940: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
4950: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
4960: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
4970: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
4980: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
4990: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
49a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
49b0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
49c0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
49d0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
49e0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
49f0: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
4a00: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
4a10: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4a20: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
4a30: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
4a40: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
4a50: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
4a60: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
4a70: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
4a80: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
4a90: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
4aa0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
4ab0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
4ac0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
4ad0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
4ae0: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
4af0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
4b00: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
4b10: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
4b20: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
4b30: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4b40: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
4b50: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
4b60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4b70: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
4b80: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4b90: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
4ba0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
4bb0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
4bc0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
4bd0: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
4be0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
4bf0: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
4c00: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4c10: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
4c20: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
4c30: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
4c40: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
4c50: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
4c60: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
4c70: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
4c80: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
4c90: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
4ca0: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
4cb0: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
4cc0: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
4cd0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
4ce0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
4cf0: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
4d00: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
4d10: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
4d20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
4d30: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
4d40: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
4d50: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
4d60: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
4d70: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
4d80: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
4d90: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
4da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4db0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4dc0: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
4dd0: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
4de0: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
4df0: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
4e00: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
4e10: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
4e20: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
4e30: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
4e40: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
4e50: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
4e60: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
4e70: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
4e80: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
4e90: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
4ea0: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
4eb0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
4ec0: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
4ed0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
4ee0: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
4ef0: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
4f00: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
4f10: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
4f20: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
4f30: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
4f40: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
4f50: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
4f60: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
4f70: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
4f80: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
4f90: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
4fa0: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
4fb0: 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28  rr) {.  switch (
4fc0: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69  posixError) {.#i
4fd0: 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  f 0.  /* At one 
4fe0: 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20  point this code 
4ff0: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65  was not commente
5000: 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79  d out. In theory
5010: 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  , this branch.  
5020: 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ** should never 
5030: 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20  be hit, as this 
5040: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
5050: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
5060: 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  fter.  ** a lock
5070: 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63  ing-related func
5080: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c  tion (i.e. fcntl
5090: 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64  ()) has returned
50a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20   non-zero with. 
50b0: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
50c0: 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69   errno as the fi
50d0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69  rst argument. Si
50e0: 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c  nce a system cal
50f0: 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20  l has failed,.  
5100: 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20  ** errno should 
5110: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a  be non-zero..  *
5120: 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74  *.  ** Despite t
5130: 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65  his, if errno re
5140: 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65  ally is zero, we
5150: 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e   still don't wan
5160: 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  t to return.  **
5170: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
5180: 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c  system call fail
5190: 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53  ed, and *some* S
51a0: 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75  QLite error shou
51b0: 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61  ld be.  ** propa
51c0: 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68  gated back to th
51d0: 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e  e caller. Commen
51e0: 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68  ting this branch
51f0: 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f   out means errno
5200: 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ==0.  ** will be
5210: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
5220: 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20  "default:" case 
5230: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  below..  */.  ca
5240: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
5250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
5260: 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41  dif..  case EAGA
5270: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
5280: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
5290: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
52a0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
52b0: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
52c0: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
52d0: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
52e0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
52f0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
5300: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
5310: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
5320: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
5330: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
5340: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
5350: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
5360: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
5370: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
5380: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
5390: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
53a0: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
53b0: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
53c0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
53d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
53e0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
53f0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
5400: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  _UNLOCK) || ..(s
5410: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
5420: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
5430: 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f  K) ||..(sqliteIO
5440: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
5450: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
5460: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
5470: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5480: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
5490: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
54a0: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
54b0: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
54c0: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
54d0: 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69   .  /* EDEADLK i
54e0: 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
54f0: 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e  if a call to fcn
5500: 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20  tl(F_SETLKW) is 
5510: 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74  made. And.  ** t
5520: 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72  his module never
5530: 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61   makes such a ca
5540: 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65  ll. And the code
5550: 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c   in SQLite itsel
5560: 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20  f .  ** asserts 
5570: 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52  that SQLITE_IOER
5580: 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76  R_BLOCKED is nev
5590: 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72  er returned. For
55a0: 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20   these reasons. 
55b0: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73   ** this case is
55c0: 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
55d0: 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74  out. If the syst
55e0: 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e  em does set errn
55f0: 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20  o to EDEADLK,.  
5600: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53  ** the default S
5610: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
5620: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74  code will be ret
5630: 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a  urned. */.#if 0.
5640: 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a    case EDEADLK:.
5650: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5660: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b  E_IOERR_BLOCKED;
5670: 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
5680: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
5690: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
56a0: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
56b0: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
56c0: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
56d0: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
56e0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
56f0: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
5700: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
5710: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
5720: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
5730: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
5740: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
5750: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
5760: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
5770: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
5780: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
5790: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
57a0: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
57b0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
57c0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
57d0: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
57e0: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
57f0: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
5800: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
5810: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
5820: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
5830: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66  case ENOENT:.#if
5840: 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20  def ESTALE      
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5860: 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20  * ESTALE is not 
5870: 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72  defined on Inter
5880: 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ix systems */.  
5890: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e  case ESTALE:.#en
58a0: 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  dif.  case ENOSY
58b0: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
58c0: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
58d0: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
58e0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
58f0: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
5900: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
5910: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
5920: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a  rr;.  }.}..../**
5930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
5980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
5990: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
59a0: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
59b0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
59d0: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
59e0: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
59f0: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
5a00: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
5a10: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
5a20: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
5a30: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
5a40: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
5a50: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
5a60: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
5a70: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
5a80: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
5a90: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
5aa0: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
5ab0: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
5ac0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
5ad0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
5ae0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
5af0: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
5b00: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
5b10: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
5b20: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
5b30: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
5b40: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
5b50: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
5b60: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
5b70: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
5b80: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5b90: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
5ba0: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
5bb0: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
5bc0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
5bd0: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
5be0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
5bf0: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
5c00: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
5c10: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
5c20: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
5c30: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
5c40: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
5c50: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
5c60: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
5c70: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
5c80: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
5c90: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
5ca0: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
5cb0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
5cc0: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
5cd0: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
5ce0: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
5cf0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d10: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
5d20: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
5d30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
5d60: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
5d70: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
5d80: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
5d90: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
5da0: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
5db0: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
5dc0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
5dd0: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
5de0: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
5df0: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
5e00: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
5e10: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
5e20: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
5e30: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
5e40: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
5e50: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
5e60: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
5e70: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
5e80: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
5e90: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
5ea0: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
5eb0: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
5ec0: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
5ed0: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
5ee0: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
5ef0: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
5f00: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
5f10: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
5f20: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
5f30: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
5f40: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
5f50: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
5f60: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
5f70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
5f80: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
5f90: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
5fa0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5fb0: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
5fc0: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
5fd0: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
5fe0: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
5ff0: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
6000: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
6010: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
6020: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
6030: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
6040: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
6050: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
6060: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
6070: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
6080: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
6090: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
60a0: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
60b0: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
60c0: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
60d0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
60e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
60f0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
6100: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
6110: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
6120: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6130: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
6140: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
6150: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
6160: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
6170: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
6180: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
61a0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
61b0: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
61c0: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
61d0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
61e0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
61f0: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
6200: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
6210: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
6220: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
6230: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
6240: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
6250: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
6260: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
6270: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
6280: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
6290: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
62a0: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
62b0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
62c0: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
62d0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
62e0: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
62f0: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
6300: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
6310: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6320: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
6330: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6340: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
6350: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6360: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
6370: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
6380: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
6390: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
63a0: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
63b0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
63c0: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
63d0: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
63e0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
63f0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6400: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
6410: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
6420: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
6430: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
6440: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6460: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
6470: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
6480: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
6490: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
64a0: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
64b0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
64c0: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
64d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
64e0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
64f0: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
6500: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
6510: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
6520: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
6530: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
6540: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
6550: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
6560: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
6570: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
6580: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
6590: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
65a0: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
65b0: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
65c0: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
65d0: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
65e0: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
65f0: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
6600: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
6610: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
6620: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6630: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
6640: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
6650: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
6660: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
6670: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
6680: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
6690: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
66a0: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
66b0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
66c0: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
66d0: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
66e0: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
66f0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
6700: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6710: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
6720: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
6730: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
6740: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
6750: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
6760: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
6770: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
6780: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
6790: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
67a0: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
67b0: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
67c0: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
67d0: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
67e0: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
67f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
6800: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
6810: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
6820: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
6830: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
6840: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6850: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
6860: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
6870: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
6880: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6890: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
68a0: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
68b0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
68c0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
68d0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
68e0: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
68f0: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
6900: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
6910: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
6920: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
6930: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
6940: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
6950: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
6960: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
6970: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
6980: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
6990: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
69a0: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
69b0: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
69c0: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
69d0: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
69e0: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
69f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
6a00: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
6a10: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
6a20: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
6a30: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
6a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
6a50: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
6a60: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
6a70: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
6b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b40: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
6b50: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
6b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
6b80: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
6b90: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
6ba0: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
6bb0: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
6bc0: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
6bd0: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
6be0: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
6bf0: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
6c00: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
6c10: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
6c20: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
6c30: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
6c40: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
6c50: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
6c60: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
6c70: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
6c80: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
6c90: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
6ca0: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
6cb0: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
6cc0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
6cd0: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
6ce0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
6cf0: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
6d00: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
6d10: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
6d20: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
6d30: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
6d40: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
6d50: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
6d60: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
6d70: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
6d80: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
6d90: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
6da0: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
6db0: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
6dc0: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
6dd0: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
6de0: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
6df0: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
6e00: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
6e10: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
6e20: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
6e30: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
6e40: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
6e50: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
6e60: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
6e70: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
6e80: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
6e90: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
6ea0: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
6eb0: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
6ec0: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
6ed0: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
6ee0: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
6ef0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
6f00: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
6f10: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
6f20: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
6f30: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
6f40: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
6f50: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
6f60: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
6f70: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
6f80: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
6f90: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
6fa0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
6fb0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
6fc0: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
6fd0: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
6fe0: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
6ff0: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
7000: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
7010: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
7020: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
7030: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
7040: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
7050: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
7060: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
7070: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
7080: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
7090: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
70a0: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
70b0: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
70c0: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
70d0: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
70e0: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
70f0: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
7100: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
7110: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
7120: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
7130: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
7140: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
7150: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
7160: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
7170: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
7180: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
7190: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
71a0: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
71b0: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
71c0: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
71d0: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
71e0: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
71f0: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
7200: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
7210: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
7220: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
7230: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
7240: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
7250: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
7260: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
7270: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
7280: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
7290: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
72a0: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
72b0: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
72c0: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
72d0: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
72e0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
72f0: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
7300: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
7310: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
7320: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
7330: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
7340: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
7350: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
7360: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
7370: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
7380: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
7390: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
73a0: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
73b0: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
73c0: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
73d0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
73e0: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
73f0: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
7400: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
7410: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
7420: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
7430: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
7440: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7450: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
7460: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
7470: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
7480: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
7490: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
74a0: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
74b0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
74c0: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
74d0: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
74e0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
74f0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
7500: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
7510: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
7520: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
7530: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
7540: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
7550: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
7560: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
7570: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
7580: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
7590: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
75a0: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
75b0: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
75c0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
75d0: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
75e0: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
75f0: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
7600: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
7610: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
7620: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
7630: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
7640: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
7650: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
7660: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
7670: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
7680: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
7690: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
76a0: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
76b0: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
76c0: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
76d0: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
76e0: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
76f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
7700: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
7710: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
7720: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
7730: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
7740: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
7750: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
7760: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
7770: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
7780: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
7790: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
77a0: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
77b0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
77c0: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
77d0: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
77e0: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
77f0: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
7800: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
7810: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
7820: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
7830: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
7840: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
7850: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
7860: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
7870: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
7880: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
7890: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
78a0: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
78b0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
78c0: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
78d0: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
78e0: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
78f0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
7900: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
7910: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
7920: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
7930: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
7940: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
7950: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
7960: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
7970: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
7980: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
7990: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
79a0: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
79b0: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
79c0: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
79d0: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
79e0: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
79f0: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
7a00: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
7a10: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
7a20: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
7a30: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
7a40: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
7a50: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
7a60: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
7a70: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
7a80: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
7a90: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
7aa0: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
7ab0: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
7ac0: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
7ad0: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
7ae0: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
7af0: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
7b00: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
7b10: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
7b20: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
7b30: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
7b40: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
7b50: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
7b60: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
7b70: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
7b80: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
7b90: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
7ba0: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
7bb0: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
7bc0: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
7bd0: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
7be0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
7bf0: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
7c00: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
7c10: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
7c20: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
7c30: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
7c40: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
7c50: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
7c60: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
7c70: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
7c80: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
7c90: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
7ca0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
7cb0: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
7cc0: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
7cd0: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
7ce0: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
7cf0: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
7d00: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
7d10: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
7d20: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
7d30: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
7d40: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
7d50: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
7d60: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
7d70: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
7d80: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
7d90: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
7da0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
7db0: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
7dc0: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
7dd0: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
7de0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
7df0: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
7e00: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
7e10: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
7e20: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
7e30: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
7e40: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
7e50: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
7e60: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
7e70: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
7e80: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
7e90: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
7ea0: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
7ed0: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
7ee0: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
7ef0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
7f00: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
7f10: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
7f20: 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74  */.#else.  ino_t
7f30: 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20   ino;           
7f40: 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20         /* Inode 
7f50: 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66  number */.#endif
7f60: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
7f70: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
7f80: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
7f90: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  e is allocated f
7fa0: 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20  or each open.** 
7fb0: 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c  inode.  Or, on L
7fc0: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65  inuxThreads, the
7fd0: 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  re is one of the
7fe0: 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  se structures fo
7ff0: 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20  r.** each inode 
8000: 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74  opened by each t
8010: 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  hread..**.** A s
8020: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
8030: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
8040: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
8050: 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  so each unixFile
8060: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f  .** structure co
8070: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
8080: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
8090: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61  of this object a
80a0: 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63  nd this.** objec
80b0: 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20  t keeps a count 
80c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
80d0: 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69   unixFile pointi
80e0: 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72  ng to it..*/.str
80f0: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
8100: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
8110: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
8120: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
8130: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
8140: 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   nShared;       
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8160: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
8170: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
8180: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65   unsigned char e
8190: 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  FileLock;       
81a0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
81b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
81c0: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
81d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50  unsigned char bP
81e0: 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20  rocessLock;     
81f0: 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20  /* An exclusive 
8200: 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20  process lock is 
8210: 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  held */.  int nR
8220: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
8230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8240: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
8250: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
8260: 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  e */.  unixShmNo
8270: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
8280: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
8290: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
82a0: 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f  ed with this ino
82b0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63  de */.  int nLoc
82c0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
82d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
82e0: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
82f0: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20   file locks */. 
8300: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
8310: 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20  Unused;         
8320: 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20   /* Unused file 
8330: 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63  descriptors to c
8340: 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  lose */.  unixIn
8350: 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20  odeInfo *pNext; 
8360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
8370: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  t of all unixIno
8380: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  deInfo objects *
8390: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
83a0: 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20  o *pPrev;       
83b0: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
83c0: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
83d0: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
83e0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
83f0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
8400: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
8410: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
8420: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
8430: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ck */.#endif.#if
8440: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
8450: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8470: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
8480: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
8490: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
84a0: 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e  THNAME+2];  /* N
84b0: 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61  ame of that sema
84c0: 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  phore */.#endif.
84d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  };../*.** A list
84e0: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  s of all unixIno
84f0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a  deInfo objects..
8500: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e  */.static unixIn
8510: 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69  odeInfo *inodeLi
8520: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a  st = 0;../*.**.*
8530: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8540: 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78  - unixLogError_x
8550: 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  (), is only ever
8560: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
8570: 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67  macro.** unixLog
8580: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Error()..**.** I
8590: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  t is invoked aft
85a0: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
85b0: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
85c0: 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68  tion and errno h
85d0: 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20  as been.** set. 
85e0: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
85f0: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
8600: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
8610: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
8620: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61  ue of.** errno a
8630: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
8640: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
8650: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
8660: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
8670: 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  r.** strerror_r(
8680: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  )..**.** The fir
8690: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
86a0: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
86b0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
86c0: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
86d0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
86e0: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
86f0: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
8700: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
8710: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
8720: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
8730: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
8740: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
8750: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
8760: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28  that.** failed (
8770: 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22  e.g. "unlink", "
8780: 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74  open") and the t
8790: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
87a0: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
87b0: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
87c0: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
87d0: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
87e0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
87f0: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
8800: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8810: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
8820: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
8850: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
8860: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
8870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8880: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
8890: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
88a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
88b0: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
88c0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
88d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
88e0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
88f0: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
8900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8910: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
8920: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
8930: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
8940: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8960: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
8970: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
8980: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
8990: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
89c0: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
89d0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
89e0: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
89f0: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
8a00: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
8a10: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
8a20: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
8a30: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
8a40: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
8a50: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
8a60: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
8a70: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
8a80: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
8a90: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
8aa0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8ab0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
8ac0: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
8ad0: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
8ae0: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
8af0: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
8b00: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
8b10: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
8b20: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
8b30: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
8b40: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
8b50: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
8b60: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
8b70: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
8b80: 73 20 74 68 65 20 74 68 65 20 47 4e 55 20 76 65  s the the GNU ve
8b90: 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f  rsion of strerro
8ba0: 72 5f 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a  r_r() that .  **
8bb0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
8bc0: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
8bd0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
8be0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
8bf0: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
8c00: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
8c10: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
8c20: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
8c30: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
8c40: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
8c50: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
8c60: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
8c70: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
8c80: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
8c90: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
8ca0: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
8cb0: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
8cc0: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
8cd0: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
8ce0: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
8cf0: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
8d00: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
8d10: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
8d20: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
8d30: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
8d40: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
8d50: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
8d60: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
8d70: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
8d80: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
8d90: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
8da0: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
8db0: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
8dc0: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
8dd0: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
8de0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
8df0: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
8e00: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
8e10: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
8e20: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
8e30: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
8e40: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
8e50: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
8e60: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
8e70: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
8e80: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
8e90: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
8ea0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
8eb0: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
8ec0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
8ed0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
8ee0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
8ef0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
8f00: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
8f10: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
8f20: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
8f30: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
8f40: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
8f50: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
8f60: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
8f70: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
8f80: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
8f90: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
8fa0: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
8fb0: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
8fc0: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
8fd0: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
8fe0: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
8ff0: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
9000: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
9010: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
9020: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
9030: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
9040: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
9050: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
9060: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
9070: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
9080: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
9090: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
90a0: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
90b0: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
90c0: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
90d0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
90e0: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
90f0: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
9100: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
9110: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
9120: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
9130: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
9140: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
9150: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
9160: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
9170: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
9180: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
9190: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
91a0: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
91b0: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
91c0: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
91d0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
91e0: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
91f0: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
9200: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
9210: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
9220: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
9230: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
9260: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
9270: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
9280: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
9290: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
92a0: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
92b0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
92c0: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
92d0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
92e0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
92f0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
9300: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9310: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
9320: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
9330: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
9340: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
9350: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
9360: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
9370: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
9380: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
9390: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
93a0: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
93b0: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
93c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
93d0: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
93e0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
93f0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
9400: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
9410: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
9420: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
9430: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
9440: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
9450: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
9460: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
9470: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
9480: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
9490: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
94a0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
94b0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
94c0: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
94d0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
94e0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
94f0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9500: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
9510: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
9520: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
9530: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
9540: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
9550: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
9560: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
9570: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
9580: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
9590: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
95a0: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
95b0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
95c0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
95d0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
95e0: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
95f0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
9600: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
9610: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
9620: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
9630: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9640: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
9650: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
9660: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
9670: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
9680: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
9690: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
96a0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
96b0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
96c0: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
96d0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
96e0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
96f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
9700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
9710: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
9720: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9730: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
9740: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
9750: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9760: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
9770: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
9780: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
9790: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
97a0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
97b0: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
97c0: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75  value might be u
97d0: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
97e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
97f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
9800: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
9810: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
9820: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
9830: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
9840: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
9850: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
9860: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
9870: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
9880: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9890: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
98a0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
98b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
98c0: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
98d0: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
98e0: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
98f0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9900: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
9910: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
9920: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
9930: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
9940: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
9970: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9980: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99a0: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
99b0: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
99c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
99d0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
99e0: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
99f0: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
9a00: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
9a10: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
9a20: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
9a30: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
9a40: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
9a50: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
9a60: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
9a70: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
9a80: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
9a90: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
9aa0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
9ab0: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
9ac0: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
9ad0: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
9ae0: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
9af0: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
9b00: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
9b10: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
9b20: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
9b30: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
9b40: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
9b50: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
9b60: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9b70: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
9b80: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
9b90: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
9ba0: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
9bb0: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
9bc0: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
9bd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9be0: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
9bf0: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
9c00: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
9c10: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
9c20: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
9c30: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
9c40: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
9c50: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
9c60: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
9c70: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
9c80: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
9c90: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
9ca0: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
9cb0: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
9cc0: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
9cd0: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
9ce0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
9cf0: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
9d00: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
9d10: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
9d20: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
9d30: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
9d40: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
9d50: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
9d60: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
9d70: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
9d80: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
9d90: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
9da0: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
9db0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
9dc0: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
9dd0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
9de0: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
9df0: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
9e00: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
9e10: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
9e20: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
9e30: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
9e40: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
9e50: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
9e60: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
9e70: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
9e80: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
9e90: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
9ea0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
9eb0: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
9ec0: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
9ed0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
9ee0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
9ef0: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
9f00: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
9f10: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
9f20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9f30: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
9f40: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
9f50: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
9f60: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
9f70: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9f80: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
9f90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9fa0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
9fb0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
9fc0: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
9fd0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
9fe0: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
9ff0: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
a000: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
a010: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
a020: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
a030: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74   fileId.ino = st
a040: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
a050: 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ndif.  pInode = 
a060: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  inodeList;.  whi
a070: 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65  le( pInode && me
a080: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
a090: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73  Inode->fileId, s
a0a0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29  izeof(fileId)) )
a0b0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70  {.    pInode = p
a0c0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a0d0: 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d  }.  if( pInode==
a0e0: 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  0 ){.    pInode 
a0f0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
a100: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
a110: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
a120: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
a130: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a140: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
a150: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
a160: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
a170: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
a180: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
a190: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
a1a0: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
a1b0: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
a1c0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
a1d0: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
a1e0: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
a1f0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
a200: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
a210: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
a220: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
a230: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
a240: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
a250: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
a260: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
a270: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a280: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
a290: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
a2a0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
a2b0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
a2c0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
a2d0: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
a2e0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
a2f0: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
a300: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
a310: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
a320: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
a330: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
a340: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
a350: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
a360: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
a370: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
a380: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
a390: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
a3a0: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
a3b0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
a3c0: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
a3d0: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
a3e0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
a3f0: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
a400: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a410: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
a420: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
a430: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
a440: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
a450: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
a460: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
a470: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
a480: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
a490: 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45  pFile );.  unixE
a4a0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
a4b0: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
a4c0: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
a4d0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
a4e0: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  /..  /* Check if
a4f0: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
a500: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
a510: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
a520: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
a530: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
a540: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
a550: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
a560: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
a570: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
a580: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
a590: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ds it..  */.#ifn
a5a0: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
a5b0: 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26  if( !reserved &&
a5c0: 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d   !pFile->pInode-
a5d0: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b  >bProcessLock ){
a5e0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
a5f0: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b  k lock;.    lock
a600: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
a610: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
a620: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
a630: 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  D_BYTE;.    lock
a640: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20  .l_len = 1;.    
a650: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a660: 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f  WRLCK;.    if( o
a670: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
a680: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
a690: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
a6a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
a6b0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
a6c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
a6d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
a6e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
a6f0: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
a700: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
a710: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
a720: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
a730: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
a740: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
a750: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
a760: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
a770: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
a780: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
a790: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
a7a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a7b0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
a7c0: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
a7d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
a7e0: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
a7f0: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
a800: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
a810: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
a820: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
a830: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
a840: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
a850: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
a860: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
a870: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
a880: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
a890: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
a8a0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
a8b0: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
a8c0: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
a8d0: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
a8e0: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
a8f0: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
a900: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
a910: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
a920: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
a930: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
a940: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
a950: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
a960: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
a970: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
a980: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
a990: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
a9a0: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
a9b0: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
a9c0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
a9d0: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
a9e0: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
a9f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
aa00: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
aa10: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
aa20: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
aa30: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
aa40: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
aa50: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
aa60: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
aa70: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
aa80: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
aa90: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
aaa0: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
aab0: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
aac0: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
aad0: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
aae0: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
aaf0: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
ab00: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
ab10: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
ab20: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
ab30: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
ab40: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
ab50: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
ab60: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
ab70: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
ab80: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
ab90: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
aba0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
abb0: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
abc0: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
abd0: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
abe0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
abf0: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
ac00: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
ac10: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
ac20: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
ac30: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
ac40: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
ac50: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
ac60: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
ac70: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
ac80: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
ac90: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
aca0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
acb0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
acc0: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
acd0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ace0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
acf0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
ad00: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
ad10: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
ad20: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
ad30: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
ad40: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
ad50: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
ad60: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
ad70: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
ad80: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
ad90: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
ada0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
adb0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
adc0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
add0: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
ade0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
adf0: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
ae00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ae10: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
ae20: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
ae30: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
ae40: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
ae50: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
ae60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
ae70: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
ae80: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
ae90: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
aea0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
aeb0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
aec0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
aed0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
aee0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
aef0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
af00: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
af10: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
af20: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
af30: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
af40: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
af50: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
af60: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
af70: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
af80: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
af90: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
afa0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
afb0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
afc0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
afd0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
afe0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
aff0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
b000: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
b010: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
b020: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
b030: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
b040: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
b050: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
b060: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
b070: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
b080: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
b090: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
b0a0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
b0b0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
b0c0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
b0d0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
b0e0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
b0f0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
b100: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
b110: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
b120: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
b130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b140: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
b150: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
b160: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
b170: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
b180: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
b190: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b1a0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
b1b0: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
b1c0: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
b1d0: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
b1e0: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
b1f0: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
b200: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
b210: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
b220: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
b230: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
b240: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
b250: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
b260: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
b270: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
b280: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
b290: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
b2a0: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
b2b0: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
b2c0: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
b2d0: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
b2e0: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
b2f0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
b300: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
b310: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
b320: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
b330: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
b340: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
b350: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
b360: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
b370: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
b380: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
b390: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
b3a0: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
b3b0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
b3c0: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
b3d0: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
b3e0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
b3f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
b400: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
b410: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
b420: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
b430: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
b440: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
b450: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
b460: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
b470: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
b480: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
b490: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
b4a0: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
b4b0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
b4c0: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
b4d0: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
b4e0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
b4f0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b500: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
b510: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
b520: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
b530: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
b540: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
b550: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
b560: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
b570: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
b580: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
b590: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
b5a0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
b5b0: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
b5c0: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
b5d0: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
b5e0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
b5f0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
b600: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
b610: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
b620: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
b630: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
b640: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
b650: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
b660: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
b670: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
b680: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
b690: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
b6a0: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
b6b0: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
b6c0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
b6d0: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
b6e0: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
b6f0: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
b700: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
b710: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
b720: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
b730: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
b740: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
b750: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
b760: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
b770: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
b780: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
b790: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
b7a0: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
b7b0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
b7c0: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
b7d0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b7e0: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
b7f0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
b800: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
b810: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
b820: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
b830: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
b840: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
b850: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
b860: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
b870: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
b880: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
b890: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
b8a0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
b8b0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
b8c0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
b8d0: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
b8e0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
b8f0: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
b900: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
b910: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
b920: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
b930: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
b940: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
b950: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
b960: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
b970: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
b980: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
b990: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
b9a0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
b9b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
b9c0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b9d0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
b9e0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b9f0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
ba00: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
ba10: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
ba20: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
ba30: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
ba40: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
ba50: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
ba60: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
ba70: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
ba80: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
ba90: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
baa0: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
bab0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
bac0: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
bad0: 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
bae0: 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
baf0: 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
bb00: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
bb10: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
bb20: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
bb30: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
bb40: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
bb50: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
bb60: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
bb70: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
bb80: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
bb90: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
bba0: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
bbb0: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
bbc0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
bbd0: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
bbe0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
bbf0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
bc00: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
bc10: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
bc20: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
bc30: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
bc40: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
bc50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc60: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
bc70: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
bc80: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
bc90: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
bca0: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
bcb0: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
bcc0: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
bcd0: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
bce0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
bcf0: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
bd00: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
bd10: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
bd20: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
bd30: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
bd40: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
bd50: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
bd60: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
bd70: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
bd80: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
bd90: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
bda0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
bdb0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
bdc0: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
bdd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
bde0: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
bdf0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
be00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
be10: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
be20: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
be30: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
be40: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
be50: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
be60: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
be70: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
be80: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
be90: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
bea0: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
beb0: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
bec0: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
bed0: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
bee0: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
bef0: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
bf00: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
bf10: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
bf20: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
bf30: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
bf40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
bf50: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
bf60: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
bf70: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
bf80: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
bf90: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
bfa0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
bfb0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
bfc0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
bfd0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
bfe0: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
bff0: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
c000: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
c010: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
c020: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
c030: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
c040: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
c050: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
c060: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c070: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
c080: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
c090: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
c0a0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c0b0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
c0c0: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
c0d0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
c0e0: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
c0f0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
c100: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
c110: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
c120: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
c130: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
c140: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
c150: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
c160: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
c170: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
c180: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
c190: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
c1a0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
c1b0: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
c1c0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
c1d0: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
c1e0: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
c1f0: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
c200: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
c210: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
c220: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
c230: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
c240: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
c250: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
c260: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
c270: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
c280: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
c290: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
c2a0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
c2b0: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
c2c0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
c2d0: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
c2e0: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
c2f0: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
c300: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
c310: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
c320: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
c330: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
c340: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
c350: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
c360: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
c370: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
c380: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
c390: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
c3a0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
c3b0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c3c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
c3d0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
c3e0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
c3f0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
c400: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
c410: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
c420: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
c430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
c440: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
c450: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
c460: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
c470: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
c480: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
c490: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
c4a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
c4b0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
c4c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c4d0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
c4e0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
c4f0: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
c500: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
c510: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
c520: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
c530: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
c540: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
c550: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
c560: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c570: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
c580: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c590: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
c5a0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
c5b0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
c5c0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
c5d0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
c5e0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
c5f0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
c600: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
c610: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
c620: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
c630: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
c640: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
c650: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
c660: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
c670: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
c680: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
c690: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
c6a0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
c6b0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
c6c0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
c6d0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
c6e0: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
c6f0: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
c700: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
c710: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c720: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
c730: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
c740: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
c750: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
c760: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
c770: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c780: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
c790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c7a0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
c7b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c7c0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c7d0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
c7e0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
c7f0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
c800: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
c810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
c820: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
c830: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
c840: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
c850: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
c860: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
c870: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
c880: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
c890: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
c8a0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
c8b0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
c8c0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
c8d0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
c8e0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
c8f0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
c900: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
c910: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
c920: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
c930: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
c940: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
c950: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
c960: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
c970: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
c980: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
c990: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
c9a0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
c9b0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c9c0: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
c9d0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
c9e0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
c9f0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
ca00: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
ca10: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
ca20: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
ca30: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
ca40: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
ca50: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
ca60: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
ca70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
ca80: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
ca90: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
caa0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
cab0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
cac0: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
cad0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
cae0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
caf0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
cb00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cb10: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
cb20: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
cb30: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
cb40: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cb50: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
cb60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cb70: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
cb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cb90: 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44  }.  ..#ifndef ND
cba0: 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70  EBUG.  /* Set up
cbb0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
cbc0: 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20  -counter change 
cbd0: 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77  checking flags w
cbe0: 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74  hen.  ** transit
cbf0: 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48  ioning from a SH
cc00: 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56  ARED to a RESERV
cc10: 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68  ED lock.  The ch
cc20: 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53  ange.  ** from S
cc30: 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
cc40: 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69  D marks the begi
cc50: 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61  nning of a norma
cc60: 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65  l.  ** write ope
cc70: 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f  ration (not a ho
cc80: 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t journal rollba
cc90: 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ck)..  */.  if( 
cca0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
ccb0: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
ccc0: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
ccd0: 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63  K.   && eFileLoc
cce0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
ccf0: 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  .  ){.    pFile-
cd00: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
cd10: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   0;.    pFile->d
cd20: 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
cd30: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
cd40: 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23  Write = 1;.  }.#
cd50: 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63  endif...  if( rc
cd60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
cd70: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
cd80: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
cd90: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
cda0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
cdb0: 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
cdc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
cdd0: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
cde0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
cdf0: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
ce00: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
ce10: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
ce20: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
ce30: 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
ce40: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
ce50: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
ce60: 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
ce70: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
ce80: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
ce90: 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
cea0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
ceb0: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
cec0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ced0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
cee0: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
cef0: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
cf00: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
cf10: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
cf20: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
cf30: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
cf40: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
cf50: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
cf60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
cf70: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
cf80: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
cf90: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55  d *p = pFile->pU
cfa0: 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78  nused;.  p->pNex
cfb0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
cfc0: 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
cfd0: 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
cfe0: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
cff0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  File->pUnused = 
d000: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  0;.}../*.** Lowe
d010: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
d020: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
d030: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
d040: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
d050: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
d060: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
d070: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
d080: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
d090: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
d0a0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
d0b0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
d0c0: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
d0d0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
d0e0: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
d0f0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d100: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64  ..** .** If hand
d110: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74  leNFSUnlock is t
d120: 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77  rue, then on dow
d130: 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c  ngrading an EXCL
d140: 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48  USIVE_LOCK to SH
d150: 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65  ARED.** the byte
d160: 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65   range is divide
d170: 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61  d into 2 parts a
d180: 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72  nd the first par
d190: 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68  t is unlocked th
d1a0: 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72  en.** set to a r
d1b0: 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ead lock, then t
d1c0: 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73  he other part is
d1d0: 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64   simply unlocked
d1e0: 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a  .  This works .*
d1f0: 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69  * around a bug i
d200: 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20  n BSD NFS lockd 
d210: 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61  (also seen on Ma
d220: 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74  cOSX 10.3+) that
d230: 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65   fails to .** re
d240: 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c  move the write l
d250: 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20  ock on a region 
d260: 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
d270: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   is set..*/.stat
d280: 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f  ic int posixUnlo
d290: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
d2a0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
d2b0: 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46  ck, int handleNF
d2c0: 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78  SUnlock){.  unix
d2d0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d2e0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
d2f0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
d300: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
d310: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
d320: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d330: 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73  .  int h;..  ass
d340: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
d350: 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
d360: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
d370: 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
d380: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
d390: 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
d3a0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
d3b0: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
d3c0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
d3d0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
d3e0: 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74  hared,.      get
d3f0: 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
d400: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
d410: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
d420: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d430: 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
d440: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d450: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
d460: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
d470: 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  .  h = pFile->h;
d480: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
d490: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
d4a0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
d4b0: 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
d4c0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d4d0: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
d4e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
d4f0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
d500: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d510: 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65   );.    Simulate
d520: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
d530: 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
d540: 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
d550: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
d560: 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23  rorBenign(0);..#
d570: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
d580: 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
d590: 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
d5a0: 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
d5b0: 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
d5c0: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
d5d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
d5e0: 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
d5f0: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
d600: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
d610: 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
d620: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
d630: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
d640: 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
d650: 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
d660: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
d670: 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
d680: 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
d690: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
d6a0: 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
d6b0: 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
d6c0: 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
d6d0: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
d6e0: 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
d6f0: 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
d700: 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
d710: 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
d720: 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
d730: 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
d740: 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
d750: 2f 0a 23 69 66 20 30 0a 20 20 20 20 61 73 73 65  /.#if 0.    asse
d760: 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
d770: 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
d780: 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
d790: 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
d7a0: 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
d7b0: 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
d7c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 46 69  ;.#endif.    pFi
d7d0: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
d7e0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
d7f0: 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
d800: 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
d810: 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
d820: 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
d830: 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
d840: 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
d850: 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
d860: 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
d870: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
d880: 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
d890: 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
d8a0: 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
d8b0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
d8c0: 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
d8d0: 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
d8e0: 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
d8f0: 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
d900: 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
d910: 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
d920: 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
d930: 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
d940: 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
d950: 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
d960: 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
d970: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
d980: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
d990: 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  {..#if !defined(
d9a0: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
d9b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
d9c0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
d9d0: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
d9e0: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
d9f0: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
da00: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
da10: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
da20: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
da30: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
da40: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
da50: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
da60: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
da70: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
da80: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
da90: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
daa0: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
dab0: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
dac0: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
dad0: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
dae0: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
daf0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
db00: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
db10: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
db20: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
db30: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
db40: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
db50: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
db60: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
db70: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
db80: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
db90: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
dba0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
dbb0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
dbc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
dbd0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  OCK;.          i
dbe0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
dbf0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
dc00: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dc10: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
dc20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dc30: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
dc40: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
dc50: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
dc60: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
dc70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
dc80: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
dc90: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
dca0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
dcb0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
dcc0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
dcd0: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
dce0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
dcf0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
dd00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
dd10: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
dd20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
dd30: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
dd40: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
dd50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
dd60: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
dd70: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
dd80: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
dd90: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dda0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
ddb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ddc0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
ddd0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
dde0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
ddf0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
de00: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
de10: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
de20: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
de30: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
de40: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
de50: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
de60: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
de70: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
de80: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
de90: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
dea0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
deb0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
dec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
ded0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
dee0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
def0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
df00: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
df10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
df20: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
df30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
df40: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
df50: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
df60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
df70: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
df80: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
df90: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
dfa0: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
dfb0: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
dfc0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
dfd0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
dfe0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
dff0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
e000: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e010: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
e020: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
e030: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
e040: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
e050: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
e060: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
e070: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
e080: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
e090: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
e0a0: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
e0b0: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
e0c0: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
e0d0: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
e0e0: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
e0f0: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
e100: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
e110: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
e120: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
e130: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
e140: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
e150: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
e160: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
e170: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
e180: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
e190: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
e1a0: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
e1b0: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
e1c0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
e1d0: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
e1e0: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
e1f0: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
e200: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
e210: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e220: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
e230: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e240: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
e250: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
e260: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
e270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e280: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
e290: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
e2a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e2b0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e2c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e2d0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
e2e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e2f0: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
e300: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
e310: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
e320: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e330: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e340: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
e350: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
e360: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
e370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
e380: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
e390: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  _UNLOCK;.      p
e3a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e3b0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67  = errno;.      g
e3c0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
e3d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e3e0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
e3f0: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
e400: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
e410: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
e420: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
e430: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
e440: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
e450: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
e460: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
e470: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
e480: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
e490: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
e4a0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
e4b0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
e4c0: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
e4d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
e4e0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
e4f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
e500: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
e510: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e520: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
e530: 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  L;.      Simulat
e540: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
e550: 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
e560: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
e570: 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
e580: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
e590: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  );.      if( uni
e5a0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
e5b0: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
e5c0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
e5d0: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
e5e0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
e5f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e600: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e610: 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  ;..pFile->lastEr
e620: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e630: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
e640: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
e650: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
e660: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
e670: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
e680: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
e690: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
e6a0: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
e6b0: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
e6c0: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
e6d0: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
e6e0: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
e6f0: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
e700: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
e710: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
e720: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
e730: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
e740: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
e750: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
e760: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
e770: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
e780: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
e790: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
e7a0: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
e7b0: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
e7c0: 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63  .  }...end_unloc
e7d0: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
e7e0: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
e7f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
e800: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e810: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
e820: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e830: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
e840: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
e850: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
e860: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
e870: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
e880: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
e890: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
e8a0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
e8b0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
e8c0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
e8d0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
e8e0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
e8f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
e900: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
e910: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
e920: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
e930: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
e940: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e950: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
e960: 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
e970: 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
e980: 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Lock, 0);.}../*.
e990: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e9a0: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
e9b0: 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
e9c0: 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
e9d0: 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
e9e0: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
e9f0: 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
ea00: 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
ea10: 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
ea20: 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
ea30: 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
ea40: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
ea50: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
ea60: 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
ea70: 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
ea80: 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
ea90: 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
eaa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
eab0: 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
eac0: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
ead0: 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
eae0: 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
eaf0: 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
eb00: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
eb10: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
eb20: 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
eb30: 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
eb40: 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
eb50: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
eb60: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
eb70: 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
eb80: 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
eb90: 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
eba0: 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
ebb0: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
ebc0: 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
ebd0: 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
ebe0: 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
ebf0: 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20  pFile->isDelete 
ec00: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
ec10: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
ec20: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
ec30: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
ec40: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
ec50: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
ec60: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
ec70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
ec80: 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
ec90: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
eca0: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
ecb0: 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
ecc0: 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
ecd0: 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
ece0: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
ecf0: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
ed00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ed10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ed20: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
ed30: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
ed40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
ed50: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
ed60: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
ed70: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
ed80: 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e  xFile *)id;.  un
ed90: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
eda0: 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
edb0: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
edc0: 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
edd0: 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
ede0: 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
edf0: 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
ee00: 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ose.  ** routine
ee10: 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f   (e.g. nolockClo
ee20: 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63  se()) would be c
ee30: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  alled instead.. 
ee40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
ee50: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
ee60: 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
ee70: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
ee80: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ock==0 );.  if( 
ee90: 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49  ALWAYS(pFile->pI
eea0: 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e  node) && pFile->
eeb0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
eec0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
eed0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
eee0: 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
eef0: 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
ef00: 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
ef10: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
ef20: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
ef30: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
ef40: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
ef50: 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
ef60: 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
ef70: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
ef80: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
ef90: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
efa0: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
efb0: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
efc0: 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
efd0: 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
efe0: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
eff0: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
f000: 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ile);.  rc = clo
f010: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
f020: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
f030: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
f040: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
f050: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
f060: 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
f070: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
f080: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
f090: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
f0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0e0: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
f160: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f180: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
f190: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
f1a0: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
f1b0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
f1c0: 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
f1d0: 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
f1e0: 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
f1f0: 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
f200: 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
f210: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
f220: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
f230: 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
f240: 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
f250: 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
f260: 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
f270: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
f280: 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
f290: 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
f2a0: 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
f2b0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
f2c0: 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
f2d0: 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
f2e0: 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
f2f0: 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
f300: 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
f310: 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
f320: 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
f330: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
f340: 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
f350: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
f360: 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
f370: 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
f380: 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
f390: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
f3a0: 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
f3b0: 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
f3c0: 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
f3d0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
f3e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
f3f0: 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
f400: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
f410: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
f420: 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
f430: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
f440: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
f450: 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
f460: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f470: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
f480: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f490: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
f4a0: 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
f4b0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
f4c0: 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
f4d0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
f4e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
f4f0: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
f500: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f510: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
f520: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
f530: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
f540: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
f550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f560: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
f570: 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
f580: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
f590: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
f5a0: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
f5b0: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
f5c0: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
f5d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
f5f0: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
f600: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
f610: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
f620: 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
f630: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
f640: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
f650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
f660: 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
f670: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f690: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
f6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f750: 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
f760: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f780: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
f790: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
f7a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f7b0: 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61 6e  uses the existan
f7c0: 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
f7d0: 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20  ock.** files in 
f7e0: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c  order to control
f7f0: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
f800: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
f810: 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20  orks on just.** 
f820: 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
f830: 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
f840: 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
f850: 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
f860: 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
f870: 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
f880: 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
f890: 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
f8a0: 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
f8b0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
f8c0: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
f8d0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
f8e0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
f8f0: 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
f900: 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
f910: 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
f920: 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
f930: 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
f940: 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
f950: 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
f960: 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
f970: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
f980: 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
f990: 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
f9a0: 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
f9b0: 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
f9c0: 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
f9d0: 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
f9e0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
f9f0: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
fa00: 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
fa10: 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  a file in the sa
fa20: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
fa30: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
fa40: 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
fa50: 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
fa60: 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
fa70: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
fa80: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
fa90: 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69   lock file impli
faa0: 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
fab0: 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
fac0: 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28   lock.** types (
fad0: 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
fae0: 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
faf0: 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
fb00: 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
fb10: 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
fb20: 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
fb30: 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
fb40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
fb50: 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66  te the.** lock f
fb60: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
fb70: 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22  DOTLOCK_SUFFIX "
fb80: 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  .lock"../*.** Th
fb90: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
fba0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
fbb0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
fbc0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
fbd0: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
fbe0: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
fbf0: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
fc00: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
fc10: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
fc20: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
fc30: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
fc40: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
fc50: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
fc60: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
fc70: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
fc80: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
fc90: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
fca0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
fcb0: 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66  g..**.** In dotf
fcc0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74  ile locking, eit
fcd0: 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74  her a lock exist
fce0: 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74  s or it does not
fcf0: 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a  .  So in this.**
fd00: 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68   variation of Ch
fd10: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
fd20: 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  ), *pResOut is s
fd30: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e  et to true if an
fd40: 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c  y lock.** is hel
fd50: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  d on the file an
fd60: 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66  d false if the f
fd70: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
fd80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
fd90: 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
fda0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
fdb0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
fdc0: 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
fdd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fde0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
fdf0: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
fe00: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
fe10: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
fe20: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
fe30: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
fe40: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
fe50: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
fe60: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
fe70: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
fe80: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
fe90: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
fea0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
feb0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
fec0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
fed0: 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73    /* Either this
fee0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73   connection or s
fef0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
ff00: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65  tion in the same
ff10: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
ff20: 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
ff30: 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65  the file.  No ne
ff40: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74  ed to check furt
ff50: 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65  her. */.    rese
ff60: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  rved = 1;.  }els
ff70: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  e{.    /* The lo
ff80: 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e  ck is held if an
ff90: 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f  d only if the lo
ffa0: 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  ckfile exists */
ffb0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ffc0: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f  *zLockFile = (co
ffd0: 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d  nst char*)pFile-
ffe0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
fff0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
10000 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69  osAccess(zLockFi
10010 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20  le, 0)==0;.  }. 
10020 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
10030 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
10040 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
10050 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
10060 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
10070 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
10080 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10090 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
100a0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
100b0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
100c0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
100d0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
100e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
100f0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
10100 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
10110 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
10120 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
10130 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
10140 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
10150 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
10160 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
10170 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
10180 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
10190 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
101a0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
101b0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
101c0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
101d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
101e0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
101f0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
10200 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
10210 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
10220 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
10230 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
10240 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
10250 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
10260 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
10270 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
10280 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
10290 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
102a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
102b0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
102c0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
102d0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
102e0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
102f0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
10300 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
10310 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
10320 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
10330 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
10340 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
10350 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
10360 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
10370 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
10380 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
10390 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
103a0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
103b0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
103c0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
103d0 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
103e0 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
103f0 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
10400 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
10410 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
10420 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
10430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10440 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
10450 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
10460 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
10470 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
10480 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
10490 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20   int fd;.  char 
104a0 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
104b0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
104c0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
104d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
104e0 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
104f0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
10500 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
10510 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
10520 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
10530 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
10540 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
10550 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
10560 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
10570 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
10580 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
10590 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
105a0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
105b0 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
105c0 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
105d0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
105e0 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
105f0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
10600 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
10610 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
10620 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
10630 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
10640 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
10650 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10660 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
10670 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
10680 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
10690 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44  n(zLockFile,O_RD
106a0 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  ONLY|O_CREAT|O_E
106b0 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28  XCL,0600);.  if(
106c0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   fd<0 ){.    /* 
106d0 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
106e0 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20  reate the file, 
106f0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79  someone else may
10700 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65   have stolen the
10710 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
10720 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10730 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
10740 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
10750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
10760 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
10770 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
10780 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10790 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
107a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
107b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
107c0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
107d0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
107e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
107f0 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
10800 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
10810 3b 0a 20 20 7d 20 0a 20 20 72 6f 62 75 73 74 5f  ;.  } .  robust_
10820 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
10830 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20   __LINE__);.  . 
10840 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
10850 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10860 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
10870 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10880 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
10890 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
108a0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
108b0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
108c0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
108d0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
108e0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
108f0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
10900 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
10910 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10920 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10930 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10940 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10950 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10960 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10970 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
10980 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10990 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
109a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
109b0 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
109c0 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
109d0 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
109e0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
109f0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10a00 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
10a10 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
10a20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10a30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
10a40 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
10a50 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
10a60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
10a70 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10a80 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
10a90 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
10aa0 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c   %d pid=%d (dotl
10ab0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
10ac0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20  h, eFileLock,.. 
10ad0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10ae0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
10af0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
10b00 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
10b10 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
10b20 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
10b30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
10b40 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
10b50 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
10b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10b70 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
10b80 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
10b90 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
10ba0 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
10bb0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
10bc0 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
10bd0 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
10be0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
10bf0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
10c00 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
10c10 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
10c20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10c30 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
10c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10c50 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
10c60 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
10c70 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
10c80 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
10c90 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
10ca0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
10cb0 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
10cc0 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20  zLockFile) ){.  
10cd0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10ce0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
10cf0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e  rrno;.    if( EN
10d00 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
10d10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10d20 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10d40 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10d50 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
10d60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10d70 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
10d80 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
10d90 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10da0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
10db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10dd0 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
10de0 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
10df0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
10e00 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
10e10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10e20 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
10e30 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
10e40 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64  int rc;.  if( id
10e50 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
10e60 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10e70 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74  ile*)id;.    dot
10e80 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
10e90 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c  O_LOCK);.    sql
10ea0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
10eb0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
10ec0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f  ;.  }.  rc = clo
10ed0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
10ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
10ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f00 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f  ** End of the do
10f10 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c  t-file lock impl
10f20 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
10f90 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
11000 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a   flock Locking *
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11030 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c  **.** Use the fl
11040 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ock() system cal
11050 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63  l to do file loc
11060 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  king..**.** floc
11070 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  k() locking is l
11080 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  ike dot-file loc
11090 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65  king in that the
110a0 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65   various.** fine
110b0 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c  -grain locking l
110c0 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20  evels supported 
110d0 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f  by SQLite are co
110e0 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20  llapsed into.** 
110f0 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69  a single exclusi
11100 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68  ve lock.  In oth
11110 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44  er words, SHARED
11120 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a  , RESERVED, and.
11130 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73  ** PENDING locks
11140 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68   are the same th
11150 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53  ing as an EXCLUS
11160 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74  IVE lock.  SQLit
11170 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73  e.** still works
11180 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69   when you do thi
11190 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e  s, but concurren
111a0 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69  cy is reduced si
111b0 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  nce.** only a si
111c0 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
111d0 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
111e0 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69  database at a ti
111f0 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74  me..**.** Omit t
11200 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53  his section if S
11210 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
11220 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75  KING_STYLE is tu
11230 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a  rned off or if.*
11240 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20  * compiling for 
11250 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20  VXWORKS..*/.#if 
11260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11270 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
11280 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
11290 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20  * Retry flock() 
112a0 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
112b0 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69  with EINTR.*/.#i
112c0 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69  fdef EINTR.stati
112d0 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f  c int robust_flo
112e0 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ck(int fd, int o
112f0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
11300 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66  do{ rc = flock(f
11310 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72  d,op); }while( r
11320 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
11330 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
11340 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
11350 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63  fine robust_floc
11360 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62  k(a,b) flock(a,b
11370 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a  ).#endif.     ..
11380 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11390 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
113a0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
113b0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
113c0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
113d0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
113e0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
113f0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
11400 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11410 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11420 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11430 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11440 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
11450 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
11460 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
11470 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
11480 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
11490 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
114a0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
114b0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68  atic int flockCh
114c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
114d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
114e0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
114f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11500 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
11510 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
11520 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11530 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11540 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11550 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
11560 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
11570 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
11580 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11590 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   );.  .  /* Chec
115a0 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
115b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
115c0 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
115d0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
115e0 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
115f0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
11600 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
11610 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
11620 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
11630 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
11640 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
11650 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
11660 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
11670 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
11680 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73   int lrc = robus
11690 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
116a0 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
116b0 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c  _NB);.    if( !l
116c0 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67  rc ){.      /* g
116d0 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c  ot the lock, unl
116e0 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ock it */.      
116f0 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
11700 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11710 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
11720 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
11730 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11740 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rrno;.        /*
11750 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
11760 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
11770 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51          lrc = SQ
11780 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11790 4b 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  K; .        if( 
117a0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
117b0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
117c0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
117d0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
117e0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
117f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11800 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
11810 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
11820 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
11830 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
11840 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
11850 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
11860 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
11870 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
11880 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
11890 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
118a0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
118b0 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
118c0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
118d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
118e0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
118f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
11900 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
11910 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
11920 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
11930 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
11940 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
11950 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
11960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
11970 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
11980 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
11990 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
119a0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
119b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
119c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
119d0 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
119e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
119f0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
11a00 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
11a10 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11a20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11a30 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11a40 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11a50 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11a60 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
11a70 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
11a80 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
11a90 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
11aa0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
11ab0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
11ac0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
11ad0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11ae0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11af0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11b00 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11b10 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11b20 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11b30 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11b40 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11b50 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11b60 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11b70 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11b80 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11b90 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11ba0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11bb0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11bc0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11bd0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11be0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11bf0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11c00 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11c10 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11c20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11c30 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11c40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11c50 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11c60 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11c70 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11c80 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11c90 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11ca0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11cb0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11cc0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11cd0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11ce0 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
11cf0 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
11d00 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
11d10 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
11d20 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
11d30 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
11d40 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
11d50 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
11d60 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
11d70 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
11d80 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
11d90 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
11da0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
11db0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
11dc0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
11dd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11de0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
11df0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
11e00 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
11e10 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
11e20 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
11e30 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
11e40 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11e50 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11e60 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11e70 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
11e80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11e90 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11ea0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11eb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11ec0 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
11ed0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
11ee0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
11ef0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
11f00 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
11f10 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
11f20 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
11f30 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
11f40 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
11f50 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11f60 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11f70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11f80 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
11f90 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
11fa0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
11fb0 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
11fc0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11fd0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
11fe0 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
11ff0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
12000 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
12010 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
12020 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
12030 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
12040 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
12050 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
12060 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12070 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
12080 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12090 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
120a0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
120b0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
120c0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
120d0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
120e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
120f0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
12100 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
12110 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
12120 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12130 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
12140 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
12150 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
12160 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
12170 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
12180 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
12190 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
121a0 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
121b0 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
121c0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
121d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
121e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
121f0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12200 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
12210 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
12220 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
12230 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
12240 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
12250 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
12260 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
12270 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
12280 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
12290 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
122a0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
122b0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
122c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
122d0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
122e0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
122f0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
12300 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
12310 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
12320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
12330 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
12340 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12350 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
12360 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12370 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12380 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
12390 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
123a0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
123b0 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
123c0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
123d0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
123e0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
123f0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
12400 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
12410 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
12420 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12430 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
12440 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
12450 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
12460 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
12470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12480 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12490 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
124a0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
124b0 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
124c0 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
124d0 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
124e0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
124f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12500 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
12510 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12520 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
12530 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
12540 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lock. */.  if( r
12550 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
12560 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29  e->h, LOCK_UN) )
12570 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12580 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
12590 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74  K_ERRORS.    ret
125a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
125b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
125c0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
125d0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
125e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
125f0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65  ERR_UNLOCK;.  }e
12600 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
12610 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
12620 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
12630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
12640 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
12650 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
12660 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
12670 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
12680 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
12690 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
126a0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  d, NO_LOCK);.  }
126b0 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
126c0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
126d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
126e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
126f0 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
12700 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
12720 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
12730 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
12740 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
12750 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
12820 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
12850 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
12860 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
12870 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
12880 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
12890 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
128a0 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
128b0 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
128c0 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
128d0 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
128e0 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
128f0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12900 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
12910 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
12920 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
12930 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
12940 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
12950 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
12960 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
12970 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
12980 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
12990 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
129a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
129b0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
129c0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
129d0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
129e0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
129f0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12a00 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
12a10 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
12a20 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
12a30 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
12a40 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
12a50 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
12a60 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12a70 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
12a80 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
12a90 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
12aa0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
12ab0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
12ac0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
12ad0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
12ae0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12af0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12b00 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
12b10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12b20 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
12b30 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
12b40 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12b50 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
12b60 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12b70 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12b80 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
12b90 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
12ba0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12bb0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
12bc0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
12bd0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
12be0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
12bf0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
12c00 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
12c10 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
12c20 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
12c30 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
12c40 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
12c50 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
12c60 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
12c70 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
12c80 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
12c90 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
12ca0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
12cb0 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20  atBuf;..    if( 
12cc0 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
12cd0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
12ce0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12cf0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
12d00 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
12d10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12d20 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12d30 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
12d50 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
12d60 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
12d70 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
12d80 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  no;.      } else
12d90 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
12da0 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
12db0 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
12dc0 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
12dd0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
12de0 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
12df0 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
12e00 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
12e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12e20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
12e30 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
12e40 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
12e50 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
12e60 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
12e70 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12e80 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
12e90 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12ea0 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
12eb0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
12ec0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
12ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
12ee0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
12ef0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
12f00 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
12f10 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
12f20 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
12f30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
12f40 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
12f50 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
12f60 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
12f70 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
12f80 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
12f90 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
12fa0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
12fb0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
12fc0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
12fd0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
12fe0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
12ff0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
13000 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
13010 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
13020 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
13030 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
13040 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
13050 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
13060 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
13070 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
13080 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
13090 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
130a0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
130b0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
130c0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
130d0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
130e0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
130f0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13100 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13110 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
13120 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
13130 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13140 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
13150 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
13160 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
13170 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
13180 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
13190 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
131a0 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
131b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
131c0 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
131d0 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
131e0 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
131f0 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
13200 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
13210 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
13220 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
13230 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
13240 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
13250 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
13260 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
13270 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
13280 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13290 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
132a0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
132b0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
132c0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
132d0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
132e0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
132f0 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
13300 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13310 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13320 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13330 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13340 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
13350 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
13360 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
13370 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
13380 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
13390 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
133a0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
133b0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
133c0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
133d0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
133e0 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
133f0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
13400 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
13410 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
13420 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13430 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
13440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
13450 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
13460 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
13470 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
13480 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
13490 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
134a0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
134b0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
134c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
134d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
134e0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
134f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
13500 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
13510 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
13520 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13530 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13540 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
13550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13560 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
13570 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13580 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
13590 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
135a0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
135b0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
135c0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
135d0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
135e0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
135f0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
13600 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13610 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
13620 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
13630 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
13640 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
13650 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13660 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
13670 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
13680 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13690 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
136a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
136b0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
136c0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
136d0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
136e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
136f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
13700 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
13710 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
13720 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
13730 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
13740 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20  , eFileLock,..  
13750 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13760 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
13770 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
13780 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
13790 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
137a0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
137b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
137c0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
137d0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
137e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
137f0 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
13800 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
13810 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
13820 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
13830 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
13840 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
13850 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
13860 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
13870 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
13880 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13890 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
138a0 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
138b0 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
138c0 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
138d0 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
138e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
138f0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13900 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13910 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13920 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
13930 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
13940 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
13950 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13960 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
13970 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
13980 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
13990 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
139a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
139c0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
139d0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
139e0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
139f0 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
13a00 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
13a10 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13a20 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
13a30 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
13a40 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
13a50 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
13a60 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
13a70 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
13a80 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
13a90 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
13aa0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
13ab0 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
13ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ad0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
13ae0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
13af0 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
13b00 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
13b10 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
13b20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
13b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
13b40 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
13b50 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
13b60 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
13b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
13c40 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13c70 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
13c80 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
13c90 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
13ca0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
13cb0 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
13cc0 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
13cd0 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
13ce0 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
13cf0 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
13d00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
13d10 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
13d20 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
13d30 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
13d40 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
13d50 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
13d60 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
13d70 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
13d80 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
13d90 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
13da0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
13db0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
13dc0 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
13dd0 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
13de0 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
13df0 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
13e00 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
13e10 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
13e20 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
13e30 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
13e40 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
13e50 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
13e60 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
13e70 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
13e80 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
13e90 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
13ea0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
13eb0 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
13ec0 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
13ed0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
13ee0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
13ef0 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
13f00 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
13f10 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
13f20 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
13f30 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
13f40 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
13f50 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
13f60 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
13f70 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
13f80 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
13f90 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
13fa0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
13fb0 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
13fc0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
13fd0 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
13fe0 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
13ff0 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
14020 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
14030 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
14040 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
14050 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
14060 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
14070 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
14080 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
14090 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
140a0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
140b0 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
140c0 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
140d0 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
140e0 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
140f0 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
14100 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
14110 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
14120 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
14130 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
14140 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
14150 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
14160 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
14170 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
14180 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
14190 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
141a0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
141b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
141c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
141d0 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
141e0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
141f0 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
14200 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
14210 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
14220 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
14230 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
14240 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
14250 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
14260 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
14270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14280 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
14290 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
142a0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
142b0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
142c0 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
142d0 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
142e0 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
142f0 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
14300 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
14310 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
14320 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
14330 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
14340 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
14350 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
14360 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
14370 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
14380 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
14390 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
143a0 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
143b0 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
143c0 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
143d0 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
143e0 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
143f0 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
14400 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
14410 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
14420 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
14430 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
14440 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
14450 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
14460 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
14470 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
14480 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
14490 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
144a0 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
144b0 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
144c0 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
144d0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
144e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
144f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14500 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
14510 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14520 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14530 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
14540 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
14550 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
14560 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
14570 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
14580 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14590 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
145a0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
145b0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
145c0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
145d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
145e0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
145f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14600 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
14610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14620 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
14630 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
14640 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
14650 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
14660 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
14670 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
14680 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
14690 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
146a0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
146b0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
146c0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
146d0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
146e0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
146f0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
14700 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
14710 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
14720 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
14730 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14740 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
14750 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
14760 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
14770 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
14780 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
14790 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
147a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
147b0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
147c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
147d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
147e0 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
147f0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
14800 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
14810 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
14820 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
14830 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63  File );.  afpLoc
14840 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
14850 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
14860 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
14870 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
14880 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78  xt;.  if( contex
14890 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
148a0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
148b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
148c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
148d0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
148e0 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
148f0 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
14900 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
14910 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   */.  .  /* Chec
14920 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
14930 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
14940 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
14950 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14960 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
14970 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
14980 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
14990 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
149a0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
149b0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
149c0 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20  ss holds it..   
149d0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
149e0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63  ed ){.    /* loc
149f0 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62  k the RESERVED b
14a00 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  yte */.    int l
14a10 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
14a20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14a30 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
14a40 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
14a50 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
14a60 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  ==lrc ){.      /
14a70 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65  * if we succeede
14a80 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20  d in taking the 
14a90 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75  reserved lock, u
14aa0 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74  nlock it to rest
14ab0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ore.      ** the
14ac0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
14ad0 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61  */.      lrc = a
14ae0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
14af0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
14b00 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
14b10 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c   1, 0);.    } el
14b20 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  se {.      /* if
14b30 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65   we failed to ge
14b40 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20  t the lock then 
14b50 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73  someone else mus
14b60 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20  t have it */.   
14b70 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
14b80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
14b90 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
14ba0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72  ) ){.      rc=lr
14bb0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  c;.    }.  }.  .
14bc0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
14bd0 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
14be0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
14bf0 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  %d %d (afp)\n", 
14c00 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
14c10 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a  served));.  .  *
14c20 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
14c30 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
14c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
14c50 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
14c60 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
14c70 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
14c80 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
14c90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14ca0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
14cb0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14cc0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14cd0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14ce0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14cf0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14d00 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14d10 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
14d20 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
14d30 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
14d40 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
14d50 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
14d60 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
14d70 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
14d80 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
14d90 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
14da0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
14db0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14dc0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14dd0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14de0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14df0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14e00 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14e10 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
14e20 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
14e30 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
14e40 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
14e50 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
14e60 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
14e70 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14e80 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
14e90 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
14ea0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14eb0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14ec0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14ed0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14ee0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14ef0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
14f00 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14f10 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
14f20 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
14f30 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
14f40 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
14f50 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
14f60 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
14f70 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
14f80 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14f90 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69   eFileLock){.  i
14fa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14fb0 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
14fc0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14fd0 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
14fe0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
14ff0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
15000 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
15010 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
15020 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15030 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
15040 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
15050 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
15060 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
15070 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
15080 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
15090 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
150a0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
150b0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
150c0 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
150d0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
150e0 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  k),.           a
150f0 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
15100 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
15110 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
15120 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
15130 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
15140 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
15150 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
15160 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
15170 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
15180 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
15190 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
151a0 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
151b0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
151c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
151d0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
151e0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
151f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
15200 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
15210 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
15220 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
15230 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
15240 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
15250 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
15260 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
15270 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
15280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15290 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
152a0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
152b0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
152c0 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
152d0 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
152e0 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
152f0 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
15300 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
15310 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
15320 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
15330 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
15340 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
15350 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
15360 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
15370 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
15380 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
15390 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
153a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
153b0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
153c0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
153d0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
153e0 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
153f0 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
15400 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
15410 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
15420 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15430 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
15440 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
15450 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
15460 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
15470 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
15480 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
15490 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
154a0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
154b0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
154c0 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
154d0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
154e0 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
154f0 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
15500 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
15510 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
15520 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
15530 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
15540 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
15550 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
15560 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
15570 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
15580 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
15590 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
155a0 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
155b0 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
155c0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
155d0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
155e0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
155f0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
15600 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
15610 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
15620 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
15630 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
15640 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
15650 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
15660 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
15670 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
15680 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
15690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
156a0 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
156b0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
156c0 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
156d0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
156e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
156f0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
15700 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
15710 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
15720 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15730 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
15740 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
15750 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
15760 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
15770 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
15780 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15790 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
157a0 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
157b0 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
157c0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
157d0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
157e0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
157f0 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
15800 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
15810 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
15820 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
15830 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
15840 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
15850 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
15860 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
15870 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
15880 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
15890 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
158a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
158b0 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
158c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
158d0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
158e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
158f0 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
15900 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
15910 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
15920 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15930 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15940 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
15950 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
15960 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
15970 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
15980 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15990 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
159a0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
159b0 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
159c0 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
159d0 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
159e0 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
159f0 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
15a00 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
15a10 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
15a20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
15a30 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15a40 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
15a50 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  , lrc1Errno;.   
15a60 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
15a70 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
15a80 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15a90 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
15aa0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
15ab0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
15ac0 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
15ad0 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
15ae0 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
15af0 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
15b00 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
15b10 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
15b20 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
15b30 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
15b40 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
15b50 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
15b60 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
15b70 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
15b80 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
15b90 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
15ba0 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
15bb0 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
15bc0 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
15bd0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15be0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15bf0 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
15c00 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
15c10 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
15c20 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
15c30 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
15c40 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
15c50 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
15c60 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
15c70 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
15c80 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
15c90 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
15ca0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15cb0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15cc0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
15cd0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
15ce0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
15cf0 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
15d00 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15d10 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f  rrno = lrc1Errno
15d20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  ;.      rc = lrc
15d30 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  1;.      goto af
15d40 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
15d50 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f  } else if( IS_LO
15d60 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29  CK_ERROR(lrc2) )
15d70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
15d80 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  2;.      goto af
15d90 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
15da0 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20  } else if( lrc1 
15db0 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  != SQLITE_OK ) {
15dc0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15dd0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
15de0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
15df0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
15e00 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
15e10 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
15e20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
15e30 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
15e40 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
15e50 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15e60 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
15e70 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
15e80 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
15e90 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
15ea0 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
15eb0 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
15ec0 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  .     ** same pr
15ed0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
15ee0 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
15ef0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
15f00 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
15f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
15f20 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
15f30 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
15f40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
15f50 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
15f60 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
15f70 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
15f80 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
15f90 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
15fa0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
15fb0 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
15fc0 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
15fd0 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
15fe0 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28  Lock );.    if (
15ff0 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53  eFileLock >= RES
16000 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
16010 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
16020 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
16030 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
16040 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
16050 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
16060 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
16070 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16080 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16090 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
160a0 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c  .      if( !fail
160b0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ed ){.        co
160c0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
160d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
160e0 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
160f0 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20  ed && eFileLock 
16100 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  == EXCLUSIVE_LOC
16110 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63  K) {.      /* Ac
16120 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
16130 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  VE lock */.     
16140 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d     .      /* Rem
16150 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c  ove the shared l
16160 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e  ock before tryin
16170 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65  g the range.  we
16180 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20  'll need to .   
16190 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73     ** reestablis
161a0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
161b0 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65  k if we can't ge
161c0 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b  t the  afpUnlock
161d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
161e0 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61  if( !(failed = a
161f0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16200 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16210 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
16220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16230 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65            pInode
16240 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
16250 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   0)) ){.        
16260 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51  int failed2 = SQ
16270 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
16280 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
16290 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
162a0 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
162b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
162c0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
162d0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
162e0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
162f0 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
16320 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  E, 1);.        i
16330 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61  f( failed && (fa
16340 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f  iled2 = afpSetLo
16350 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16360 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20     SHARED_FIRST 
16390 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  + pInode->shared
163a0 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
163b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
163c0 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
163d0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
163e0 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
163f0 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
16400 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
16410 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
16420 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16430 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
16440 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
16450 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
16460 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
16470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16480 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
16490 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
164a0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
164b0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
164c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
164d0 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
164e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
164f0 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
16500 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
16510 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
16520 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16530 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
16540 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16550 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
16560 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
16570 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
16580 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
16590 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
165a0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
165b0 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
165c0 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
165d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
165e0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
165f0 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
16600 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
16610 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
16620 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
16630 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %s (afp)\n", pF
16640 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
16650 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
16660 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
16670 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
16680 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
16690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
166a0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
166b0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
166c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
166d0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
166e0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
166f0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
16700 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
16710 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
16720 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
16730 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
16740 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
16750 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
16760 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
16770 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
16780 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
16790 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
167a0 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
167b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
167c0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
167d0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
167e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
167f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
16800 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
16810 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
16820 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
16830 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
16840 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
16850 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
16860 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
16870 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65  .  int skipShare
16880 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
16890 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
168a0 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65  h = pFile->h;.#e
168b0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
168c0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
168d0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
168e0 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
168f0 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
16900 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
16910 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
16920 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16930 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
16940 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
16950 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
16960 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ared,.          
16970 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
16980 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
16990 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
169a0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
169b0 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
169c0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
169d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
169e0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
169f0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
16a00 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
16a10 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16a20 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
16a30 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
16a40 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
16a50 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
16a60 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
16a70 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
16a80 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
16a90 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
16aa0 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
16ab0 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
16ac0 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
16ad0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
16ae0 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e  ;.    .#ifndef N
16af0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
16b00 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
16b10 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
16b20 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
16b30 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
16b40 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
16b50 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
16b60 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
16b70 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
16b80 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
16b90 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
16ba0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
16bb0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
16bc0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
16bd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
16be0 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
16bf0 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
16c00 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
16c10 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
16c20 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
16c30 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
16c40 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
16c50 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
16c60 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
16c70 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
16c80 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
16c90 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
16ca0 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
16cb0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
16cc0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
16cd0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
16ce0 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
16cf0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
16d00 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
16d10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
16d20 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
16d30 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
16d40 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
16d50 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
16d60 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
16d70 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  >eFileLock==EXCL
16d80 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
16d90 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
16da0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16db0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
16dc0 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
16dd0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
16de0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16df0 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
16e00 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
16e10 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16e20 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >1) ){.        /
16e30 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c  * only re-establ
16e40 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
16e50 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ock if necessary
16e60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
16e70 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
16e80 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
16e90 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16ea0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
16eb0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16ec0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16ed0 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
16ee0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 1, 1);.      }
16ef0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
16f00 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a  skipShared = 1;.
16f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16f20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16f30 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
16f40 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
16f50 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
16f60 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16f70 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16f80 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
16f90 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
16fa0 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  } .    if( rc==S
16fb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
16fc0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45  e->eFileLock>=RE
16fd0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63  SERVED_LOCK && c
16fe0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
16ff0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
17000 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17010 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17020 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
17030 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
17040 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20  ( !rc ){ .      
17050 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
17060 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  ved = 0; .      
17070 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17090 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
170a0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
170b0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b  de->nShared>1)){
170c0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
170d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
170e0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
170f0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
17100 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f  TE_OK && eFileLo
17110 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a  ck==NO_LOCK ){..
17120 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
17130 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17140 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
17150 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
17160 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
17170 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
17180 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
17190 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
171a0 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
171b0 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
171c0 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65    */.    unsigne
171d0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
171e0 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
171f0 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
17200 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
17210 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
17220 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
17230 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
17240 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ){.      Simulat
17250 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
17260 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
17270 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
17280 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
17290 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
172a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b  );.      if( !sk
172b0 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ipShared ){.    
172c0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
172d0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
172e0 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
172f0 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
17300 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17310 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
17320 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17330 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
17340 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
17350 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
17360 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
17370 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17390 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
173a0 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
173b0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
173c0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
173d0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
173e0 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
173f0 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
17400 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17410 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
17420 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
17430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17440 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
17450 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
17460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17470 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
17480 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
17490 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
174a0 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
174b0 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
174c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
174d0 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
174e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
174f0 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
17500 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
17510 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
17520 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e   afpUnlock(id, N
17530 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69  O_LOCK);.    uni
17540 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
17550 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49     if( pFile->pI
17560 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70  node && pFile->p
17570 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
17580 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
17590 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
175a0 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
175b0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
175c0 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
175d0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
175e0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
175f0 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
17600 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
17610 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
17620 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
17630 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  node->aPending. 
17640 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
17650 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
17660 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
17670 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
17680 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
17690 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
176a0 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
176b0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e   }.    releaseIn
176c0 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
176d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
176e0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
176f0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20  ontext);.    rc 
17700 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
17710 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  id);.    unixLea
17720 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20  veMutex();.  }. 
17730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
17740 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
17750 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
17760 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17770 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
17780 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
17790 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f  ve is the AFP lo
177a0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
177b0 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
177c0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
177d0 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
177e0 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
177f0 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
17800 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
17810 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
17820 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20  .  If you don't 
17830 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61  compile for a ma
17840 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69  c, then the "uni
17850 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73  x-afp".** VFS is
17860 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a   not available..
17870 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
17880 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
17890 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
178a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
178b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178c0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
178d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17910 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
17920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17960 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
17970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
17980 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e  Begin NFS Lockin
17990 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179b0 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  **/..#if defined
179c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
179d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
179e0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a  KING_STYLE./*. *
179f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17a00 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
17a10 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
17a20 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
17a30 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20    eFileLock. ** 
17a40 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17a50 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
17a60 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49  _LOCK.. **. ** I
17a70 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
17a80 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
17a90 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
17aa0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
17ab0 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73  w. ** the reques
17ac0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17ad0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17ae0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a  is a no-op.. */.
17af0 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e  static int nfsUn
17b00 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
17b10 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
17b20 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20  Lock){.  return 
17b30 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
17b40 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d  eFileLock, 1);.}
17b50 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
17b60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
17b70 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
17b80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
17b90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
17ba0 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53  above is the NFS
17bb0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
17bc0 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
17bd0 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
17be0 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
17bf0 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
17c00 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
17c10 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
17c20 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
17c30 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  ble.  .**.******
17c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
17c50 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c  End of the NFS l
17c60 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
17c70 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
17c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
17c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cd0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
17ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d  *********** Non-
17d40 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
17d50 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  file methods ***
17d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
17d80 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69   The next divisi
17d90 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c  on contains impl
17da0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
17db0 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  all methods of t
17dc0 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  he .** sqlite3_f
17dd0 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72  ile object other
17de0 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   than the lockin
17df0 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  g methods.  The 
17e00 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f  locking.** metho
17e10 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  ds were defined 
17e20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f  in divisions abo
17e30 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20  ve (one locking 
17e40 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69  method per.** di
17e50 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20  vision).  Those 
17e60 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65  methods that are
17e70 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
17e80 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20  ocking modes.** 
17e90 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74  are gather toget
17ea0 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69  her into this di
17eb0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  vision..*/../*.*
17ec0 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
17ed0 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74  fset passed as t
17ee0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17ef0 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e  nt, then read cn
17f00 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f  t .** bytes into
17f10 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68   pBuf. Return th
17f20 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
17f30 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
17f40 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79  .**.** NB:  If y
17f50 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ou define USE_PR
17f60 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44  EAD or USE_PREAD
17f70 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  64, then it migh
17f80 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63  t also.** be nec
17f90 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65  essary to define
17fa0 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74   _XOPEN_SOURCE t
17fb0 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20  o be 500.  This 
17fc0 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f  varies from.** o
17fd0 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f  ne system to ano
17fe0 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c  ther.  Since SQL
17ff0 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66  ite does not def
18000 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a  ine USE_PREAD.**
18010 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79   any any form by
18020 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c   default, we wil
18030 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
18040 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
18050 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69  OURCE..** See ti
18060 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20  ckets #2741 and 
18070 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  #2681..**.** To 
18080 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
18090 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
180a0 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20  n a failed read 
180b0 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
180c0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
180d0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
180e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
180f0 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69  ekAndRead(unixFi
18100 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
18110 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f  int64 offset, vo
18120 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
18130 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23  t){.  int got;.#
18140 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
18150 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
18160 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
18170 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
18180 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
18190 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
181a0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
181b0 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72    do{ got = osPr
181c0 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
181d0 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d   cnt, offset); }
181e0 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
181f0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
18200 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18210 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
18220 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
18230 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
18240 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28  got = osPread64(
18250 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18260 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c  , offset); }whil
18270 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
18280 6f 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d  o==EINTR);.  Sim
18290 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
182a0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
182b0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
182c0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
182d0 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
182e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
182f0 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
18300 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
18310 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69  =offset ){.    i
18320 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
18330 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e  -1 ){.      ((un
18340 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18350 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
18360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18370 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18380 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
18390 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ....    }.    re
183a0 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64  turn -1;.  }.  d
183b0 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28  o{ got = osRead(
183c0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
183d0 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
183e0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
183f0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d   );.#endif.  TIM
18400 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
18410 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
18420 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18430 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18440 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52   }.  OSTRACE(("R
18450 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
18460 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69  %7lld %llu\n", i
18470 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65  d->h, got, offse
18480 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  t, TIMER_ELAPSED
18490 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  ));.  return got
184a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
184b0 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
184c0 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
184d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
184e0 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
184f0 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
18500 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
18510 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
18520 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
18530 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
18540 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
18550 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
18560 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
18570 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
18580 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
18590 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
185a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
185b0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
185c0 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
185d0 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  d );..  /* If th
185e0 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
185f0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
18600 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
18610 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
18620 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
18630 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
18640 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
18650 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
18660 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
18670 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
18680 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
18690 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
186a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
186b0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
186c0 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
186d0 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
186e0 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ..  got = seekAn
186f0 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66  dRead(pFile, off
18700 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
18710 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
18720 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18730 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
18740 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
18750 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
18760 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
18770 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  d */.    return 
18780 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
18790 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
187a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
187b0 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
187c0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
187d0 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
187e0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
187f0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
18800 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
18810 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
18820 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
18830 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
18840 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
18850 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
18860 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
18870 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
18880 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
18890 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
188a0 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
188b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
188c0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
188d0 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
188e0 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ffset..**.** To 
188f0 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
18900 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
18910 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65  n a failed write
18920 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
18930 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
18940 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18960 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
18970 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
18980 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
18990 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
189a0 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66  {.  int got;.#if
189b0 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
189c0 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
189d0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
189e0 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
189f0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
18a00 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
18a10 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
18a20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69  do{ got = osPwri
18a30 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
18a40 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77  cnt, offset); }w
18a50 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
18a60 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
18a70 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
18a80 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
18a90 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34  got = osPwrite64
18aa0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18ab0 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c  t, offset);}whil
18ac0 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
18ad0 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
18ae0 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
18af0 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
18b00 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
18b10 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18b20 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
18b30 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
18b40 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
18b50 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
18b60 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
18b70 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18b80 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18ba0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18bb0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
18bc0 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
18bd0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
18be0 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 57 72 69 74  do{ got = osWrit
18bf0 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
18c00 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  nt); }while( got
18c10 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
18c20 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  TR );.#endif.  T
18c30 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
18c40 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
18c50 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18c60 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18c70 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
18c80 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
18c90 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
18ca0 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
18cb0 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
18cc0 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
18cd0 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  got;.}.../*.** W
18ce0 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
18cf0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
18d00 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
18d10 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18d20 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
18d30 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
18d40 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
18d50 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74  tic int unixWrit
18d60 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
18d70 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20  e *id, .  const 
18d80 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
18d90 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
18da0 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a  3_int64 offset .
18db0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
18dc0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18dd0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74  *)id;.  int wrot
18de0 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
18df0 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28   id );.  assert(
18e00 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20   amt>0 );..  /* 
18e10 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
18e20 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
18e30 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
18e40 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
18e50 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
18e60 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
18e70 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
18e80 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
18e90 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
18ea0 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
18eb0 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
18ec0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
18ed0 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
18ee0 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
18ef0 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
18f00 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
18f10 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
18f20 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
18f30 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
18f40 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
18f50 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
18f60 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
18f70 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
18f80 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
18f90 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
18fa0 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
18fb0 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
18fc0 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
18fd0 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
18fe0 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
18ff0 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
19000 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
19010 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
19020 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
19030 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
19040 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
19050 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
19060 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
19070 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
19080 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
19090 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
190a0 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
190b0 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
190c0 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
190d0 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
190e0 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
190f0 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
19100 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
19110 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
19120 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
19130 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
19140 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
19150 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
19160 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
19170 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
19180 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
19190 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
191a0 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
191b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
191c0 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
191d0 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
191e0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
191f0 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
19200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
19210 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20  endif..  while( 
19220 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
19230 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
19240 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42  File, offset, pB
19250 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20  uf, amt))>0 ){. 
19260 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
19270 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
19280 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
19290 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
192a0 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
192b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
192c0 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
192d0 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
192e0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
192f0 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
19300 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20  );..  if( amt>0 
19310 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65  ){.    if( wrote
19320 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73  <0 && pFile->las
19330 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29  tErrno!=ENOSPC )
19340 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45  {.      /* lastE
19350 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
19360 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  AndWrite */.    
19370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19380 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
19390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
193a0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
193b0 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
193c0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
193d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
193e0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
193f0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
19400 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
19410 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
19420 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
19430 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
19440 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
19450 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
19460 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
19470 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
19480 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
19490 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
194a0 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
194b0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
194c0 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
194d0 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
194e0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
194f0 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
19500 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
19510 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
19520 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
19530 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
19540 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
19550 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
19560 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f  ck with the (slo
19570 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a  wer) fsync()..**
19580 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
19590 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
195a0 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
195b0 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
195c0 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
195d0 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
195e0 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
195f0 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ync.*/.#if !defi
19600 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
19610 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  & !defined(__lin
19620 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66  ux__).# define f
19630 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
19640 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
19650 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
19660 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
19670 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
19680 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
19690 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
196a0 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
196b0 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
196c0 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
196d0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
196e0 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
196f0 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
19700 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
19710 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
19720 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
19730 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
19740 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
19750 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
19760 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
19770 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
19780 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
19790 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
197a0 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
197b0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
197c0 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
197d0 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
197e0 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
197f0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
19800 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
19810 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
19820 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
19830 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
19840 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
19850 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
19860 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
19870 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
19880 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
19890 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
198a0 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
198b0 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
198c0 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
198d0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
198e0 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
198f0 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
19900 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
19910 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
19920 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
19930 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
19940 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
19950 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
19960 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
19970 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
19980 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
19990 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
199a0 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
199b0 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
199c0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
199d0 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
199e0 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
199f0 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
19a00 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
19a10 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
19a20 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
19a30 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
19a40 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
19a50 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
19a60 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
19a70 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
19a80 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
19a90 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
19aa0 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
19ab0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
19ac0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
19ad0 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
19ae0 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
19af0 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
19b00 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
19b10 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
19b20 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
19b30 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
19b40 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
19b50 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
19b60 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
19b70 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
19b80 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
19b90 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
19ba0 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
19bb0 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
19bc0 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
19bd0 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
19be0 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
19bf0 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
19c00 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
19c10 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
19c20 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
19c30 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
19c40 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
19c50 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
19c60 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
19c70 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
19c80 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
19c90 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
19ca0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
19cb0 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
19cc0 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
19cd0 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
19ce0 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
19cf0 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
19d00 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
19d10 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
19d20 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
19d30 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
19d40 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
19d50 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
19d60 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
19d70 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19d80 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
19d90 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
19da0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
19db0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
19dc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19dd0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
19de0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
19df0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19e00 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
19e10 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
19e20 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
19e30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
19e40 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
19e50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
19e60 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
19e70 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
19e80 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
19e90 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
19ea0 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
19eb0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
19ec0 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
19ed0 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
19ee0 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
19ef0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
19f00 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
19f10 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
19f20 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
19f30 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
19f40 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
19f50 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
19f60 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
19f70 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
19f80 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
19f90 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
19fa0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
19fb0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
19fc0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
19fd0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
19fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19ff0 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1a000 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
1a010 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
1a020 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  osFcntl(fd, F_FU
1a030 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
1a040 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
1a050 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
1a060 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
1a070 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
1a080 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
1a090 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20  sync()..  ** It 
1a0a0 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
1a0b0 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
1a0c0 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
1a0d0 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66  he local .  ** f
1a0e0 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
1a0f0 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
1a100 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
1a110 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73  ULLFSYNC.  ** is
1a120 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
1a130 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
1a140 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
1a150 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61  an fsync .  ** a
1a160 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
1a170 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
1a180 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
1a190 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
1a1a0 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74    ** It'd be bet
1a1b0 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
1a1c0 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
1a1d0 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
1a1e0 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63    ** the fcntl c
1a1f0 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
1a200 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
1a210 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72   */.  if( rc ) r
1a220 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a  c = fsync(fd);..
1a230 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #elif defined(__
1a240 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64  APPLE__).  /* fd
1a250 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53  atasync() on HFS
1a260 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c  + doesn't yet fl
1a270 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ush the file siz
1a280 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20  e if it changed 
1a290 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73  correctly.  ** s
1a2a0 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64  o currently we d
1a2b0 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61  efault to the ma
1a2c0 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e  cro that redefin
1a2d0 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20  es fdatasync to 
1a2e0 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20  fsync.  */.  rc 
1a2f0 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c  = fsync(fd);.#el
1a300 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61  se .  rc = fdata
1a310 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53  sync(fd);.#if OS
1a320 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
1a330 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d  c==-1 && errno==
1a340 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72  ENOTSUP ){.    r
1a350 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
1a360 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
1a370 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69  VXWORKS */.#endi
1a380 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
1a390 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
1a3a0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
1a3b0 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
1a3c0 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
1a3d0 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
1a3e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a3f0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
1a400 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1a410 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1a420 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a  ontaining file z
1a430 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20  Filename..** If 
1a440 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64  successful, *pFd
1a450 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1a460 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72  pened file descr
1a470 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c  iptor and.** SQL
1a480 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1a490 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
1a4a0 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53  occurs, either S
1a4b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f  QLITE_NOMEM.** o
1a4c0 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r SQLITE_CANTOPE
1a4d0 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  N is returned an
1a4e0 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  d *pFd is set to
1a4f0 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a   an undefined.**
1a500 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1a510 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
1a520 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 75   descriptor is u
1a530 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65  sed for only one
1a540 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66   thing - to.** f
1a550 73 79 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f  sync() a directo
1a560 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ry to make sure 
1a570 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e  file creation an
1a580 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74  d deletion event
1a590 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64  s.** are flushed
1a5a0 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20   to disk.  Such 
1a5b0 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e  fsyncs are not n
1a5c0 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a  eeded on newer.*
1a5d0 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c  * journaling fil
1a5e0 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72  esystems, but ar
1a5f0 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c  e required on ol
1a600 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  der filesystems.
1a610 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a620 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72  ine can be overr
1a630 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20  idden using the 
1a640 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65  xSetSysCall inte
1a650 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62  rface..** The ab
1a660 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64  ility to overrid
1a670 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1a680 61 73 20 61 64 64 65 64 20 69 6e 20 73 75 70 70  as added in supp
1a690 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ort of the.** ch
1a6a0 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20  romium sandbox. 
1a6b0 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63   Opening a direc
1a6c0 74 6f 72 79 20 69 73 20 61 20 73 65 63 75 72 69  tory is a securi
1a6d0 74 79 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a  ty risk (we are.
1a6e0 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69  ** told) so maki
1a6f0 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65 61 62  ng it overrideab
1a700 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68  le allows the ch
1a710 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74  romium sandbox t
1a720 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69  o.** replace thi
1a730 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
1a740 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
1a750 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72    To make this r
1a760 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f  outine.** a no-o
1a770 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69  p, replace it wi
1a780 74 68 20 61 20 73 74 75 62 20 74 68 61 74 20 72  th a stub that r
1a790 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1a7a0 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   but leaves.** *
1a7b0 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67  pFd set to a neg
1a7c0 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  ative number..**
1a7d0 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1a7e0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1a7f0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1a800 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
1a810 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
1a820 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
1a830 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
1a840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
1a850 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
1a860 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1a870 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
1a880 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
1a890 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
1a8a0 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
1a8b0 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
1a8c0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1a8d0 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
1a8e0 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
1a8f0 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69  me);.  for(ii=(i
1a900 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  nt)strlen(zDirna
1a910 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69  me); ii>1 && zDi
1a920 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
1a930 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
1a940 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
1a950 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
1a960 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
1a970 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
1a980 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
1a990 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d  0);.    if( fd>=
1a9a0 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43  0 ){.#ifdef FD_C
1a9b0 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 6f 73 46  LOEXEC.      osF
1a9c0 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
1a9d0 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  , osFcntl(fd, F_
1a9e0 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
1a9f0 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
1aa00 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1aa10 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c  OPENDIR %-3d %s\
1aa20 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65  n", fd, zDirname
1aa30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1aa40 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74  *pFd = fd;.  ret
1aa50 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54  urn (fd>=0?SQLIT
1aa60 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f  E_OK:unixLogErro
1aa70 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
1aa80 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
1aa90 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f  zDirname));.}../
1aaa0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
1aab0 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
1aac0 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
1aad0 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
1aae0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
1aaf0 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
1ab00 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
1ab10 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
1ab20 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
1ab30 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
1ab40 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
1ab50 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
1ab60 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
1ab70 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
1ab80 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
1ab90 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
1aba0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1abb0 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
1abc0 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
1abd0 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
1abe0 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
1abf0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
1ac00 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1ac10 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
1ac20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
1ac30 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
1ac40 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
1ac50 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
1ac60 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
1ac70 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
1ac80 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
1ac90 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
1aca0 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
1acb0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
1acc0 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
1acd0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
1ace0 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
1acf0 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
1ad00 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1ad10 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
1ad20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
1ad30 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1ad40 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
1ad50 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
1ad60 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
1ad70 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
1ad80 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1ad90 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
1ada0 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
1adb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
1adc0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1add0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1ade0 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
1adf0 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
1ae00 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
1ae10 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
1ae20 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
1ae30 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1ae40 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
1ae50 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
1ae60 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
1ae70 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
1ae80 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
1ae90 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1aea0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
1aeb0 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
1aec0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1aed0 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
1aee0 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
1aef0 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
1af00 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1af10 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
1af20 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
1af30 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
1af40 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
1af50 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
1af60 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
1af70 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1af80 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1af90 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
1afa0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1afb0 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
1afc0 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
1afd0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20  le->h));.  rc = 
1afe0 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
1aff0 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
1b000 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
1b010 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1b020 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1b030 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
1b040 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1b050 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  o;.    return un
1b060 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1b070 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
1b080 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
1b090 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
1b0a0 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
1b0b0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1b0c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
1b0d0 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
1b0e0 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
1b0f0 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
1b100 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 61 6e  ne-time occurran
1b110 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
1b120 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
1b130 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
1b140 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
1b150 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
1b160 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
1b170 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
1b180 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
1b190 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
1b1a0 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
1b1b0 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
1b1c0 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
1b1d0 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
1b1e0 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
1b1f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
1b200 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
1b210 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
1b220 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
1b230 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
1b240 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
1b250 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
1b260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b270 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29  OK && dirfd>=0 )
1b280 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79  {.      full_fsy
1b290 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b  nc(dirfd, 0, 0);
1b2a0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
1b2b0 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64  ose(pFile, dirfd
1b2c0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
1b2d0 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74   }.    pFile->ct
1b2e0 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58  rlFlags &= ~UNIX
1b2f0 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
1b300 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b310 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
1b320 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
1b330 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
1b340 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1b350 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c  unixTruncate(sql
1b360 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1b370 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69  64 nByte){.  uni
1b380 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1b390 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
1b3a0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
1b3b0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
1b3c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1b3d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b3e0 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a  RR_TRUNCATE );..
1b3f0 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
1b400 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
1b410 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
1b420 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
1b430 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
1b440 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
1b450 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
1b460 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
1b470 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
1b480 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
1b490 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
1b4a0 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
1b4b0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1b4c0 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
1b4d0 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
1b4e0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1b4f0 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
1b500 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
1b510 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
1b520 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1b530 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1b540 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75    }..  rc = robu
1b550 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1b560 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42  le->h, (off_t)nB
1b570 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  yte);.  if( rc )
1b580 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
1b590 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1b5a0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1b5b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1b5c0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1b5d0 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1b5e0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
1b5f0 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se{.#ifndef NDEB
1b600 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  UG.    /* If we 
1b610 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1b620 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1b630 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1b640 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a  opposed to.    *
1b650 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1b660 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1b670 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1b680 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1b690 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  n a.    ** norma
1b6a0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1b6b0 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65   and we truncate
1b6c0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1b6d0 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a  o length,.    **
1b6e0 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c   that effectivel
1b6f0 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1b700 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54  ange counter.  T
1b710 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1b720 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73  .    ** when res
1b730 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73  toring a databas
1b740 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b  e using the back
1b750 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65  up API from a ze
1b760 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  ro-length.    **
1b770 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a   source..    */.
1b780 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
1b790 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
1b7a0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1b7b0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1b7c0 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20  trChng = 1;.    
1b7d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65  }.#endif..    re
1b7e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b7f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74    }.}../*.** Det
1b800 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
1b810 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
1b820 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
1b830 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1b840 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
1b850 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69  le *id, i64 *pSi
1b860 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
1b870 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1b880 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1b890 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
1b8a0 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
1b8b0 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69  ->h, &buf);.  Si
1b8c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1b8d0 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21  c=1 );.  if( rc!
1b8e0 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  =0 ){.    ((unix
1b8f0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1b900 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1b910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b920 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
1b930 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
1b940 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
1b950 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
1b960 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
1b970 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
1b980 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
1b990 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
1b9a0 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
1b9b0 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
1b9c0 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
1b9d0 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
1b9e0 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
1b9f0 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
1ba00 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
1ba10 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
1ba20 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
1ba30 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
1ba40 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
1ba50 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
1ba60 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
1ba70 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
1ba80 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
1ba90 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
1baa0 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
1bab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bac0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
1bad0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1bae0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1baf0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
1bb00 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
1bb10 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
1bb20 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
1bb30 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
1bb40 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
1bb50 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
1bb60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bb70 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1bb80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
1bb90 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
1bba0 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
1bbb0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1bbc0 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
1bbd0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1bbe0 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
1bbf0 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
1bc00 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
1bc10 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1bc20 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1bc30 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1bc40 69 74 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  it could be.** t
1bc50 68 61 74 20 74 68 65 20 66 69 6c 65 20 6e 65 65  hat the file nee
1bc60 64 73 20 74 6f 20 62 65 20 65 78 74 65 6e 64 65  ds to be extende
1bc70 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
1bc80 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
1bc90 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1bca0 53 49 5a 45 5f 48 49 4e 54 20 6f 70 65 72 61 74  SIZE_HINT operat
1bcb0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  ion is a no-op f
1bcc0 6f 72 20 55 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74  or Unix..*/.stat
1bcd0 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65  ic int fcntlSize
1bce0 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  Hint(unixFile *p
1bcf0 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29  File, i64 nByte)
1bd00 7b 0a 20 20 7b 20 2f 2a 20 70 72 65 73 65 72 76  {.  { /* preserv
1bd10 65 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 6f 66  e indentation of
1bd20 20 72 65 6d 6f 76 65 64 20 22 69 66 22 20 2a 2f   removed "if" */
1bd30 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd50 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1bd60 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1bd70 69 36 34 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20  i64 szChunk;    
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd90 20 43 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20   Chunk size */. 
1bda0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1bdb0 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1bdc0 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64   /* Used to hold
1bdd0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f   return values o
1bde0 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20  f fstat() */.   
1bdf0 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
1be00 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
1be10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1be20 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20  _IOERR_FSTAT;.. 
1be30 20 20 20 73 7a 43 68 75 6e 6b 20 3d 20 70 46 69     szChunk = pFi
1be40 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20  le->szChunk;.   
1be50 20 69 66 28 20 73 7a 43 68 75 6e 6b 3d 3d 30 20   if( szChunk==0 
1be60 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
1be70 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 65 6c 73   nByte;.    }els
1be80 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  e{.      nSize =
1be90 20 28 28 6e 42 79 74 65 2b 73 7a 43 68 75 6e 6b   ((nByte+szChunk
1bea0 2d 31 29 20 2f 20 73 7a 43 68 75 6e 6b 29 20 2a  -1) / szChunk) *
1beb0 20 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 7d 0a   szChunk;.    }.
1bec0 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
1bed0 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
1bee0 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  {..#if defined(H
1bef0 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1bf00 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53  ATE) && HAVE_POS
1bf10 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20  IX_FALLOCATE.   
1bf20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62     /* The code b
1bf30 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67  elow is handling
1bf40 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1bf50 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65  e of osFallocate
1bf60 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  () .      ** cor
1bf70 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61  rectly. posix_fa
1bf80 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66  llocate() is def
1bf90 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73  ined to "returns
1bfa0 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
1bfb0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61  , .      ** or a
1bfc0 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f  n error number o
1bfd0 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65  n  failure". See
1bfe0 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72   the manpage for
1bff0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1c000 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20     int err;.    
1c010 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72    do{.        er
1c020 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28  r = osFallocate(
1c030 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74  pFile->h, buf.st
1c040 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66  _size, nSize-buf
1c050 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20  .st_size);.     
1c060 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49   }while( err==EI
1c070 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  NTR );.      if(
1c080 20 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51   err ) return SQ
1c090 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1c0a0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a  ;.#else.      /*
1c0b0 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20   If the OS does 
1c0c0 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66  not have posix_f
1c0d0 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65  allocate(), fake
1c0e0 20 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20   it. First use. 
1c0f0 20 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74       ** ftruncat
1c100 65 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66  e() to set the f
1c110 69 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77  ile size, then w
1c120 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79  rite a single by
1c130 74 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  te to.      ** t
1c140 68 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20  he last byte in 
1c150 65 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69  each block withi
1c160 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  n the extended r
1c170 65 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20  egion. This.    
1c180 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
1c190 20 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20   technique used 
1c1a0 62 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c  by glibc to impl
1c1b0 65 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c  ement posix_fall
1c1c0 6f 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a  ocate().      **
1c1d0 20 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74   on systems that
1c1e0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
1c1f0 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20  eal fallocate() 
1c200 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20  system call..   
1c210 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1c220 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c  nBlk = buf.st_bl
1c230 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d  ksize;  /* File-
1c240 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a  system block siz
1c250 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
1c260 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
1c270 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f         /* Next o
1c280 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74  ffset to write t
1c290 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  o */..      if( 
1c2a0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1c2b0 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65  (pFile->h, nSize
1c2c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
1c2d0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1c2e0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
1c2f0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1c300 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1c310 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1c320 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1c330 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
1c340 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62      iWrite = ((b
1c350 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e  uf.st_size + 2*n
1c360 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e  Blk - 1)/nBlk)*n
1c370 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69  Blk-1;.      whi
1c380 6c 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65  le( iWrite<nSize
1c390 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1c3a0 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
1c3b0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72  Write(pFile, iWr
1c3c0 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  ite, "", 1);.   
1c3d0 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
1c3e0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
1c3f0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1c400 20 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b          iWrite +
1c410 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a  = nBlk;.      }.
1c420 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1c430 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1c440 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1c450 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
1c460 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
1c470 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
1c480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1c490 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
1c4a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1c4b0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1c4c0 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  g){.  unixFile *
1c4d0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1c4e0 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
1c4f0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1c500 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1c510 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1c520 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1c530 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
1c540 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c550 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c560 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
1c570 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
1c580 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
1c590 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1c5a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c5b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c5c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c5d0 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
1c5e0 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
1c5f0 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74  >szChunk = *(int
1c600 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72   *)pArg;.      r
1c610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c620 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c630 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1c640 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20  E_HINT: {.      
1c650 72 65 74 75 72 6e 20 66 63 6e 74 6c 53 69 7a 65  return fcntlSize
1c660 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36  Hint(pFile, *(i6
1c670 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 7d  4 *)pArg);.    }
1c680 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c690 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
1c6a0 41 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  AL: {.      int 
1c6b0 62 50 65 72 73 69 73 74 20 3d 20 2a 28 69 6e 74  bPersist = *(int
1c6c0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66  *)pArg;.      if
1c6d0 28 20 62 50 65 72 73 69 73 74 3c 30 20 29 7b 0a  ( bPersist<0 ){.
1c6e0 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70          *(int*)p
1c6f0 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
1c700 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
1c710 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 29 21  LE_PERSIST_WAL)!
1c720 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  =0;.      }else 
1c730 69 66 28 20 62 50 65 72 73 69 73 74 3d 3d 30 20  if( bPersist==0 
1c740 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1c750 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1c760 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
1c770 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _WAL;.      }els
1c780 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  e{.        pFile
1c790 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
1c7a0 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
1c7b0 57 41 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WAL;.      }.   
1c7c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c7d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  _OK;.    }.#ifnd
1c7e0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
1c7f0 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73   The pager calls
1c800 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20   this method to 
1c810 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68  signal that it h
1c820 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61  as done.    ** a
1c830 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   rollback and th
1c840 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1c850 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63  is therefore unc
1c860 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a  hanged and.    *
1c870 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73  * it hence it is
1c880 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e   OK for the tran
1c890 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63  saction change c
1c8a0 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20  ounter to be.   
1c8b0 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   ** unchanged.. 
1c8c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1c8d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1c8e0 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20  NCHANGED: {.    
1c8f0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1c900 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  )->dbUpdate = 0;
1c910 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c920 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1c930 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1c940 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1c950 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1c960 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
1c970 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
1c980 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20  LOCKPROXYFILE:. 
1c990 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
1c9a0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1c9b0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
1c9c0 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1c9d0 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20  l(id,op,pArg);. 
1c9e0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1c9f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1ca00 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1ca10 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1ca20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ca30 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f  ITE_FCNTL_SYNC_O
1ca40 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20 20 20  MITTED: {.      
1ca50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ca60 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70 20 2a 2f  ;  /* A no-op */
1ca70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ca80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
1ca90 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  UND;.}../*.** Re
1caa0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
1cab0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
1cac0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1cad0 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
1cae0 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
1caf0 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
1cb00 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
1cb10 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
1cb20 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
1cb30 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
1cb40 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
1cb50 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
1cb60 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
1cb70 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
1cb80 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
1cb90 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
1cba0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
1cbb0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
1cbc0 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
1cbd0 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
1cbe0 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
1cbf0 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
1cc00 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
1cc10 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
1cc20 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
1cc30 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1cc40 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1cc50 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1cc60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1cc70 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1cc80 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1cc90 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
1cca0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ccb0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1ccc0 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
1ccd0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ile. This is alw
1cce0 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a  ays 0 for unix..
1ccf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1cd00 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
1cd10 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
1cd20 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1cd30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1cd40 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1cd50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
1cd60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cd70 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  WAL.../*.** Obje
1cd80 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
1cd90 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d  sent an shared m
1cda0 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a  emory buffer.  .
1cdb0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69  **.** When multi
1cdc0 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
1cdd0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
1cde0 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61  me wal-index, ea
1cdf0 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73  ch thread.** has
1ce00 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d   its own unixShm
1ce10 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
1ce20 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  y all point to a
1ce30 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
1ce40 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78  .** of this unix
1ce50 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20  ShmNode object. 
1ce60 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1ce70 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20   each wal-index 
1ce80 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c  is opened.** onl
1ce90 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
1cea0 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75  ss..**.** Each u
1ceb0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1cec0 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  t is connected t
1ced0 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49  o a single unixI
1cee0 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
1cef0 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61  .** We could coa
1cf00 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63  lesce this objec
1cf10 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65  t into unixInode
1cf20 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77  Info, but that w
1cf30 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65  ould mean.** eve
1cf40 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61  ry open file tha
1cf50 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  t does not use s
1cf60 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e  hared memory (in
1cf70 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f   other words, mo
1cf80 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73  st.** open files
1cf90 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  ) would have to 
1cfa0 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69  carry around thi
1cfb0 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  s extra informat
1cfc0 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20  ion.  So.** the 
1cfd0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
1cfe0 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
1cff0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
1d000 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1d010 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e  ct.** and the un
1d020 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1d030 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79   is created only
1d040 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a   when needed..**
1d050 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
1d060 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
1d070 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
1d080 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
1d090 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
1d0a0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
1d0b0 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
1d0c0 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
1d0d0 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
1d0e0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1d0f0 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
1d100 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
1d110 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
1d120 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
1d130 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
1d140 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
1d150 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d  er unixShmNode.m
1d160 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
1d170 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  d or unixShmNode
1d180 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
1d190 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
1d1a0 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
1d1b0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
1d1c0 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
1d1d0 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
1d1e0 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
1d1f0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20  unixShmNode {.  
1d200 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
1d210 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e  Inode;     /* un
1d220 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74  ixInodeInfo that
1d230 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e   owns this SHM n
1d240 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
1d250 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
1d260 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
1d270 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
1d280 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
1d290 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
1d2a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d2b0 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  e mmapped file *
1d2c0 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d2e0 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
1d2f0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
1d300 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
1d310 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d320 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
1d330 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36  regions */.  u16
1d340 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
1d350 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1d360 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
1d370 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64  n */.  u8 isRead
1d380 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  only;           
1d390 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
1d3a0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72  d-only */.  char
1d3b0 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20   **apRegion;    
1d3c0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1d3d0 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64  of mapped shared
1d3e0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
1d3f0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
1d420 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
1d430 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
1d440 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
1d450 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1d460 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
1d470 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
1d480 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20   this */.#ifdef 
1d490 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
1d4a0 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  8 exclMask;     
1d4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1d4c0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
1d4d0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
1d4e0 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  8 sharedMask;   
1d4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1d500 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
1d510 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e  s held */.  u8 n
1d520 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
1d530 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
1d540 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d  vailable unixShm
1d550 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
1d560 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  dif.};../*.** St
1d570 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
1d580 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
1d590 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
1d5a0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
1d5b0 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
1d5c0 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
1d5d0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1d5e0 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
1d5f0 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
1d600 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
1d610 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
1d620 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
1d630 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
1d640 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a   unixShm.pFile.*
1d650 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a  *    unixShm.id.
1d660 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
1d670 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
1d680 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78  write.  The unix
1d690 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78  Shm.pFile->mutex
1d6a0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
1d6b0 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
1d6c0 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
1d6d0 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
1d6e0 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e  t unixShm {.  un
1d6f0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
1d700 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ode;     /* The 
1d710 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53  underlying unixS
1d720 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
1d730 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78  .  unixShm *pNex
1d740 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1d750 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69   Next unixShm wi
1d760 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78  th the same unix
1d770 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
1d780 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
1d790 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d7a0 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
1d7b0 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  nixShmNode mutex
1d7c0 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
1d7d0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1d7e0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
1d7f0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
1d800 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d820 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
1d830 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
1d840 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d850 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
1d880 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
1d890 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
1d8a0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1d8b0 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
1d8c0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1d8d0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
1d8e0 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
1d8f0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1d900 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a  K)*4)         /*
1d910 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
1d920 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
1d930 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49  _SHM_DMS    (UNI
1d940 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54  X_SHM_BASE+SQLIT
1d950 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a  E_SHM_NLOCK)  /*
1d960 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20   deadman switch 
1d970 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
1d980 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
1d990 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74  ocks for all byt
1d9a0 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72  es from ofst thr
1d9b0 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a  ough ofst+n-1..*
1d9c0 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b  *.** Locks block
1d9d0 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20   if the mask is 
1d9e0 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d  exactly UNIX_SHM
1d9f0 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62  _C and are non-b
1da00 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72  locking.** other
1da10 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1da20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65  int unixShmSyste
1da30 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d  mLock(.  unixShm
1da40 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20  Node *pShmNode, 
1da50 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
1da60 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
1da70 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
1da80 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  t */.  int lockT
1da90 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ype,          /*
1daa0 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43   F_UNLCK, F_RDLC
1dab0 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f  K, or F_WRLCK */
1dac0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
1dad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1dae0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c  st byte of the l
1daf0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a  ocking range */.
1db00 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20    int n         
1db10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1db20 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
1db30 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
1db40 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20  ct flock f;     
1db50 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61    /* The posix a
1db60 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20  dvisory locking 
1db70 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
1db80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1db90 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63  K;   /* Result c
1dba0 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29  ode form fcntl()
1dbb0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
1dbc0 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   to the unixShmN
1dbd0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
1dbe0 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
1dbf0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
1dc00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1dc10 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d  x_held(pShmNode-
1dc20 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e  >mutex) || pShmN
1dc30 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ode->nRef==0 );.
1dc40 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63  .  /* Shared loc
1dc50 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f  ks never span mo
1dc60 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65  re than one byte
1dc70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   */.  assert( n=
1dc80 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d  =1 || lockType!=
1dc90 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a  F_RDLCK );..  /*
1dca0 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69   Locks are withi
1dcb0 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73  n range */.  ass
1dcc0 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53  ert( n>=1 && n<S
1dcd0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
1dce0 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
1dcf0 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
1dd00 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1dd10 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
1dd20 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  ters */.    mems
1dd30 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&f, 0, sizeof
1dd40 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79  (f));.    f.l_ty
1dd50 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20  pe = lockType;. 
1dd60 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20     f.l_whence = 
1dd70 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e  SEEK_SET;.    f.
1dd80 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a  l_start = ofst;.
1dd90 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b      f.l_len = n;
1dda0 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  ..    rc = osFcn
1ddb0 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  tl(pShmNode->h, 
1ddc0 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20  F_SETLK, &f);.  
1ddd0 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29    rc = (rc!=(-1)
1dde0 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
1ddf0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1de00 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1de10 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74  e global lock st
1de20 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67  ate and do debug
1de30 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64   tracing */.#ifd
1de40 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1de50 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20    { u16 mask;.  
1de60 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
1de70 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d  CK "));.  mask =
1de80 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
1de90 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
1dea0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1deb0 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
1dec0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
1ded0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1dee0 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
1def0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1df00 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1df10 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1df20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1df30 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1df40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
1df50 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
1df60 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1df70 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
1df80 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
1df90 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
1dfa0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1dfb0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
1dfc0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
1dfd0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
1dfe0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
1dff0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
1e000 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1e010 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
1e020 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
1e030 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
1e040 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1e050 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
1e060 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
1e070 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
1e080 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
1e090 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
1e0a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
1e0b0 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
1e0c0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
1e0d0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
1e0e0 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
1e0f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
1e100 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
1e110 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e120 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
1e130 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
1e140 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e150 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
1e160 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
1e170 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
1e180 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
1e190 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
1e1a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
1e1b0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1e1c0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
1e1d0 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
1e1e0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
1e1f0 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a          .}.../*.
1e200 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
1e210 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  xShmNodeList lis
1e220 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
1e230 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64   with unixShmNod
1e240 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
1e250 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
1e260 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1e270 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
1e280 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
1e290 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
1e2a0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1e2b0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
1e2c0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
1e2d0 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a  Purge(unixFile *
1e2e0 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  pFd){.  unixShmN
1e2f0 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49  ode *p = pFd->pI
1e300 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
1e310 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
1e320 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
1e330 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d  f( p && p->nRef=
1e340 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
1e350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1e360 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e  pInode==pFd->pIn
1e370 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ode );.    sqlit
1e380 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1e390 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
1e3a0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
1e3b0 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
1e3c0 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1e3d0 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d         munmap(p-
1e3e0 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
1e3f0 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
1e400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e410 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1e420 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20  >apRegion[i]);. 
1e430 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e440 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1e450 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
1e460 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1e470 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1e480 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c  e(pFd, p->h, __L
1e490 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d  INE__);.      p-
1e4a0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  >h = -1;.    }. 
1e4b0 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
1e4c0 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
1e4d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1e4e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
1e4f0 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
1e500 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
1e510 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74  ed with open dat
1e520 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
1e530 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74  .  .** This part
1e540 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74  icular implement
1e550 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70  ation uses mmapp
1e560 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
1e570 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  The file used to
1e580 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65   implement share
1e590 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74  d-memory is in t
1e5a0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
1e5b0 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e  y.** as the open
1e5c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1e5d0 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
1e5e0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e  name as the open
1e5f0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1e600 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d  e with the "-shm
1e610 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20  " suffix added. 
1e620 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1e630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e640 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f  le.** is "/home/
1e650 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22  user1/config.db"
1e660 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74   then the file t
1e670 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61  hat is created a
1e680 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f  nd mmapped.** fo
1e690 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
1e6a0 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22  will be called "
1e6b0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
1e6c0 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a  ig.db-shm".  .**
1e6d0 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72  .** Another appr
1e6e0 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73  oach to is to us
1e6f0 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f  e files in /dev/
1e700 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20  shm or /dev/tmp 
1e710 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74  or an.** some ot
1e720 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e  her tmpfs mount.
1e730 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69   But if a file i
1e740 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
1e750 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20  rectory.** from 
1e760 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e770 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  e is used, then 
1e780 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73  differing access
1e790 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
1e7a0 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69  or a chroot() mi
1e7b0 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69  ght cause two di
1e7c0 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65  fferent processe
1e7d0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
1e7e0 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64   database to end
1e7f0 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72   up using differ
1e800 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68  ent files for sh
1e810 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a  ared memory - .*
1e820 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  * meaning that t
1e830 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c  heir memory woul
1e840 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  d not really be 
1e850 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69  shared - resulti
1e860 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  ng.** in databas
1e870 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e  e corruption.  N
1e880 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69  evertheless, thi
1e890 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61  s tmpfs file usa
1e8a0 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61  ge.** can be ena
1e8b0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
1e8c0 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c  time using -DSQL
1e8d0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1e8e0 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20  Y="/dev/shm".** 
1e8f0 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
1e900 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74  t.  The use of t
1e910 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
1e920 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
1e930 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72  time.** option r
1e940 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63  esults in an inc
1e950 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20  ompatible build 
1e960 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c  of SQLite;  buil
1e970 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20  ds of SQLite.** 
1e980 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72  that with differ
1e990 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  ing SQLITE_SHM_D
1e9a0 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67  IRECTORY setting
1e9b0 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  s attempt to use
1e9c0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74   the.** same dat
1e9d0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
1e9e0 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74  e same time, dat
1e9f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1ea00 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
1ea10 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49  result. The SQLI
1ea20 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1ea30 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1ea40 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  tion is consider
1ea50 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74  ed.** "unsupport
1ea60 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61  ed" and may go a
1ea70 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20  way in a future 
1ea80 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a  SQLite release..
1ea90 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
1eaa0 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
1eab0 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
1eac0 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
1ead0 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
1eae0 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
1eaf0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
1eb00 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
1eb10 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
1eb20 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
1eb30 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
1eb40 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
1eb50 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
1eb60 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  er cleared..**.*
1eb70 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
1eb80 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
1eb90 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67  (pDbFd) is using
1eba0 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22   the "unix-excl"
1ebb0 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61   VFS.** that mea
1ebc0 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75  ns that an exclu
1ebd0 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c  sive lock is hel
1ebe0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1ebf0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
1ec00 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1ec10 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74  esses are able t
1ec20 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1ec30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1ec40 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20  n.** that case, 
1ec50 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  we do not really
1ec60 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d   need shared mem
1ec70 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20  ory.  No shared 
1ec80 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69  memory.** file i
1ec90 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
1eca0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
1ecb0 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20  ll be simulated 
1ecc0 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79  with heap memory
1ecd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ece0 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
1ecf0 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  mory(unixFile *p
1ed00 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
1ed10 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20  unixShm *p = 0; 
1ed20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ed30 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1ed40 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
1ed50 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1ed60 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  *pShmNode;   /* 
1ed70 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1ed80 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1ed90 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1edc0 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
1edd0 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
1ede0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64       /* The inod
1edf0 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61  e of fd */.  cha
1ee00 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  r *zShmFilename;
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1ee30 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
1ee40 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
1ee50 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1ee60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1ee70 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
1ee80 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
1ee90 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1eea0 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
1eeb0 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
1eec0 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
1eed0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
1eee0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1eef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1ef00 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
1ef10 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
1ef20 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1ef30 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
1ef40 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1ef50 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
1ef60 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
1ef70 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e  exists. Reuse an
1ef80 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
1ef90 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43  ne if present. C
1efa0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
1efb0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
1efc0 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
1efd0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
1efe0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
1eff0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
1f000 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
1f010 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
1f020 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
1f030 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
1f040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1f050 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
1f060 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f070 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73  ..    /* Call fs
1f080 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  tat() to figure 
1f090 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69  out the permissi
1f0a0 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ons on the datab
1f0b0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20  ase file. If.   
1f0c0 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20   ** a new *-shm 
1f0d0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
1f0e0 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c   an attempt will
1f0f0 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61   be made to crea
1f100 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74  te it.    ** wit
1f110 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  h the same permi
1f120 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75  ssions. The actu
1f130 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74  al permissions t
1f140 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  he file is creat
1f150 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  ed.    ** with a
1f160 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  re subject to th
1f170 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20  e current umask 
1f180 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1f190 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
1f1a0 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
1f1b0 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72  ) && pInode->bPr
1f1c0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
1f1d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f1e0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1f1f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1f200 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23  en_err;.    }..#
1f210 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
1f220 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e  _DIRECTORY.    n
1f230 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69  ShmFilename = si
1f240 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f  zeof(SQLITE_SHM_
1f250 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30 3b  DIRECTORY) + 30;
1f260 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46  .#else.    nShmF
1f270 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69  ilename = 5 + (i
1f280 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d  nt)strlen(pDbFd-
1f290 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
1f2a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73      pShmNode = s
1f2b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
1f2c0 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1f2d0 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
1f2e0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1f2f0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
1f300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1f310 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1f320 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1f330 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
1f340 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
1f350 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20 20  (*pShmNode));.  
1f360 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    zShmFilename =
1f370 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
1f380 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
1f390 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
1f3a0 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
1f3b0 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
1f3c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
1f3d0 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
1f3e0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ilename, .      
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1f400 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1f410 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
1f420 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
1f440 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
1f450 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
1f460 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
1f470 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1f480 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
1f490 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  hmFilename, "%s-
1f4a0 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
1f4b0 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
1f4c0 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
1f4d0 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69  d->zPath, zShmFi
1f4e0 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
1f4f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
1f500 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
1f510 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1f520 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
1f530 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
1f540 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
1f550 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
1f560 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1f570 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1f580 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1f590 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1f5a0 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1f5b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f5c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1f5d0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1f5e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1f5f0 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
1f600 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
1f610 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
1f620 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
1f630 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52  Filename, O_RDWR
1f640 7c 4f 5f 43 52 45 41 54 2c 0a 20 20 20 20 20 20  |O_CREAT,.      
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f660 20 20 20 20 20 20 20 20 20 28 73 53 74 61 74 2e           (sStat.
1f670 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29  st_mode & 0777))
1f680 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
1f690 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20  Node->h<0 ){.   
1f6a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1f6b0 2a 7a 52 4f 3b 0a 20 20 20 20 20 20 20 20 7a 52  *zRO;.        zR
1f6c0 4f 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  O = sqlite3_uri_
1f6d0 70 61 72 61 6d 65 74 65 72 28 70 44 62 46 64 2d  parameter(pDbFd-
1f6e0 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
1f6f0 79 5f 73 68 6d 22 29 3b 0a 20 20 20 20 20 20 20  y_shm");.       
1f700 20 69 66 28 20 7a 52 4f 20 26 26 20 73 71 6c 69   if( zRO && sqli
1f710 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
1f720 4f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  O) ){.          
1f730 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f  pShmNode->h = ro
1f740 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69  bust_open(zShmFi
1f750 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  lename, O_RDONLY
1f760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 20 20 20 20 20 28 73 53 74 61 74 2e 73 74 5f        (sStat.st_
1f790 6d 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a 20  mode & 0777));. 
1f7a0 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1f7b0 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20  e->isReadonly = 
1f7c0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1f7d0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
1f7e0 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
1f7f0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
1f800 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1f810 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1f820 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  n", zShmFilename
1f830 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
1f840 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1f850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f860 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68  }.  .      /* Ch
1f870 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
1f880 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1f890 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
1f8a0 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
1f8b0 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
1f8c0 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1f8d0 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
1f8e0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1f8f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f900 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53  .      if( unixS
1f910 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1f920 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20  mNode, F_WRLCK, 
1f930 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
1f940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f950 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73         if( robus
1f960 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d  t_ftruncate(pShm
1f970 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20  Node->h, 0) ){. 
1f980 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
1f990 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1f9a0 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
1f9b0 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53   "ftruncate", zS
1f9c0 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
1f9d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f9e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f9f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fa00 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
1fa10 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1fa20 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58  e, F_RDLCK, UNIX
1fa30 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1fa40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1fa50 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
1fa60 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
1fa70 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
1fa80 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
1fa90 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
1faa0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
1fab0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
1fac0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
1fad0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
1fae0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
1faf0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
1fb00 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
1fb10 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
1fb20 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
1fb30 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
1fb40 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
1fb50 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
1fb60 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
1fb70 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
1fb80 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
1fb90 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
1fba0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
1fbb0 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
1fbc0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
1fbd0 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
1fbe0 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
1fbf0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1fc00 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1fc10 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1fc20 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1fc30 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1fc40 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1fc50 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1fc60 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1fc70 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1fc80 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1fc90 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1fca0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
1fcb0 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
1fcc0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1fcd0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1fce0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
1fcf0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
1fd00 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
1fd10 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
1fd20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1fd30 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1fd40 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1fd50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1fd60 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
1fd70 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
1fd80 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78  open_err:.  unix
1fd90 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
1fda0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
1fdb0 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
1fdc0 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
1fdd0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1fde0 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  (p);.  unixLeave
1fdf0 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
1fe00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1fe10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1fe20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
1fe30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
1fe40 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
1fe50 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
1fe60 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
1fe70 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1fe80 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
1fe90 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1fea0 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
1feb0 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
1fec0 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
1fed0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1fee0 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
1fef0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1ff00 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1ff10 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1ff20 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1ff30 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
1ff40 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1ff50 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1ff60 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61  the bExtend para
1ff70 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
1ff80 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1ff90 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
1ffa0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
1ffb0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
1ffc0 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
1ffd0 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
1ffe0 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
1fff0 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
20000 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
20010 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
20020 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
20030 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e  .** bExtend is n
20040 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
20050 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
20060 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
20070 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
20080 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
20090 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
200a0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
200b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
200c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
200d0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
200e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
200f0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
20100 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
20110 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
20120 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
20130 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
20140 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
20150 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
20160 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
20170 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
20180 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
20190 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
201a0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
201b0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
201c0 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28   int unixShmMap(
201d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
201e0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
201f0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
20200 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
20210 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
20220 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
20230 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
20240 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
20250 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20270 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
20280 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  gions */.  int b
20290 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20  Extend,         
202a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
202b0 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
202c0 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
202d0 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
202e0 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
202f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
20300 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
20310 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
20320 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
20330 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  d;.  unixShm *p;
20340 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
20350 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
20360 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20370 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61  .  /* If the sha
20380 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
20390 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
203a0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
203b0 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70   now. */.  if( p
203c0 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b  DbFd->pShm==0 ){
203d0 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70  .    rc = unixOp
203e0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
203f0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
20400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
20410 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
20420 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
20430 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
20440 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71  ->pShmNode;.  sq
20450 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20460 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
20470 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
20480 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
20490 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
204a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
204b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
204c0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
204d0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
204e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
204f0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
20500 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
20510 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
20520 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
20530 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
20540 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
20550 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
20560 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
20570 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
20580 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70  ){.    char **ap
20590 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
205a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
205b0 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61   apRegion[] arra
205c0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
205d0 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29  te = (iRegion+1)
205e0 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d  *szRegion;  /* M
205f0 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
20600 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
20610 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
20620 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
20630 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66      /* Used by f
20640 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70  stat() */..    p
20650 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
20660 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
20670 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
20680 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >h>=0 ){.      /
20690 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
206a0 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
206b0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
206c0 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
206d0 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a   space..      **
206e0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
206f0 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
20700 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
20710 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
20720 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  le is.      ** l
20730 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
20740 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
20750 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
20760 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20770 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64   osFstat(pShmNod
20780 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
20790 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
207a0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
207b0 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ZE;.        goto
207c0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
207d0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
207e0 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  f( sStat.st_size
207f0 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
20800 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
20810 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
20820 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
20830 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
20840 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  et to.        **
20850 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
20860 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
20870 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
20880 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
20890 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
208a0 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e         ** Altern
208b0 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74  atively, if bExt
208c0 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73 65  end is true, use
208d0 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
208e0 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 20  allocate.       
208f0 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
20900 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e  d memory region.
20910 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
20920 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64      if( !bExtend
20930 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
20940 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  out;.        if(
20950 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
20960 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e  e(pShmNode->h, n
20970 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
20980 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
20990 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
209a0 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72 75  R_SHMSIZE, "ftru
209b0 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20  ncate",.        
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
209e0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
209f0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
20a00 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
20a10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20a20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65     /* Map the re
20a30 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
20a40 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20  egion into this 
20a50 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
20a60 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  s space. */.    
20a70 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a  apNew = (char **
20a80 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
20a90 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
20aa0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69  de->apRegion, (i
20ab0 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
20ac0 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a  (char *).    );.
20ad0 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
20ae0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
20af0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
20b00 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
20b10 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
20b20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
20b30 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20  egion = apNew;. 
20b40 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64     while(pShmNod
20b50 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
20b60 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  ion){.      void
20b70 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66   *pMem;.      if
20b80 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
20b90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
20ba0 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65 67   = mmap(0, szReg
20bb0 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
20bc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
20bd0 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41  donly ? PROT_REA
20be0 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52  D : PROT_READ|PR
20bf0 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20  OT_WRITE, .     
20c00 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45         MAP_SHARE
20c10 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  D, pShmNode->h, 
20c20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
20c30 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20 20 20  n*szRegion.     
20c40 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
20c50 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c  ( pMem==MAP_FAIL
20c60 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
20c70 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
20c80 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
20c90 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70  HMMAP, "mmap", p
20ca0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
20cb0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
20cc0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
20cd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20cf0 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMem = sqlite3_m
20d00 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b  alloc(szRegion);
20d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
20d20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
20d30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
20d40 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  MEM;.          g
20d50 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
20d60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20d70 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
20d80 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
20d90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
20da0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70  Node->apRegion[p
20db0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
20dc0 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20  ] = pMem;.      
20dd0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
20de0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
20df0 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
20e00 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
20e10 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
20e20 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f      *pp = pShmNo
20e30 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65  de->apRegion[iRe
20e40 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
20e50 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
20e60 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
20e70 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72  >isReadonly && r
20e80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
20e90 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
20ea0 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NLY;.  sqlite3_m
20eb0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
20ec0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
20ed0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20ee0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
20ef0 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
20f00 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
20f10 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ment..**.** Note
20f20 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69   that the relati
20f30 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53  onship between S
20f40 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53  HAREd and EXCLUS
20f50 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c  IVE locks is a l
20f60 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65  ittle.** differe
20f70 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20  nt here than in 
20f80 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c  posix.  In xShmL
20f90 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67  ock(), one can g
20fa0 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a  o from unlocked.
20fb0 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64  ** to shared and
20fc0 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e   back or from un
20fd0 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73  locked to exclus
20fe0 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42  ive and back.  B
20ff0 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f  ut one may.** no
21000 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64  t go from shared
21010 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72   to exclusive or
21020 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20   from exclusive 
21030 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74  to shared..*/.st
21040 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
21050 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
21060 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
21070 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
21080 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
21090 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
210a0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
210c0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
210d0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
210e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
21110 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
21120 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
21130 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
21140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
21150 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
21160 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  e lock */.){.  u
21170 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
21180 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20   (unixFile*)fd; 
21190 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
211a0 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
211b0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e  d memory */.  un
211c0 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
211d0 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
211e0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
211f0 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
21200 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ocked */.  unixS
21210 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
21240 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
21250 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  s */.  unixShmNo
21260 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
21270 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20  ->pShmNode;  /* 
21280 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  The underlying f
21290 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69  ile iNode */.  i
212a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
212b0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
212c0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
212d0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
212e0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21300 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
21310 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
21320 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
21330 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
21340 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
21350 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
21360 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
21370 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
21380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  );.  assert( ofs
21390 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
213a0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
213b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
213c0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
213d0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
213e0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
213f0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
21400 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
21410 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
21420 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
21430 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
21440 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
21450 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
21460 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
21470 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
21480 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
21490 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
214a0 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
214b0 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
214c0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
214d0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
214e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
214f0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
21500 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
21510 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
21520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
21530 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
21540 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
21550 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
21560 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ..  mask = (1<<(
21570 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
21580 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fst);.  assert( 
21590 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
215a0 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
215b0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
215c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
215d0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
215e0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
215f0 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
21600 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
21610 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
21620 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
21630 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
21640 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
21650 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
21660 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
21670 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
21680 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
21690 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
216a0 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
216b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
216c0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
216d0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
216e0 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
216f0 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
21700 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
21710 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
21720 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
21730 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
21740 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
21750 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
21760 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
21770 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
21780 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66  ode, F_UNLCK, of
21790 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
217a0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
217b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
217c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
217d0 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
217e0 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
217f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
21810 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
21820 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
21830 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
21840 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
21850 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
21860 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
21870 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
21880 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
21890 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
218a0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
218b0 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
218c0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
218d0 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
218e0 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
218f0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
21900 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
21910 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
21920 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
21930 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
21940 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
21950 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
21960 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
21970 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
21980 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
21990 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
219a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
219b0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
219c0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
219d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
219e0 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
219f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21a00 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
21a10 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
21a20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
21a30 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
21a40 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
21a50 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
21a60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21a80 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
21a90 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
21aa0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
21ab0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
21ac0 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f  Node, F_RDLCK, o
21ad0 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
21ae0 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
21af0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
21b00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21b10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
21b20 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
21b30 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
21b40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
21b60 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
21b70 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
21b80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
21b90 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
21ba0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
21bb0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
21bc0 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
21bd0 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
21be0 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
21bf0 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
21c00 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
21c10 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
21c20 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
21c30 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
21c40 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
21c50 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
21c60 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
21c70 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
21c80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21c90 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
21ca0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
21cb0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
21cc0 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
21cd0 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
21ce0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
21cf0 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
21d00 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
21d10 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
21d20 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
21d30 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
21d40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21d50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21d60 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
21d70 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
21d80 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_WRLCK, ofst+UN
21d90 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
21da0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
21db0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21dc0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
21dd0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
21de0 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
21df0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
21e00 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
21e10 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
21e20 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
21e30 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
21e40 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
21e50 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
21e60 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
21e70 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
21e80 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64     p->id, getpid
21e90 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  (), p->sharedMas
21ea0 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  k, p->exclMask))
21eb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
21ec0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
21ed0 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
21ee0 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
21ef0 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
21f00 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ory.  .**.** All
21f10 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65   loads and store
21f20 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74  s begun before t
21f30 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20  he barrier must 
21f40 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a  complete before.
21f50 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73  ** any load or s
21f60 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72  tore begun after
21f70 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f   the barrier..*/
21f80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
21f90 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  xShmBarrier(.  s
21fa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21fc0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
21fd0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
21fe0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
21ff0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
22000 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e  ER(fd);.  unixEn
22010 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e  terMutex();.  un
22020 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
22030 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
22040 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
22050 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
22060 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
22070 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
22080 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
22090 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
220a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61   there is no sha
220b0 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
220c0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
220d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74  onnection then t
220e0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
220f0 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
22100 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
22110 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a  t unixShmUnmap(.
22120 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22130 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
22140 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
22150 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
22160 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  e */.  int delet
22170 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
22180 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
22190 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
221a0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  f true */.){.  u
221b0 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  nixShm *p;      
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
221d0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
221e0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
221f0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
22200 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
22210 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
22220 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
22230 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
22240 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  xShm **pp;      
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22260 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
22270 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
22280 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69  ions */.  unixFi
22290 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
222a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
222b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
222c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
222d0 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
222e0 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
222f0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
22300 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
22310 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
22320 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
22330 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  e;..  assert( pS
22340 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
22350 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
22360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
22370 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
22380 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
22390 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
223a0 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
223b0 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
223c0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
223d0 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
223e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
223f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
22400 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
22410 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
22420 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
22430 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
22440 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
22450 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
22460 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
22470 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
22480 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
22490 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
224a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
224b0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
224c0 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
224d0 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
224e0 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
224f0 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
22500 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
22510 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
22520 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69  le, too */.  uni
22530 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
22540 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
22550 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
22560 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
22570 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
22580 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
22590 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26  if( deleteFlag &
225a0 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  & pShmNode->h>=0
225b0 20 29 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d   ) osUnlink(pShm
225c0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
225d0 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72  ;.    unixShmPur
225e0 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20  ge(pDbFd);.  }. 
225f0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
22600 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
22610 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73  ITE_OK;.}...#els
22620 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  e.# define unixS
22630 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
22640 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
22650 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
22660 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a  nixShmBarrier 0.
22670 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
22680 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
22690 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
226a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
226b0 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
226c0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
226d0 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
226e0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
226f0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
22700 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
22710 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
22720 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
22730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22740 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
22750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22790 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64  */../*.** This d
227a0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
227b0 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
227c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
227d0 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a  ds objects that.
227e0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72  ** implement var
227f0 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  ious file lockin
22800 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49  g strategies.  I
22810 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  t also contains 
22820 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f  definitions.** o
22830 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  f "finder" funct
22840 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d  ions.  A finder-
22850 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
22860 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61   to locate the a
22870 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71  ppropriate.** sq
22880 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
22890 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61   object for a pa
228a0 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
228b0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70  e file.  The pAp
228c0 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f  pData.** field o
228d0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  f the sqlite3_vf
228e0 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72  s VFS objects ar
228f0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
22900 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a   be pointers to.
22910 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  ** the correct f
22920 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66  inder-function f
22930 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a  or that VFS..**.
22940 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66  ** Most finder f
22950 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
22960 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
22970 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
22980 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
22990 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74  t.  The only int
229a0 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d  eresting finder-
229b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f  function is auto
229c0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68  lockIoFinder, wh
229d0 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20  ich.** looks at 
229e0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
229f0 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ype and tries to
22a00 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20   guess the best 
22a10 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74  locking.** strat
22a20 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a  egy from that..*
22a30 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d  *.** For finder-
22a40 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f  funtion F, two o
22a50 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
22a60 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ed:.**.**    (1)
22a70 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72   The real finder
22a80 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20  -function named 
22a90 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a  "FImpt()"..**.**
22aa0 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61      (2) A consta
22ab0 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  nt pointer to th
22ac0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  is function name
22ad0 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a  d just "F"..**.*
22ae0 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
22af0 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20  o the F pointer 
22b00 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70  is used as the p
22b10 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f  AppData value fo
22b20 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73  r VFS.** objects
22b30 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
22b40 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66   this instead of
22b50 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74   letting pAppDat
22b60 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63  a point.** direc
22b70 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65  tly at the finde
22b80 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65  r-function since
22b90 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65   C90 rules preve
22ba0 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72  nt a void*.** fr
22bb0 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20  om be cast into 
22bc0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
22bd0 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63  er..**.**.** Eac
22be0 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
22bf0 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74  is macro generat
22c00 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a  es two objects:.
22c10 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e  **.**   *  A con
22c20 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  stant sqlite3_io
22c30 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
22c40 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74  call METHOD that
22c50 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   has locking.** 
22c60 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f       methods CLO
22c70 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
22c80 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a  , CKRESLOCK..**.
22c90 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d  **   *  An I/O m
22ca0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
22cb0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e  ction called FIN
22cc0 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73  DER that returns
22cd0 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20   a pointer.**   
22ce0 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44     to the METHOD
22cf0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70   object in the p
22d00 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a  revious bullet..
22d10 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  */.#define IOMET
22d20 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54  HODS(FINDER, MET
22d30 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c  HOD, VERSION, CL
22d40 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
22d50 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20  K, CKLOCK)      
22d60 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
22d70 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
22d80 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20  s METHOD = {    
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22db0 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20  .   VERSION,    
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22e00 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20     CLOSE,       
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e20 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  * xClose */     
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
22e50 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20    unixRead,     
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e70 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20   xRead */       
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
22ea0 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ec0 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
22ef0 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
22f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22f10 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
22f40 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20  nixSync,        
22f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
22f60 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ync */          
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
22f90 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  ixFileSize,     
22fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
22fb0 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  leSize */       
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43          \.   LOC
22fe0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
22ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
23000 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f         \.   UNLO
23030 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
23040 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
23050 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43        \.   CKLOC
23080 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
23090 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
230a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20  ReservedLock */ 
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
230d0 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
230e0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
230f0 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20  ntrol */        
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23110 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63      \.   unixSec
23120 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
23130 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
23140 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69     \.   unixDevi
23170 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
23180 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s,  /* xDeviceCa
23190 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61    \.   unixShmMa
231c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
231d0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23200 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63   \.   unixShmLoc
23210 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23220 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23250 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72  \.   unixShmBarr
23260 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
23270 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
23280 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
232a0 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  .   unixShmUnmap
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20  /* xShmUnmap */ 
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
232f0 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
23340 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
23350 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
23360 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e  FINDER##Impl(con
23370 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78  st char *z, unix
23380 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20  File *p){   \.  
23390 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
233a0 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41  (z); UNUSED_PARA
233b0 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
233e0 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20  eturn &METHOD;  
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23420 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20            \.}   
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
23480 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
23490 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
234a0 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73  nst FINDER)(cons
234b0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
234c0 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20   *p)    \.    = 
234d0 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f  FINDER##Impl;../
234e0 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c  *.** Here are al
234f0 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  l of the sqlite3
23500 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
23510 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20  cts for each of 
23520 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  the.** locking s
23530 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63  trategies.  Func
23540 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
23550 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  n pointers to th
23560 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61  ese methods.** a
23570 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e  re also created.
23580 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  .*/.IOMETHODS(. 
23590 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20   posixIoFinder, 
235a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
235b0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
235c0 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d  me */.  posixIoM
235d0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
235e0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
235f0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
23600 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20  ame */.  2,     
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
23630 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ory is enabled *
23640 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23660 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
23670 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23690 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
236a0 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
236c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
236d0 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
236e0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a  ervedLock     /*
236f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
23700 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
23710 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
23720 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
23730 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
23740 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
23750 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
23760 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
23770 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23780 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
23790 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
237b0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
237c0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
237d0 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
237e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
237f0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
23800 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
23810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
23820 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23830 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
23840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23850 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
23860 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
23870 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43  rvedLock   /* xC
23880 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23890 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
238a0 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
238b0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
238c0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
238d0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
238e0 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
238f0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
23900 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23910 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
23920 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
23930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23940 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
23950 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
23960 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
23970 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
23980 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
23990 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
239a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
239b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
239c0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
239d0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
239e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
239f0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
23a00 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63  edLock  /* xChec
23a10 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
23a20 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
23a30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
23a40 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
23a50 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
23a60 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69  ODS(.  flockIoFi
23a70 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
23a80 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
23a90 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ion name */.  fl
23aa0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
23ab0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
23ac0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
23ad0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
23ae0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23af0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
23b00 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
23b10 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  abled */.  flock
23b20 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
23b30 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
23b40 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
23b50 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
23b60 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
23b70 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55  thod */.  flockU
23b80 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
23b90 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
23ba0 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
23bb0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23bc0 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
23bd0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
23be0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
23bf0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
23c00 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
23c10 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
23c20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
23c30 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
23c40 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
23c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23c60 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
23c70 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
23c80 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ca0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
23cb0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
23cc0 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  emClose,        
23cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23ce0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
23cf0 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  emLock,         
23d00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
23d10 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
23d20 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  mUnlock,        
23d30 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
23d40 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
23d50 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
23d60 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
23d70 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
23d80 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
23d90 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
23da0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
23db0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
23dc0 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
23dd0 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65  DS(.  afpIoFinde
23de0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
23df0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
23e00 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  on name */.  afp
23e10 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
23e20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23e30 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23e40 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e60 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
23e70 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
23e80 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f  bled */.  afpClo
23e90 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
23ea0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
23eb0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63  thod */.  afpLoc
23ec0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23ed0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
23ee0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f  hod */.  afpUnlo
23ef0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23f00 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
23f10 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65  thod */.  afpChe
23f20 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
23f30 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
23f40 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
23f50 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
23f60 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
23f70 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
23f80 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
23f90 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
23fa0 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
23fb0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
23fc0 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
23fd0 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
23fe0 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
23ff0 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
24000 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
24010 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
24020 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
24030 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
24040 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
24050 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
24060 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
24070 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
24080 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
24090 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
240a0 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
240b0 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
240c0 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
240d0 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
240e0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
240f0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
24100 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
24110 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
24120 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
24130 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
24140 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
24150 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
24160 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
24170 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
24180 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
24190 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
241a0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
241b0 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
241c0 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
241d0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
241e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
241f0 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
24200 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
24210 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
24220 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
24230 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
24240 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
24250 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
24260 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
24270 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
24280 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
24290 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
242a0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
242b0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
242e0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
242f0 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
24300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24310 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
24320 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
24330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24340 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
24350 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
24360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
24370 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
24380 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
24390 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
243a0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
243b0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
243c0 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63  ndif../* nfs loc
243d0 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20  kd on OSX 10.3+ 
243e0 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72  doesn't clear wr
243f0 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61  ite locks when a
24400 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
24410 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  t */.#if defined
24420 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
24430 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
24440 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
24450 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e  HODS(.  nfsIoFin
24460 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
24470 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
24480 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
24490 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  nfsIoMethods,   
244a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
244b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
244c0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
244d0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244f0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
24500 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75   disabled */.  u
24510 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
24520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
24530 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
24540 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
24550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
24560 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
24570 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
24580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
24590 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
245a0 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
245b0 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
245c0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
245d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
245e0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
245f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
24600 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
24610 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
24620 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
24630 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
24640 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
24650 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
24660 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
24670 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
24680 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
24690 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
246a0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
246b0 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
246c0 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
246d0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
246e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
246f0 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
24700 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
24710 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24720 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
24730 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
24740 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
24750 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
24760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24770 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
24780 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
24790 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
247a0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
247b0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
247c0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
247d0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
247e0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
247f0 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
24800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
24810 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
24820 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
24830 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24840 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
24850 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
24860 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
24870 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
24880 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
24890 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
248a0 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
248b0 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
248c0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
248d0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
248e0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
248f0 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
24900 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
24910 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
24920 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
24930 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
24940 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
24950 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
24960 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
24970 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
24980 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
24990 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
249a0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
249b0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
249c0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
249d0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
249e0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
249f0 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
24a00 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
24a10 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
24a20 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
24a30 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
24a40 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
24a50 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
24a60 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
24a70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
24a80 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
24a90 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
24aa0 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
24ab0 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
24ac0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
24ad0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
24ae0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
24af0 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
24b00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
24b10 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
24b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24b30 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
24b40 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
24b50 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
24b60 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
24b70 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
24b80 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
24b90 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
24ba0 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
24bb0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
24bc0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
24bd0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
24be0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
24bf0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
24c00 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
24c10 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
24c20 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
24c30 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
24c40 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
24c50 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
24c60 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
24c70 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
24c80 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
24c90 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
24ca0 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
24cb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
24cc0 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
24cd0 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
24ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
24cf0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
24d00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
24d10 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
24d20 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
24d30 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
24d40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24d50 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
24d60 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
24d70 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
24d80 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
24d90 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
24da0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
24db0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
24dc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
24dd0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
24de0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
24df0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
24e00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
24e10 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
24e20 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
24e30 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
24e40 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
24e50 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
24e60 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
24e70 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
24e80 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
24e90 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
24ea0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
24eb0 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
24ec0 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
24ed0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
24ee0 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
24ef0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
24f00 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
24f10 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
24f20 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
24f30 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
24f40 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
24f50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24f60 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
24f70 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
24f80 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
24f90 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
24fa0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
24fb0 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
24fc0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
24fd0 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
24fe0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
24ff0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
25000 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
25010 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
25020 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
25030 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
25040 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
25050 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
25060 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
25070 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
25080 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
25090 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
250a0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
250b0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
250c0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
250d0 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
250e0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
250f0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
25100 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
25110 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
25120 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
25130 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
25140 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
25150 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
25160 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
25170 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
25180 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
25190 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
251a0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
251b0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
251c0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
251d0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
251e0 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
251f0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
25200 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
25210 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
25220 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
25230 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
25240 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
25250 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
25260 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  LE */../*.** An 
25270 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
25280 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
25290 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
252a0 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
252b0 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
252c0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
252d0 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
252e0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
252f0 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
25300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25340 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
25350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25360 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
25370 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
25380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25390 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
253a0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
253b0 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
253c0 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
253d0 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
253e0 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
253f0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
25400 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
25410 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
25420 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
25430 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
25440 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
25450 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
25460 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
25470 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
25480 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
25490 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
254a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
254b0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
254c0 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
254d0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
254e0 74 20 73 79 6e 63 44 69 72 2c 20 20 20 20 20 20  t syncDir,      
254f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
25500 20 73 79 6e 63 20 64 69 72 65 63 74 6f 72 79 20   sync directory 
25510 6f 6e 20 66 69 72 73 74 20 73 79 6e 63 20 2a 2f  on first sync */
25520 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25530 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72  *pId,      /* Wr
25540 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46  ite to the unixF
25550 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65  ile structure he
25560 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
25570 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
25580 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
25590 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
255a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b   */.  int noLock
255b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
255c0 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66   Omit locking if
255d0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69   true */.  int i
255e0 73 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  sDelete,        
255f0 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20     /* Delete on 
25600 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f  close if true */
25610 0a 20 20 69 6e 74 20 69 73 52 65 61 64 4f 6e 6c  .  int isReadOnl
25620 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  y          /* Tr
25630 75 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  ue if the file i
25640 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
25650 6c 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ly */.){.  const
25660 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
25670 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
25680 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
25690 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
256a0 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
256b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
256c0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
256d0 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
256e0 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69    /* Parameter i
256f0 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20  sDelete is only 
25700 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  used on vxworks.
25710 20 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78   Express this ex
25720 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68  plicitly .  ** h
25730 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63  ere to prevent c
25740 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
25750 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61   about unused pa
25760 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
25770 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
25780 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20  R(isDelete);..  
25790 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
257a0 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
257b0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
257c0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
257d0 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
257e0 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
257f0 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
25800 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
25810 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
25820 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
25830 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
25840 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
25850 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
25860 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
25870 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
25880 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
25890 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
258a0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
258b0 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
258c0 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
258d0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
258e0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
258f0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
25900 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
25910 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
25920 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
25930 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
25940 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
25950 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
25960 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20    pNew->zPath = 
25970 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28  zFilename;.  if(
25980 20 6d 65 6d 63 6d 70 28 70 56 66 73 2d 3e 7a 4e   memcmp(pVfs->zN
25990 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 2c  ame,"unix-excl",
259a0 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  10)==0 ){.    pN
259b0 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
259c0 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20  UNIXFILE_EXCL;. 
259d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
259e0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b  ->ctrlFlags = 0;
259f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 52 65 61  .  }.  if( isRea
25a00 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 4e 65  dOnly ){.    pNe
25a10 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
25a20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b  UNIXFILE_RDONLY;
25a30 0a 20 20 7d 0a 20 20 69 66 28 20 73 79 6e 63 44  .  }.  if( syncD
25a40 69 72 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ir ){.    pNew->
25a50 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
25a60 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
25a70 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
25a80 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d  KS.  pNew->pId =
25a90 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65   vxworksFindFile
25aa0 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  Id(zFilename);. 
25ab0 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d   if( pNew->pId==
25ac0 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20  0 ){.    noLock 
25ad0 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
25ae0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
25af0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f  #endif..  if( no
25b00 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
25b10 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c  kingStyle = &nol
25b20 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
25b30 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
25b40 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66  ingStyle = (**(f
25b50 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73  inder_type*)pVfs
25b60 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
25b70 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69  ename, pNew);.#i
25b80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
25b90 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
25ba0 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65    /* Cache zFile
25bb0 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b  name in the lock
25bc0 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50  ing context (AFP
25bd0 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65   and dotlock ove
25be0 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a  rride) for.    *
25bf0 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69  * proxyLock acti
25c00 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  vation is possib
25c10 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79  le (remote proxy
25c20 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20   is based on db 
25c30 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69  name).    ** zFi
25c40 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76  lename remains v
25c50 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20  alid until file 
25c60 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75  is closed, to su
25c70 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65  pport */.    pNe
25c80 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
25c90 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65  t = (void*)zFile
25ca0 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  name;.#endif.  }
25cb0 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  ..  if( pLocking
25cc0 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49  Style == &posixI
25cd0 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66  oMethods.#if def
25ce0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
25cf0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
25d00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
25d10 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
25d20 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74  yle == &nfsIoMet
25d30 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b  hods.#endif.  ){
25d40 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
25d50 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
25d60 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
25d70 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
25d80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
25d90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25da0 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
25db0 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e  r occured in fin
25dc0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c  dInodeInfo(), cl
25dd0 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
25de0 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a  criptor.      **
25df0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65   immediately, be
25e00 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74  fore releasing t
25e10 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e  he mutex. findIn
25e20 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61  odeInfo() may fa
25e30 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  il.      ** in t
25e40 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20  wo scenarios:.  
25e50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
25e60 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20    (a) A call to 
25e70 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a  fstat() failed..
25e80 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41        **   (b) A
25e90 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a   malloc failed..
25ea0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
25eb0 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d  * Scenario (b) m
25ec0 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  ay only occur if
25ed0 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20   the process is 
25ee0 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72  holding no other
25ef0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64  .      ** file d
25f00 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20  escriptors open 
25f10 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
25f20 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  . If there were 
25f30 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20  other file.     
25f40 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20   ** descriptors 
25f50 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  on this file, th
25f60 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75  en no malloc wou
25f70 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62  ld be required b
25f80 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49  y.      ** findI
25f90 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74  nodeInfo(). If t
25fa0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
25fb0 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66   it is quite saf
25fc0 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20  e to close.     
25fd0 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61   ** handle h - a
25fe0 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  s it is guarante
25ff0 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78  ed that no posix
26000 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72   locks will be r
26010 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a  eleased.      **
26020 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20   by doing so..  
26030 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
26040 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20  If scenario (a) 
26050 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72  caused the error
26060 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65   then things are
26070 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68   not so safe. Th
26080 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69  e.      ** impli
26090 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68  cit assumption h
260a0 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66  ere is that if f
260b0 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68  stat() fails, th
260c0 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20  ings are in.    
260d0 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68    ** such bad sh
260e0 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e  ape that droppin
260f0 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20  g a lock or two 
26100 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d  doesn't matter m
26110 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  uch..      */.  
26120 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
26130 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
26140 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d  __);.      h = -
26150 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  1;.    }.    uni
26160 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
26170 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   }..#if SQLITE_E
26180 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
26190 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
261a0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65  _APPLE__).  else
261b0 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
261c0 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  le == &afpIoMeth
261d0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46  ods ){.    /* AF
261e0 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  P locking uses t
261f0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
26200 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
26210 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
26220 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * the afpLocking
26230 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a  Context..    */.
26240 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
26250 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20  ntext *pCtx;.   
26260 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
26270 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73  ntext = pCtx = s
26280 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
26290 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
262a0 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20      if( pCtx==0 
262b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
262c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
262d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
262e0 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
262f0 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
26300 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
26310 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
26320 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
26330 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
26340 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
26350 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
26360 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
26370 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
26380 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  name. */.      p
26390 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46  Ctx->dbPath = zF
263a0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ilename;.      p
263b0 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  Ctx->reserved = 
263c0 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  0;.      srandom
263d0 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
263e0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
263f0 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e       rc = findIn
26400 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
26410 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
26420 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26440 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
26450 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
26460 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  xt);.        rob
26470 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
26480 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
26490 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
264a0 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78      }.      unix
264b0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20  LeaveMutex();   
264c0 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
264d0 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69  #endif..  else i
264e0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
264f0 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
26500 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
26510 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
26520 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
26530 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
26540 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
26550 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c  .    ** the dotl
26560 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
26570 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  t .    */.    ch
26580 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  ar *zLockFile;. 
26590 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
265a0 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20  ;.    nFilename 
265b0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
265c0 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
265d0 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63    zLockFile = (c
265e0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
265f0 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b  lloc(nFilename);
26600 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69  .    if( zLockFi
26610 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
26620 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
26630 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26640 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
26650 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
26660 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44  LockFile, "%s" D
26670 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a  OTLOCK_SUFFIX, z
26680 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
26690 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
266a0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63  ngContext = zLoc
266b0 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20  kFile;.  }..#if 
266c0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
266d0 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
266e0 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
266f0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
26700 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
26710 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
26720 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
26730 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
26740 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
26750 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
26760 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
26770 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
26780 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
26790 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
267a0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
267b0 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
267c0 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
267d0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e  >pInode->pSem==N
267e0 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ULL) ){.      ch
267f0 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70  ar *zSemName = p
26800 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
26810 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
26820 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
26830 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
26840 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
26850 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20  e, "/%s.sem",.  
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26870 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
26880 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
26890 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b  .      for( n=1;
268a0 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
268b0 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
268c0 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
268d0 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
268e0 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
268f0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
26900 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61   sem_open(zSemNa
26910 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36  me, O_CREAT, 066
26920 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  6, 1);.      if(
26930 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
26940 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45  Sem == SEM_FAILE
26950 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
26960 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
26970 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
26980 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30  node->aSemName[0
26990 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
269a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
269b0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
269c0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e  }.#endif.  .  pN
269d0 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ew->lastErrno = 
269e0 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  0;.#if OS_VXWORK
269f0 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  S.  if( rc!=SQLI
26a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
26a10 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
26a20 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
26a30 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d  LINE__);.    h =
26a40 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e   -1;.    osUnlin
26a50 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
26a60 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a    isDelete = 0;.
26a70 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65    }.  pNew->isDe
26a80 6c 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b  lete = isDelete;
26a90 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
26aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26ab0 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
26ac0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
26ad0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
26ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
26af0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
26b00 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
26b10 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
26b20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
26b40 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
26b50 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63  irectory in whic
26b60 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61  h to put tempora
26b70 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20  ry files..** If 
26b80 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70  no suitable temp
26b90 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63  orary file direc
26ba0 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e  tory can be foun
26bb0 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  d, return NULL..
26bc0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
26bd0 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69  char *unixTempFi
26be0 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73  leDir(void){.  s
26bf0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
26c00 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
26c10 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
26c20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
26c30 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
26c40 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
26c50 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c     0        /* L
26c60 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a  ist terminator *
26c70 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65  /.  };.  unsigne
26c80 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63  d int i;.  struc
26c90 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
26ca0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
26cb0 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d   0;..  azDirs[0]
26cc0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
26cd0 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 28  directory;.  if(
26ce0 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a   !azDirs[1] ) az
26cf0 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76  Dirs[1] = getenv
26d00 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f  ("TMPDIR");.  fo
26d10 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
26d20 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
26d30 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d  zDirs[0]); zDir=
26d40 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20  azDirs[i++]){.  
26d50 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
26d60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
26d70 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26  ( osStat(zDir, &
26d80 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
26d90 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
26da0 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
26db0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
26dc0 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72  f( osAccess(zDir
26dd0 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65  , 07) ) continue
26de0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
26df0 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a  .  return zDir;.
26e00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
26e10 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
26e20 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
26e30 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c  zBuf must be all
26e40 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
26e50 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73   calling process
26e60 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67   and must be big
26e70 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
26e80 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73  at least.** pVfs
26e90 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  ->mxPathname byt
26ea0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
26eb0 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  t unixGetTempnam
26ec0 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
26ed0 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
26ee0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
26ef0 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
26f00 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
26f10 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
26f20 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
26f30 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
26f40 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
26f50 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  89";.  unsigned 
26f60 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73  int i, j;.  cons
26f70 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20  t char *zDir;.. 
26f80 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
26f90 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
26fa0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
26fb0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
26fc0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
26fd0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
26fe0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
26ff0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
27000 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
27010 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
27020 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
27030 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
27040 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
27050 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78  ;..  zDir = unix
27060 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20  TempFileDir();. 
27070 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a   if( zDir==0 ) z
27080 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a  Dir = ".";..  /*
27090 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
270a0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
270b0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
270c0 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
270d0 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
270e0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
270f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27100 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  OR..  */.  if( (
27110 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73  strlen(zDir) + s
27120 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d  trlen(SQLITE_TEM
27130 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b  P_FILE_PREFIX) +
27140 20 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29   17) >= (size_t)
27150 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nBuf ){.    retu
27160 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
27170 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
27180 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
27190 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20  (nBuf-17, zBuf, 
271a0 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
271b0 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44  _FILE_PREFIX, zD
271c0 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e  ir);.    j = (in
271d0 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  t)strlen(zBuf);.
271e0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
271f0 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
27200 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
27210 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
27220 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
27230 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
27240 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
27250 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
27260 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
27270 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
27280 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65  j] = 0;.  }while
27290 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c  ( osAccess(zBuf,
272a0 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
272b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
272c0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
272d0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
272e0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
272f0 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
27300 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
27310 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
27320 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
27330 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
27340 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
27350 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
27360 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
27370 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
27380 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
27390 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
273a0 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
273b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
273c0 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
273d0 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
273e0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
273f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  if../*.** Search
27400 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
27410 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
27420 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  hat was opened o
27430 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
27440 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  ** file (not a j
27450 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72  ournal or master
27460 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69  -journal file) i
27470 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74  dentified by pat
27480 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77  hname.** zPath w
27490 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ith SQLITE_OPEN_
274a0 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69  XXX flags matchi
274b0 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20  ng those passed 
274c0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  as the second.**
274d0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
274e0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
274f0 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65  * Such a file de
27500 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69  scriptor may exi
27510 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65  st if a database
27520 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
27530 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68  closed.** but th
27540 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
27550 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75  e descriptor cou
27560 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ld not be closed
27570 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a   because some.**
27580 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
27590 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  riptor open on t
275a0 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20  he same file is 
275b0 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c  holding a file-l
275c0 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f  ock..** Refer to
275d0 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
275e0 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e   unixClose() fun
275f0 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65  ction and the le
27600 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  ngthy comment.**
27610 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73   describing "Pos
27620 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
27630 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72  ing" at the star
27640 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  t of this file f
27650 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64  or .** further d
27660 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69  etails. Also, ti
27670 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a  cket #4018..**.*
27680 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20  * If a suitable 
27690 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
276a0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69  is found, then i
276b0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  t is returned. I
276c0 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c  f no.** such fil
276d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
276e0 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72  located, -1 is r
276f0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
27700 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ic UnixUnusedFd 
27710 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28  *findReusableFd(
27720 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
27730 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  h, int flags){. 
27740 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
27750 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  Unused = 0;..  /
27760 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20  * Do not search 
27770 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
27780 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
27790 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65   vxworks. Not be
277a0 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72  cause.  ** vxwor
277b0 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e  ks would not ben
277c0 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68  efit from the ch
277d0 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20  ange (it might, 
277e0 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c  we're not sure),
277f0 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73  .  ** but becaus
27800 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74  e no way to test
27810 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
27820 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69   available. It i
27830 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e  s better .  ** n
27840 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b  ot to risk break
27850 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70  ing vxworks supp
27860 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65  ort for the sake
27870 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63   of such an obsc
27880 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72  ure .  ** featur
27890 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56  e.  */.#if !OS_V
278a0 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
278b0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
278d0 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74   Results of stat
278e0 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a  () call */..  /*
278f0 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d   A stat() call m
27900 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69  ay fail for vari
27910 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20  ous reasons. If 
27920 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74  this happens, it
27930 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20   is.  ** almost 
27940 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20  certain that an 
27950 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74  open() call on t
27960 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c  he same path wil
27970 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a  l also fail..  *
27980 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f  * For this reaso
27990 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  n, if an error o
279a0 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61  ccurs in the sta
279b0 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69  t() call here, i
279c0 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65  t is.  ** ignore
279d0 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75  d and -1 is retu
279e0 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
279f0 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65   will try to ope
27a00 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  n a new file.  *
27a10 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  * descriptor on 
27a20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66  the same path, f
27a30 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  ail, and return 
27a40 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69  an error to SQLi
27a50 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  te..  **.  ** Ev
27a60 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65  en if a subseque
27a70 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64  nt open() call d
27a80 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65  oes succeed, the
27a90 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66   consequences of
27aa0 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68  .  ** not search
27ab0 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73 61  ing for a resusa
27ac0 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
27ad0 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65  tor are not dire
27ae0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f  .  */.  if( 0==o
27af0 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53  sStat(zPath, &sS
27b00 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  tat) ){.    unix
27b10 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
27b20 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65  e;..    unixEnte
27b30 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49  rMutex();.    pI
27b40 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74  node = inodeList
27b50 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e  ;.    while( pIn
27b60 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e  ode && (pInode->
27b70 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61  fileId.dev!=sSta
27b80 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20  t.st_dev.       
27b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
27ba0 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e   pInode->fileId.
27bb0 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e  ino!=sStat.st_in
27bc0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e  o) ){.       pIn
27bd0 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ode = pInode->pN
27be0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
27bf0 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20  f( pInode ){.   
27c00 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
27c10 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  **pp;.      for(
27c20 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  pp=&pInode->pUnu
27c30 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70  sed; *pp && (*pp
27c40 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b  )->flags!=flags;
27c50 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
27c60 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75  xt));.      pUnu
27c70 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20  sed = *pp;.     
27c80 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
27c90 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55          *pp = pU
27ca0 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  nused->pNext;.  
27cb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27cc0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
27cd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20  ;.  }.#endif    
27ce0 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /* if !OS_VXWORK
27cf0 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55  S */.  return pU
27d00 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nused;.}../*.** 
27d10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
27d20 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f   called by unixO
27d30 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69  pen() to determi
27d40 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d  ne the unix perm
27d50 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72  issions.** to cr
27d60 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77  eate new files w
27d70 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ith. If no error
27d80 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
27d90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
27da0 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c  ned.** and a val
27db0 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ue suitable for 
27dc0 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74  passing as the t
27dd0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
27de0 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77   open(2) is.** w
27df0 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65  ritten to *pMode
27e00 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
27e10 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
27e20 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
27e30 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e   .** returned an
27e40 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
27e50 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64  pMode is not mod
27e60 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
27e70 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
27e80 70 65 6e 65 64 20 69 73 20 61 20 74 65 6d 70 6f  pened is a tempo
27e90 72 61 72 79 20 66 69 6c 65 2c 20 69 74 20 69 73  rary file, it is
27ea0 20 61 6c 77 61 79 73 20 63 72 65 61 74 65 64 20   always created 
27eb0 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f 63 74 61  with.** the octa
27ec0 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 30 36  l permissions 06
27ed0 30 30 20 28 72 65 61 64 2f 77 72 69 74 61 62 6c  00 (read/writabl
27ee0 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e 6c 79 29  e by owner only)
27ef0 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a  . If the file.**
27f00 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 6f   is a database o
27f10 72 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  r master journal
27f20 20 66 69 6c 65 2c 20 69 74 20 69 73 20 63 72 65   file, it is cre
27f30 61 74 65 64 20 77 69 74 68 20 74 68 65 20 70 65  ated with the pe
27f40 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 6d 61  rmissions .** ma
27f50 73 6b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  sk SQLITE_DEFAUL
27f60 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
27f70 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c  NS..**.** Finall
27f80 79 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  y, if the file b
27f90 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
27fa0 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
27fb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
27fc0 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
27fd0 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
27fe0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
27ff0 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
28000 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
28010 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
28020 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
28030 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
28040 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
28050 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
28060 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
28070 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
28080 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
28090 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
280a0 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
280b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
280c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
280d0 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
280e0 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
280f0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
28100 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
28110 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
28120 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
28130 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
28140 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
28150 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
28160 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
28170 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
28180 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
28190 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
281a0 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
281b0 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
281c0 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
281d0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
281e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
281f0 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
28200 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
28210 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
28220 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
28230 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
28240 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
28250 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
28260 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
28270 70 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  pMode           
28280 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
28290 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
282a0 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
282b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
282c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
282d0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
282e0 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65  Code */.  *pMode
282f0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
28300 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
28310 4e 53 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  NS;.  if( flags 
28320 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
28330 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
28340 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
28350 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58      char zDb[MAX
28360 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20  _PATHNAME+1];   
28370 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
28380 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
28390 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
283b0 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
283c0 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a  bytes in zDb */.
283d0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
283e0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
283f0 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73    /* Output of s
28400 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73  tat() on databas
28410 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  e file */..    /
28420 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74  * zPath is a pat
28430 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f  h to a WAL or jo
28440 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
28450 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
28460 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74  derives.    ** t
28470 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61  he path to the a
28480 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
28490 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61  se file from zPa
284a0 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68  th. This block h
284b0 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68  andles.    ** th
284c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69  e following nami
284d0 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a  ng conventions:.
284e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
284f0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
28500 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  urnal".    **   
28510 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
28520 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
28530 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
28540 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  lNN".    **   "<
28550 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e  path to db>-walN
28560 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N".    **.    **
28570 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 34   where NN is a 4
28580 20 64 69 67 69 74 20 64 65 63 69 6d 61 6c 20 6e   digit decimal n
28590 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61  umber. The NN na
285a0 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  ming schemes are
285b0 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79   .    ** used by
285c0 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70   the test_multip
285d0 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20  lex.c module..  
285e0 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73    */.    nDb = s
285f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
28600 50 61 74 68 29 20 2d 20 31 3b 20 0a 20 20 20 20  Path) - 1; .    
28610 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20  while( nDb>0 && 
28620 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
28630 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28  ) nDb--;.    if(
28640 20 6e 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e   nDb==0 ) return
28650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28660 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
28670 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
28680 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
28690 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74     if( 0==osStat
286a0 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
286b0 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
286c0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
286d0 30 37 37 37 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  0777;.    }else{
286e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
286f0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
28700 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
28710 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
28720 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
28730 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
28740 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20  e = 0600;.  }.  
28750 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28760 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
28770 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
28780 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
28790 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
287a0 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
287b0 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
287c0 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
287d0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
287e0 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
287f0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
28800 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
28810 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
28820 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
28830 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
28840 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
28850 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
28860 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
28870 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
28880 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
28890 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
288a0 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
288b0 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
288c0 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
288d0 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
288e0 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
288f0 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
28900 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
28910 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
28920 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
28930 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
28940 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
28950 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
28960 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
28970 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
28980 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
28990 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
289a0 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
289b0 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
289c0 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
289d0 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
289e0 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
289f0 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
28a00 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
28a10 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
28a20 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
28a30 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
28a40 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
28a50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
28a60 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
28a70 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
28a80 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
28a90 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
28aa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
28ab0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
28ac0 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
28ad0 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
28ae0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
28af0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
28b00 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
28b10 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
28b20 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
28b30 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
28b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28b50 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
28b60 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
28b70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
28b80 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
28b90 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
28ba0 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
28bb0 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
28bc0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
28bd0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
28be0 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
28bf0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
28c00 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
28c10 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
28c20 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
28c30 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
28c40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
28c50 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
28c60 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  to open() */.  i
28c70 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
28c80 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
28c90 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
28ca0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
28cb0 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
28cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28cd0 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e  e to omit lockin
28ce0 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a  g primitives */.
28cf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28d00 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
28d10 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
28d20 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn Code */..  i
28d30 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
28d40 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
28d50 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
28d60 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
28d70 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
28d80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
28d90 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
28da0 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
28db0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
28dc0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
28dd0 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
28de0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
28df0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
28e00 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
28e10 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
28e20 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
28e30 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53  EADWRITE);.#if S
28e40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28e50 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
28e60 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20   isAutoProxy  = 
28e70 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
28e80 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b  OPEN_AUTOPROXY);
28e90 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
28ea0 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
28eb0 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
28ec0 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
28ed0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
28ee0 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
28ef0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
28f00 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
28f10 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
28f20 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
28f30 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
28f40 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
28f50 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
28f60 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
28f70 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
28f80 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65  syncDir = (isCre
28f90 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
28fa0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28fb0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
28fc0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
28fd0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
28fe0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
28ff0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
29000 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
29010 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
29020 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
29030 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
29040 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
29050 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
29060 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
29070 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
29080 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
29090 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
290a0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
290b0 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
290c0 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+1];.  const c
290d0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
290e0 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
290f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
29100 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
29110 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
29120 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
29130 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
29140 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
29150 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
29160 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
29170 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
29180 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
29190 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
291a0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
291b0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
291c0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
291d0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
291e0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
291f0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
29200 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
29210 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
29220 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
29230 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
29240 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
29250 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
29260 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
29270 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
29280 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
29290 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
292a0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
292b0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
292c0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
292d0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
292e0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
292f0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
29300 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
29310 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
29320 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
29330 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
29340 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
29350 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
29360 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
29370 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
29380 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
29390 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
293a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
293b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
293c0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
293d0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
293e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
293f0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
29400 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
29410 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
29420 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
29430 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
29440 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
29450 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
29460 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
29470 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
29480 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
29490 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
294a0 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
294b0 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
294c0 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
294d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
294e0 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
294f0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29500 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
29510 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
29520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29530 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
29540 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
29550 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
29560 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
29570 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
29580 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
29590 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
295a0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
295b0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
295c0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
295d0 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
295e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
295f0 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  .  );..  memset(
29600 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
29610 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
29620 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29630 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
29640 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
29650 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
29660 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
29670 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
29680 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
29690 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
296a0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
296b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
296c0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
296d0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
296e0 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
296f0 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
29700 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
29710 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29730 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
29740 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20  Unused;.  }else 
29750 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
29760 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
29770 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
29780 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
29790 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
297a0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
297b0 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e  isDelete && !syn
297c0 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  cDir);.    rc = 
297d0 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
297e0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20  MAX_PATHNAME+1, 
297f0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
29800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29810 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29820 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
29830 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
29840 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
29850 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
29860 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
29870 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
29880 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
29890 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
298a0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
298b0 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
298c0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
298d0 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
298e0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
298f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
29900 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
29910 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
29920 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
29930 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
29940 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
29950 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
29960 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
29970 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
29980 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
29990 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
299a0 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
299b0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
299c0 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
299d0 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
299e0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
299f0 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
29a00 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
29a10 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
29a20 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64  NARY);..  if( fd
29a30 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
29a40 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
29a50 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69          /* Permi
29a60 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ssions to create
29a70 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
29a80 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74    rc = findCreat
29a90 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c  eFileMode(zName,
29aa0 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64   flags, &openMod
29ab0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
29ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29ad0 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70     assert( !p->p
29ae0 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20  Unused );.      
29af0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
29b00 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
29b10 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
29b20 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
29b30 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L );.      retur
29b40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
29b50 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
29b60 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
29b70 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
29b80 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
29b90 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c  X   %-3d %s 0%o\
29ba0 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f  n", fd, zName, o
29bb0 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  penFlags));.    
29bc0 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
29bd0 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52  o!=EISDIR && isR
29be0 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
29bf0 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
29c00 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
29c10 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
29c20 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
29c30 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
29c40 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67  y. */.      flag
29c50 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
29c60 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
29c70 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
29c80 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
29c90 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f  s &= ~(O_RDWR|O_
29ca0 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c  CREAT);.      fl
29cb0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
29cc0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
29cd0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
29ce0 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  O_RDONLY;.      
29cf0 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
29d00 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73        fd = robus
29d10 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
29d20 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
29d30 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
29d40 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
29d50 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
29d60 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
29d70 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
29d80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
29d90 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
29da0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
29db0 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
29dc0 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
29dd0 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
29de0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
29df0 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
29e00 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
29e10 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
29e20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
29e30 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
29e40 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
29e50 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
29e60 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
29e70 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73  me;.#else.    os
29e80 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23  Unlink(zName);.#
29e90 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51  endif.  }.#if SQ
29ea0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29eb0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65  ING_STYLE.  else
29ec0 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61  {.    p->openFla
29ed0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
29ee0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
29ef0 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20  ef FD_CLOEXEC.  
29f00 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45  osFcntl(fd, F_SE
29f10 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c  TFD, osFcntl(fd,
29f20 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
29f30 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
29f40 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  if..  noLock = e
29f50 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
29f60 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23  N_MAIN_DB;..  .#
29f70 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
29f80 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
29f90 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29fa0 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74  TYLE.  struct st
29fb0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69  atfs fsInfo;.  i
29fc0 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26  f( fstatfs(fd, &
29fd0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
29fe0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
29ff0 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72  )pFile)->lastErr
2a000 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2a010 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2a020 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2a030 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a040 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
2a050 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
2a060 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
2a070 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2a080 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
2a090 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
2a0a0 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
2a0b0 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
2a0c0 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
2a0d0 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .  .#if SQLITE_E
2a0e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2a0f0 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
2a100 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2a110 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
2a120 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
2a130 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
2a140 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
2a150 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
2a160 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
2a170 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
2a180 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
2a190 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2a1a0 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
2a1b0 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
2a1c0 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
2a1d0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2a1e0 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
2a1f0 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
2a200 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
2a210 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
2a220 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
2a230 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
2a240 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
2a250 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
2a260 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
2a270 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
2a280 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
2a290 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
2a2a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
2a2b0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
2a2c0 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50     if( statfs(zP
2a2d0 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
2a2e0 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   -1 ){.        /
2a2f0 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
2a300 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20   close(fd) call 
2a310 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20  is sub-optimal. 
2a320 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
2a330 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  ed.        ** wi
2a340 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62  th fd is a datab
2a350 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  ase file, and th
2a360 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f  ere are other co
2a370 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20  nnections open. 
2a380 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61         ** on tha
2a390 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
2a3a0 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e  currently holdin
2a3b0 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  g advisory locks
2a3c0 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20   on it,.        
2a3d0 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  ** then the call
2a3e0 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c   to close() will
2a3f0 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f   cancel those lo
2a400 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65  cks. In practice
2a410 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27  ,.        ** we'
2a420 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  re assuming that
2a430 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27   statfs() doesn'
2a440 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65  t fail very ofte
2a450 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20  n. At least.    
2a460 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65      ** not while
2a470 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2a480 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62  riptors opened b
2a490 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
2a4a0 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ss on.        **
2a4b0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61   the same file a
2a4c0 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a  re working.  */.
2a4d0 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45          p->lastE
2a4e0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2a4f0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2a500 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
2a510 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  __);.        rc 
2a520 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  = SQLITE_IOERR_A
2a530 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67  CCESS;.        g
2a540 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
2a550 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
2a560 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73   useProxy = !(fs
2a570 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
2a580 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  _LOCAL);.    }. 
2a590 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20     if( useProxy 
2a5a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  ){.      rc = fi
2a5b0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
2a5c0 73 2c 20 66 64 2c 20 73 79 6e 63 44 69 72 2c 20  s, fd, syncDir, 
2a5d0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
2a5e0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a600 69 73 44 65 6c 65 74 65 2c 20 69 73 52 65 61 64  isDelete, isRead
2a610 6f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 69 66 28  only);.      if(
2a620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a630 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2a640 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
2a650 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a  xFile((unixFile*
2a660 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22  )pFile, ":auto:"
2a670 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2a6a0 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c   unixClose to cl
2a6b0 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75  ean up the resou
2a6c0 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69  rces added in fi
2a6d0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20  llInUnixFile .  
2a6e0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
2a6f0 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72  lear all the str
2a700 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e  ucture's referen
2a710 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ces.  Specifical
2a720 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ly, .          *
2a730 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  * pFile->pMethod
2a740 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73  s will be NULL s
2a750 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  o sqlite3OsClose
2a760 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
2a770 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20   .          */. 
2a780 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f           unixClo
2a790 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
2a7a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2a7b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a7c0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  }.      goto ope
2a7d0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
2a7e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
2a7f0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
2a800 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
2a810 73 79 6e 63 44 69 72 2c 20 70 46 69 6c 65 2c 20  syncDir, pFile, 
2a820 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20  zPath, noLock,. 
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a840 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69       isDelete, i
2a850 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70 65 6e  sReadonly);.open
2a860 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
2a870 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2a890 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  ee(p->pUnused);.
2a8a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a8b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
2a8c0 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
2a8d0 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
2a8e0 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
2a8f0 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
2a900 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
2a910 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
2a920 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
2a930 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
2a940 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2a950 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
2a960 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
2a970 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
2a980 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
2a990 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2a9a0 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
2a9b0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2a9c0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
2a9d0 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
2a9e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
2a9f0 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
2aa00 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
2aa10 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
2aa20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2aa30 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
2aa40 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2aa50 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
2aa60 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
2aa70 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
2aa80 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
2aa90 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20  zPath)==(-1) && 
2aaa0 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
2aab0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
2aac0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2aad0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
2aae0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
2aaf0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2ab00 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
2ab10 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
2ab20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
2ab30 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
2ab40 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
2ab50 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
2ab60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
2ab70 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2ab80 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
2ab90 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20  )==-1 ).#else.  
2aba0 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
2abb0 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ) ).#endif.     
2abc0 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
2abd0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2abe0 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
2abf0 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50  YNC, "fsync", zP
2ac00 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
2ac10 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2ac20 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
2ac30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
2ac40 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
2ac50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
2ac60 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
2ac70 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
2ac80 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
2ac90 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
2aca0 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
2acb0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
2acc0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2acd0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2ace0 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
2acf0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
2ad00 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
2ad10 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
2ad20 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
2ad30 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
2ad40 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
2ad50 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2ad60 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
2ad70 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2ad80 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
2ad90 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2ada0 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
2adb0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
2adc0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
2add0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
2ade0 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
2adf0 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
2ae00 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
2ae10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2ae20 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
2ae30 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
2ae40 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
2ae50 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2ae60 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
2ae70 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
2ae80 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
2ae90 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
2aea0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
2aeb0 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
2aec0 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
2aed0 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65  /.){.  int amode
2aee0 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
2aef0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2af00 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
2af10 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2af20 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
2af30 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ; );.  switch( f
2af40 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
2af50 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2af60 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f  XISTS:.      amo
2af70 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20  de = F_OK;.     
2af80 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2af90 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2afa0 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
2afb0 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f  amode = W_OK|R_O
2afc0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
2afd0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2afe0 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
2aff0 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b     amode = R_OK;
2b000 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2b010 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2b020 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
2b030 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
2b040 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
2b050 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28  Out = (osAccess(
2b060 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
2b070 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  );.  if( flags==
2b080 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2b090 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74  ISTS && *pResOut
2b0a0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
2b0b0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28  tat buf;.    if(
2b0c0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2b0d0 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73  , &buf) && buf.s
2b0e0 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  t_size==0 ){.   
2b0f0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b     *pResOut = 0;
2b100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2b110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b120 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
2b130 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2b140 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
2b150 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
2b160 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
2b170 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
2b180 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
2b190 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
2b1a0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
2b1b0 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
2b1c0 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
2b1d0 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
2b1e0 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
2b1f0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
2b200 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
2b210 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
2b220 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
2b230 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
2b240 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
2b250 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
2b260 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2b270 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
2b280 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
2b290 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2b2a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2b2b0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
2b2c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b2d0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2b2e0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
2b2f0 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
2b300 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b320 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
2b330 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
2b340 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
2b350 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
2b360 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2b370 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
2b380 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
2b390 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
2b3a0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
2b3b0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
2b3c0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
2b3d0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
2b3e0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
2b3f0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
2b400 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
2b410 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
2b420 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
2b430 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
2b440 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
2b450 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
2b460 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
2b470 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
2b480 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
2b490 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2b4a0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2b4b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
2b4c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
2b4d0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
2b4e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b4f0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75  ER(pVfs);..  zOu
2b500 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27  t[nOut-1] = '\0'
2b510 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
2b520 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
2b530 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
2b540 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20  ut, zOut, "%s", 
2b550 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
2b560 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20  .    int nCwd;. 
2b570 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28     if( osGetcwd(
2b580 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30  zOut, nOut-1)==0
2b590 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b5a0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2b5b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2b5c0 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50  PT, "getcwd", zP
2b5d0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
2b5e0 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c  nCwd = (int)strl
2b5f0 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  en(zOut);.    sq
2b600 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2b610 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b  Out-nCwd, &zOut[
2b620 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50  nCwd], "/%s", zP
2b630 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ath);.  }.  retu
2b640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2b650 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2b660 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2b670 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
2b680 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
2b690 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
2b6a0 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
2b6b0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
2b6c0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
2b6d0 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
2b6e0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
2b6f0 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
2b700 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
2b710 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
2b720 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
2b730 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
2b740 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2b750 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2b760 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2b770 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
2b780 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
2b790 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
2b7a0 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
2b7b0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
2b7c0 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
2b7d0 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
2b7e0 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
2b7f0 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
2b800 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
2b810 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
2b820 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
2b830 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
2b840 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
2b850 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
2b860 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
2b870 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
2b880 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
2b890 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
2b8a0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
2b8b0 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
2b8c0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
2b8d0 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
2b8e0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
2b8f0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2b900 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2b910 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2b920 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Out){.  const ch
2b930 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53  ar *zErr;.  UNUS
2b940 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2b950 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74  Used);.  unixEnt
2b960 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72  erMutex();.  zEr
2b970 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20  r = dlerror();. 
2b980 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
2b990 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2b9a0 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c  f(nBuf, zBufOut,
2b9b0 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20   "%s", zErr);.  
2b9c0 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
2b9d0 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ex();.}.static v
2b9e0 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28  oid (*unixDlSym(
2b9f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2ba00 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63  Used, void *p, c
2ba10 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29  onst char*zSym))
2ba20 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20  (void){.  /* .  
2ba30 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64  ** GCC with -ped
2ba40 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79  antic-errors say
2ba50 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20  s that C90 does 
2ba60 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64  not allow a void
2ba70 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73  * to be.  ** cas
2ba80 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  t into a pointer
2ba90 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
2baa0 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62   And yet the lib
2bab0 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75  rary dlsym() rou
2bac0 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e  tine.  ** return
2bad0 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20  s a void* which 
2bae0 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
2baf0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2bb00 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65  n.  So how do we
2bb10 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28  .  ** use dlsym(
2bb20 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  ) with -pedantic
2bb30 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20  -errors?.  **.  
2bb40 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65  ** Variable x be
2bb50 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74  low is defined t
2bb60 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  o be a pointer t
2bb70 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  o a function tak
2bb80 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74  ing.  ** paramet
2bb90 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f  ers void* and co
2bba0 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65  nst char* and re
2bbb0 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65  turning a pointe
2bbc0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
2bbd0 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c  .  ** We initial
2bbe0 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69  ize x by assigni
2bbf0 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20  ng it a pointer 
2bc00 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66  to the dlsym() f
2bc10 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54  unction..  ** (T
2bc20 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72  hat assignment r
2bc30 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29  equires a cast.)
2bc40 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74    Then we call t
2bc50 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  he function that
2bc60 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74  .  ** x points t
2bc70 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  o.  .  **.  ** T
2bc80 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
2bc90 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77  is unlikely to w
2bca0 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e  ork correctly on
2bcb0 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72   any system wher
2bcc0 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c  e.  ** you reall
2bcd0 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20  y cannot cast a 
2bce0 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
2bcf0 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75   into void*.  Bu
2bd00 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20  t then, on the. 
2bd10 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20   ** other hand, 
2bd20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74  dlsym() will not
2bd30 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20   work on such a 
2bd40 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73  system either, s
2bd50 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e  o we have.  ** n
2bd60 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61  ot really lost a
2bd70 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  nything..  */.  
2bd80 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64  void (*(*x)(void
2bd90 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
2bda0 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  void);.  UNUSED_
2bdb0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2bdc0 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28  d);.  x = (void(
2bdd0 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  *(*)(void*,const
2bde0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64   char*))(void))d
2bdf0 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28  lsym;.  return (
2be00 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  *x)(p, zSym);.}.
2be10 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2be20 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
2be30 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
2be40 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
2be50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2be60 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63  (NotUsed);.  dlc
2be70 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
2be80 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
2be90 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
2bea0 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
2beb0 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
2bec0 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
2bed0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
2bee0 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
2bef0 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
2bf00 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
2bf10 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
2bf20 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
2bf30 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
2bf40 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
2bf50 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
2bf60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bf70 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73  unixRandomness(s
2bf80 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2bf90 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
2bfa0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
2bfb0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2bfc0 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72  otUsed);.  asser
2bfd0 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d  t((size_t)nBuf>=
2bfe0 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
2bff0 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
2c000 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
2c010 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
2c020 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
2c030 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
2c040 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
2c050 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
2c060 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
2c070 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
2c080 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
2c090 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
2c0a0 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
2c0b0 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
2c0c0 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
2c0d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
2c0e0 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
2c0f0 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
2c100 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
2c110 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
2c120 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
2c130 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
2c140 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
2c150 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
2c160 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
2c170 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
2c180 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
2c190 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
2c1a0 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
2c1b0 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
2c1c0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
2c1d0 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
2c1e0 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
2c1f0 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
2c200 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
2c210 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
2c220 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
2c230 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
2c240 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
2c250 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
2c260 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
2c270 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
2c280 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21   0, nBuf);.#if !
2c290 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2c2a0 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  EST).  {.    int
2c2b0 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64   pid, fd;.    fd
2c2c0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22   = robust_open("
2c2d0 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
2c2e0 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  _RDONLY, 0);.   
2c2f0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2c300 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
2c310 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
2c320 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
2c330 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
2c340 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70        pid = getp
2c350 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  id();.      memc
2c360 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
2c370 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  t)], &pid, sizeo
2c380 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61  f(pid));.      a
2c390 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29  ssert( sizeof(t)
2c3a0 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73  +sizeof(pid)<=(s
2c3b0 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20  ize_t)nBuf );.  
2c3c0 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f      nBuf = sizeo
2c3d0 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69  f(t) + sizeof(pi
2c3e0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
2c3f0 20 20 20 20 20 64 6f 7b 20 6e 42 75 66 20 3d 20       do{ nBuf = 
2c400 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c  osRead(fd, zBuf,
2c410 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20   nBuf); }while( 
2c420 6e 42 75 66 3c 30 20 26 26 20 65 72 72 6e 6f 3d  nBuf<0 && errno=
2c430 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
2c440 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
2c450 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2c460 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2c470 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d    return nBuf;.}
2c480 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
2c490 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
2c4a0 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
2c4b0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
2c4c0 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  ept..** The argu
2c4d0 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  ment is the numb
2c4e0 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
2c4f0 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c  ds we want to sl
2c500 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  eep..** The retu
2c510 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
2c520 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
2c530 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20  econds of sleep 
2c540 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75  actually.** requ
2c550 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75  ested from the u
2c560 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
2c570 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75  ing system, a nu
2c580 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69  mber which.** mi
2c590 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
2c5a0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2c5b0 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75  the argument, bu
2c5c0 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68  t not less.** th
2c5d0 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  an the argument.
2c5e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2c5f0 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nixSleep(sqlite3
2c600 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2c610 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  nt microseconds)
2c620 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
2c630 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2c640 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f  ec sp;..  sp.tv_
2c650 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e  sec = microsecon
2c660 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20  ds / 1000000;.  
2c670 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69  sp.tv_nsec = (mi
2c680 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30  croseconds % 100
2c690 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20  0000) * 1000;.  
2c6a0 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e  nanosleep(&sp, N
2c6b0 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ULL);.  UNUSED_P
2c6c0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2c6d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
2c6e0 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20  oseconds;.#elif 
2c6f0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
2c700 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
2c710 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
2c720 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  roseconds);.  UN
2c730 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2c740 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2c750 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
2c760 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f  #else.  int seco
2c770 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  nds = (microseco
2c780 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30  nds+999999)/1000
2c790 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63  000;.  sleep(sec
2c7a0 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
2c7b0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2c7c0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63  d);.  return sec
2c7d0 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65  onds*1000000;.#e
2c7e0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
2c7f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
2c800 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
2c810 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
2c820 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
2c830 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
2c840 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
2c850 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
2c860 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
2c870 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
2c880 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
2c890 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
2c8a0 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
2c8b0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
2c8c0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2c8d0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
2c8e0 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
2c8f0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2c900 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
2c910 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2c920 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2c930 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2c940 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2c950 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
2c960 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2c970 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
2c980 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
2c990 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
2c9a0 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
2c9b0 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
2c9c0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
2c9d0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
2c9e0 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
2c9f0 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
2ca00 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
2ca10 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
2ca20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
2ca30 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
2ca40 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
2ca50 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
2ca60 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
2ca70 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
2ca80 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
2ca90 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
2caa0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2cab0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
2cac0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
2cad0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2cae0 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
2caf0 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
2cb00 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2cb10 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
2cb20 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
2cb30 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
2cb40 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  000;.#if defined
2cb50 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
2cb60 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
2cb70 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28  t);.  *piNow = (
2cb80 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74  (sqlite3_int64)t
2cb90 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f  )*1000 + unixEpo
2cba0 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57  ch;.#elif OS_VXW
2cbb0 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
2cbc0 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63  mespec sNow;.  c
2cbd0 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f  lock_gettime(CLO
2cbe0 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e  CK_REALTIME, &sN
2cbf0 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  ow);.  *piNow = 
2cc00 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
2cc10 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2cc20 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
2cc30 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30  ow.tv_nsec/10000
2cc40 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  00;.#else.  stru
2cc50 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b  ct timeval sNow;
2cc60 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  .  gettimeofday(
2cc70 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69  &sNow, 0);.  *pi
2cc80 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
2cc90 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
2cca0 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
2ccb0 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  c + sNow.tv_usec
2ccc0 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  /1000;.#endif..#
2ccd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2cce0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
2ccf0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
2cd00 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
2cd10 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
2cd20 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
2cd30 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
2cd40 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
2cd50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2cd60 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
2cd70 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2cd80 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
2cd90 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
2cda0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
2cdb0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
2cdc0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
2cdd0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
2cde0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
2cdf0 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
2ce00 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
2ce10 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2ce20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
2ce30 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
2ce40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2ce50 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
2ce60 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2ce70 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  d, double *prNow
2ce80 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
2ce90 36 34 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50  64 i;.  UNUSED_P
2cea0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2ceb0 29 3b 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74  );.  unixCurrent
2cec0 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29  TimeInt64(0, &i)
2ced0 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38  ;.  *prNow = i/8
2cee0 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74  6400000.0;.  ret
2cef0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2cf00 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
2cf10 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
2cf20 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
2cf30 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
2cf40 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
2cf50 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
2cf60 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
2cf70 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
2cf80 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
2cf90 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
2cfa0 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
2cfb0 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
2cfc0 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
2cfd0 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
2cfe0 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
2cff0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
2d000 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
2d010 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
2d020 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
2d030 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2d040 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
2d050 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2d060 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
2d070 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
2d080 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
2d090 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2d0a0 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
2d0b0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2d0c0 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
2d0d0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
2d0e0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2d0f0 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
2d100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
2d110 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
2d120 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
2d130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d140 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2d150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d190 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
2d1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1e0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2d1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d200 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
2d210 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
2d220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d230 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
2d240 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
2d250 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
2d260 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
2d270 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
2d280 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
2d290 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
2d2a0 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
2d2b0 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
2d2c0 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
2d2d0 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
2d2e0 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
2d2f0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
2d300 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
2d310 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
2d320 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
2d330 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
2d340 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2d350 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
2d360 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
2d370 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
2d380 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
2d390 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
2d3a0 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
2d3b0 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
2d3c0 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
2d3d0 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
2d3e0 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
2d3f0 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
2d400 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
2d410 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
2d420 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
2d430 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
2d440 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
2d450 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
2d460 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2d470 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
2d480 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
2d490 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
2d4a0 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
2d4b0 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
2d4c0 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
2d4d0 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
2d4e0 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
2d4f0 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
2d500 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
2d510 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
2d520 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
2d530 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
2d540 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
2d550 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
2d560 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
2d570 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
2d580 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
2d590 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
2d5a0 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
2d5b0 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
2d5c0 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
2d5d0 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
2d5e0 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
2d5f0 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
2d600 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
2d610 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
2d620 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
2d630 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
2d640 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
2d650 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
2d660 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
2d670 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
2d680 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
2d690 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
2d6a0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
2d6b0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
2d6c0 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
2d6d0 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
2d6e0 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
2d6f0 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
2d700 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
2d710 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
2d720 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52  ..   ..**      R
2d730 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
2d740 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
2d750 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
2d760 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
2d770 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
2d780 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
2d790 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
2d7a0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2d7b0 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
2d7c0 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
2d7d0 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
2d7e0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
2d7f0 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
2d800 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
2d810 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
2d820 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
2d830 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
2d840 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
2d850 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
2d860 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
2d870 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
2d880 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
2d890 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
2d8a0 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
2d8b0 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
2d8c0 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
2d8d0 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
2d8e0 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
2d8f0 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
2d900 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
2d910 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
2d920 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
2d930 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
2d940 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
2d950 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
2d960 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
2d970 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
2d980 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
2d990 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
2d9a0 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
2d9b0 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
2d9c0 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
2d9d0 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
2d9e0 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
2d9f0 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
2da00 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
2da10 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
2da20 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
2da30 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
2da40 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
2da50 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
2da60 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
2da70 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
2da80 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
2da90 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
2daa0 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
2dab0 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
2dac0 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
2dad0 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
2dae0 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
2daf0 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
2db00 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
2db10 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
2db20 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
2db30 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
2db40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
2db50 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
2db60 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
2db70 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
2db80 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
2db90 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbb0 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
2dbc0 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
2dbd0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
2dbe0 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
2dbf0 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
2dc00 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70  CKPROXYFILE, &<p
2dc10 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
2dc20 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
2dc30 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
2dc40 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
2dc50 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
2dc60 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
2dc70 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2dc80 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2dc90 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
2dca0 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
2dcb0 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
2dcc0 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
2dcd0 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
2dce0 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
2dcf0 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
2dd00 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
2dd10 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
2dd20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
2dd30 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
2dd40 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
2dd50 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
2dd60 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
2dd70 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2dd80 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
2dd90 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
2dda0 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
2ddb0 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
2ddc0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
2ddd0 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
2dde0 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2ddf0 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
2de00 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
2de10 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
2de20 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
2de30 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
2de40 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
2de50 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
2de60 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
2de70 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
2de80 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
2de90 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
2dea0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
2deb0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2dec0 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
2ded0 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
2dee0 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
2def0 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
2df00 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
2df10 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
2df20 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
2df30 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
2df40 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
2df50 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
2df60 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
2df70 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
2df80 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
2df90 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
2dfa0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
2dfb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2dfc0 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
2dfd0 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
2dfe0 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
2dff0 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
2e000 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
2e010 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
2e020 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
2e030 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2e040 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
2e050 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
2e060 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
2e070 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
2e080 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
2e090 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
2e0a0 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
2e0b0 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
2e0c0 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
2e0d0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
2e0e0 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
2e0f0 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
2e100 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
2e110 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
2e120 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
2e130 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
2e140 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
2e150 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
2e160 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
2e170 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
2e180 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
2e190 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
2e1a0 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
2e1b0 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
2e1c0 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
2e1d0 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
2e1e0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
2e1f0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
2e200 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
2e210 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
2e220 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
2e230 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
2e240 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
2e250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2e260 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
2e270 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
2e280 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
2e290 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2e2a0 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e  ist, or it's con
2e2b0 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  tents do not mat
2e2c0 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49  ch the.** host I
2e2d0 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70  D and/or proxy p
2e2e0 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  ath, then the lo
2e2f0 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20  ck is escalated 
2e300 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  to an exclusive.
2e310 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ** lock and the 
2e320 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65  conch file conte
2e330 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77  nts is updated w
2e340 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20  ith the host ID 
2e350 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74  and proxy.** pat
2e360 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69  h and the lock i
2e370 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  s downgraded to 
2e380 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67  a shared lock ag
2e390 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e  ain.  If the con
2e3a0 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79  ch.** is held by
2e3b0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
2e3c0 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20   (with a shared 
2e3d0 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75  lock), the exclu
2e3e0 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c  sive lock.** wil
2e3f0 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54  l fail and SQLIT
2e400 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
2e410 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
2e420 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e  oxy file - a sin
2e430 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73  gle-byte file us
2e440 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73  ed for all advis
2e450 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a  ory file locks.*
2e460 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e  * normally taken
2e470 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2e480 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c   file.   This al
2e490 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68  lows for safe sh
2e4a0 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20  aring.** of the 
2e4b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
2e4c0 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  r multiple reade
2e4d0 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f  rs and writers o
2e4e0 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f  n the same.** ho
2e4f0 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e  st (the conch en
2e500 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20  sures that they 
2e510 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65  all use the same
2e520 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
2e530 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74  )..**.** Request
2e540 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f  ing the lock pro
2e550 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65  xy does not imme
2e560 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65  diately take the
2e570 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a   conch, it is.**
2e580 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e   only taken when
2e590 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65   the first reque
2e5a0 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62  st to lock datab
2e5b0 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65  ase file is made
2e5c0 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63  .  .** This matc
2e5d0 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63  hes the semantic
2e5e0 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69  s of the traditi
2e5f0 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68  onal locking beh
2e600 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20  avior, where.** 
2e610 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63  opening a connec
2e620 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61  tion to a databa
2e630 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  se file does not
2e640 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20   take a lock on 
2e650 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65  it..** The share
2e660 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70  d lock and an op
2e670 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
2e680 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65  or are maintaine
2e690 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20  d until .** the 
2e6a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
2e6b0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  e database is cl
2e6c0 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  osed. .**.** The
2e6d0 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20   proxy file and 
2e6e0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72  the lock file ar
2e6f0 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20  e never deleted 
2e700 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65  so they only nee
2e710 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74  d.** to be creat
2e720 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ed the first tim
2e730 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e  e they are used.
2e740 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  .**.** Configura
2e750 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20  tion options.** 
2e760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e770 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  -----.**.**  SQL
2e780 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2e790 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  _LOCKING.**.**  
2e7a0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2e7b0 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20  les accessed on 
2e7c0 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73  non-local file s
2e7d0 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20  ystems are.**   
2e7e0 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c      automaticall
2e7f0 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
2e800 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20   proxy locking, 
2e810 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a  lock files are.*
2e820 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75  *       named au
2e830 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e  tomatically usin
2e840 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63  g the same logic
2e850 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41   as.**       PRA
2e860 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  GMA lock_proxy_f
2e870 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20  ile=":auto:".** 
2e880 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50     .**  SQLITE_P
2e890 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a  ROXY_DEBUG.**.**
2e8a0 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74         Enables t
2e8b0 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72  he logging of er
2e8c0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72  ror messages dur
2e8d0 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65  ing host id file
2e8e0 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65  .**       retrie
2e8f0 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e  val and creation
2e900 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58  .**.**  LOCKPROX
2e910 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  YDIR.**.**      
2e920 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64   Overrides the d
2e930 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79  efault directory
2e940 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70   used for lock p
2e950 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a  roxy files that.
2e960 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d  **       are nam
2e970 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2e980 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a   via the ":auto:
2e990 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20  " setting.**.** 
2e9a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2e9b0 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
2e9c0 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  IONS.**.**      
2e9d0 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2e9e0 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  use when creatin
2e9f0 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f  g a directory fo
2ea00 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a  r storing the.**
2ea10 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78         lock prox
2ea20 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73  y files, only us
2ea30 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58  ed when LOCKPROX
2ea40 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e  YDIR is not set.
2ea50 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a  .**    .**    .*
2ea60 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61  * As mentioned a
2ea70 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69  bove, when compi
2ea80 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
2ea90 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2eaa0 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67  KING,.** setting
2eab0 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
2eac0 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45   variable SQLITE
2ead0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2eae0 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a  KING to 1 will.*
2eaf0 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f  * force proxy lo
2eb00 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  cking to be used
2eb10 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62   for every datab
2eb20 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  ase file opened,
2eb30 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66   and 0.** will f
2eb40 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70  orce automatic p
2eb50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
2eb60 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  be disabled for 
2eb70 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
2eb80 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79  files (explicity
2eb90 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
2eba0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2ebb0 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a  YFILE pragma or.
2ebc0 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63  ** sqlite_file_c
2ebd0 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f  ontrol API is no
2ebe0 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51  t affected by SQ
2ebf0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2ec00 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f  _LOCKING)..*/../
2ec10 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
2ec20 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
2ec30 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a  able on MacOSX .
2ec40 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2ec50 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2ec60 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ec70 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
2ec80 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  The proxyLocking
2ec90 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20  Context has the 
2eca0 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74  path and file st
2ecb0 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
2ecc0 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20   remote .** and 
2ecd0 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  local proxy file
2ece0 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64  s in it.*/.typed
2ecf0 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c  ef struct proxyL
2ed00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72  ockingContext pr
2ed10 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2ed20 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c  t;.struct proxyL
2ed30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
2ed40 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2ed50 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  hFile;         /
2ed60 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  * Open conch fil
2ed70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  e */.  char *con
2ed80 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20  chFilePath;     
2ed90 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2eda0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
2edb0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63  .  unixFile *loc
2edc0 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20  kProxy;         
2edd0 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f  /* Open proxy lo
2ede0 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
2edf0 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  r *lockProxyPath
2ee00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
2ee10 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  e of the proxy l
2ee20 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
2ee30 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
2ee40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2ee50 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
2ee60 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ile */.  int con
2ee70 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20  chHeld;         
2ee80 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68        /* 1 if th
2ee90 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c  e conch is held,
2eea0 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20   -1 if lockless 
2eeb0 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
2eec0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
2eed0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
2eee0 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
2eef0 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
2ef00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
2ef10 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
2ef20 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
2ef30 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
2ef40 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
2ef50 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
2ef60 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
2ef70 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
2ef80 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
2ef90 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
2efa0 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
2efb0 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
2efc0 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
2efd0 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
2efe0 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
2eff0 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
2f000 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
2f010 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
2f020 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
2f030 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
2f040 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
2f050 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
2f060 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
2f070 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
2f080 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
2f090 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
2f0a0 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
2f0b0 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
2f0c0 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
2f0d0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
2f0e0 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
2f0f0 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
2f100 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2f110 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
2f120 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
2f130 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
2f140 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
2f150 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
2f160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f170 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65  lPath, errno, ge
2f180 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20  tpid()));.      
2f190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2f1a0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  ERR_LOCK;.    }.
2f1b0 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
2f1c0 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65  t(lPath, "sqlite
2f1d0 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29  plocks", maxLen)
2f1e0 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65  ;    .  }.# else
2f1f0 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
2f200 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c  (lPath, "/tmp/",
2f210 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69   maxLen);.# endi
2f220 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  f.#endif..  if( 
2f230 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f  lPath[len-1]!='/
2f240 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  ' ){.    len = s
2f250 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f  trlcat(lPath, "/
2f260 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a  ", maxLen);.  }.
2f270 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72    .  /* transfor
2f280 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f  m the db path to
2f290 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20   a unique cache 
2f2a0 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20  name */.  dbLen 
2f2b0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
2f2c0 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d  Path);.  for( i=
2f2d0 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69  0; i<dbLen && (i
2f2e0 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78  +len+7)<(int)max
2f2f0 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Len; i++){.    c
2f300 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69  har c = dbPath[i
2f310 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c  ];.    lPath[i+l
2f320 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27  en] = (c=='/')?'
2f330 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74  _':c;.  }.  lPat
2f340 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20  h[i+len]='\0';. 
2f350 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
2f360 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e  ":auto:", maxLen
2f370 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47  );.  OSTRACE(("G
2f380 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  ETLOCKPATH  prox
2f390 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
2f3a0 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c  id=%d\n", lPath,
2f3b0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
2f3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f3d0 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61  .}../* . ** Crea
2f3e0 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  tes the lock fil
2f3f0 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e  e and any missin
2f400 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e  g directories in
2f410 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74   lockPath. */.st
2f420 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
2f430 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  eateLockPath(con
2f440 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74  st char *lockPat
2f450 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e  h){.  int i, len
2f460 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58  ;.  char buf[MAX
2f470 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20  PATHLEN];.  int 
2f480 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20  start = 0;.  .  
2f490 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21  assert(lockPath!
2f4a0 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79  =NULL);.  /* try
2f4b0 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74   to create all t
2f4c0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
2f4d0 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20  directories */. 
2f4e0 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c   len = (int)strl
2f4f0 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  en(lockPath);.  
2f500 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[0] = lockPat
2f510 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31  h[0];.  for( i=1
2f520 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a  ; i<len; i++ ){.
2f530 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68      if( lockPath
2f540 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69  [i] == '/' && (i
2f550 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b   - start > 0) ){
2f560 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d  .      /* only m
2f570 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72  kdir if leaf dir
2f580 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f   != "." or "/" o
2f590 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20  r ".." */.      
2f5a0 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c  if( i-start>2 ||
2f5b0 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20   (i-start==1 && 
2f5c0 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
2f5d0 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  ' && buf[start] 
2f5e0 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20  != '/') .       
2f5f0 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32    || (i-start==2
2f600 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
2f610 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
2f620 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b  rt+1] != '.') ){
2f630 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d  .        buf[i]=
2f640 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66  '\0';.        if
2f650 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c  ( mkdir(buf, SQL
2f660 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
2f670 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
2f680 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
2f690 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20  nt err=errno;.  
2f6a0 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21          if( err!
2f6b0 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20  =EEXIST ) {.    
2f6c0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
2f6d0 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
2f6e0 20 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e    FAILED creatin
2f6f0 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20  g %s, ".        
2f700 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25               "'%
2f710 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  s' proxy lock pa
2f720 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
2f730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f740 20 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72        buf, strer
2f750 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61  ror(err), lockPa
2f760 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2f770 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2f780 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20  rn err;.        
2f790 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
2f7b0 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t=i+1;.    }.   
2f7c0 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61   buf[i] = lockPa
2f7d0 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54  th[i];.  }.  OST
2f7e0 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
2f7f0 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
2f800 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
2f810 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67  \n", lockPath, g
2f820 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74  etpid()));.  ret
2f830 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2f840 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
2f850 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2f860 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
2f870 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
2f880 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
2f890 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
2f8a0 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
2f8b0 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
2f8c0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
2f8d0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
2f8e0 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
2f8f0 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
2f900 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2f910 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
2f920 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
2f930 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
2f940 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
2f950 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
2f960 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2f970 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
2f980 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
2f990 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
2f9a0 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
2f9b0 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
2f9c0 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
2f9d0 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
2f9e0 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
2f9f0 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
2fa00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
2fa10 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
2fa20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
2fa30 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
2fa40 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
2fa50 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
2fa60 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
2fa70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
2fa80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2fa90 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
2faa0 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
2fab0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
2fac0 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
2fad0 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
2fae0 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2faf0 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
2fb00 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
2fb10 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
2fb20 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
2fb30 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
2fb40 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
2fb50 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
2fb60 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
2fb70 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
2fb80 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
2fb90 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
2fba0 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
2fbb0 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
2fbc0 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
2fbd0 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
2fbe0 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
2fbf0 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
2fc00 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
2fc10 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
2fc20 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
2fc30 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
2fc40 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
2fc50 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
2fc60 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
2fc70 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
2fc80 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
2fc90 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2fca0 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
2fcb0 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
2fcc0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2fcd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2fce0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
2fcf0 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f  0 ){.    fd = ro
2fd00 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
2fd10 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
2fd20 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2fd30 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
2fd40 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
2fd50 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
2fd60 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
2fd70 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
2fd80 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
2fd90 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
2fda0 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
2fdb0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
2fdc0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
2fdd0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2fde0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2fdf0 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2fe00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2fe10 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
2fe20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20      openFlags = 
2fe30 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64  O_RDONLY;.    fd
2fe40 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
2fe50 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
2fe60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2fe70 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2fe80 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
2fe90 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rrno;.  }.  if( 
2fea0 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20  fd<0 ){.    if( 
2feb0 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
2fec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fed0 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
2fee0 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f    switch (terrno
2fef0 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45  ) {.      case E
2ff00 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72  ACCES:.        r
2ff10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
2ff20 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49  M;.      case EI
2ff30 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  O: .        retu
2ff40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2ff50 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68  LOCK; /* even th
2ff60 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63  ough it is the c
2ff70 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65  onch */.      de
2ff80 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72  fault:.        r
2ff90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
2ffa0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2ffb0 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20  }.  }.  .  pNew 
2ffc0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71  = (unixFile *)sq
2ffd0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2ffe0 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
2fff0 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b  f( pNew==NULL ){
30000 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
30010 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
30020 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78   end_create_prox
30030 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  y;.  }.  memset(
30040 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
30050 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e  unixFile));.  pN
30060 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  ew->openFlags = 
30070 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d  openFlags;.  mem
30080 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30  set(&dummyVfs, 0
30090 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66  , sizeof(dummyVf
300a0 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e  s));.  dummyVfs.
300b0 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64  pAppData = (void
300c0 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
300d0 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e  der;.  dummyVfs.
300e0 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b  zName = "dummy";
300f0 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  .  pUnused->fd =
30100 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e   fd;.  pUnused->
30110 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  flags = openFlag
30120 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73  s;.  pNew->pUnus
30130 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
30140 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
30150 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73  ixFile(&dummyVfs
30160 2c 20 66 64 2c 20 30 2c 20 28 73 71 6c 69 74 65  , fd, 0, (sqlite
30170 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61  3_file*)pNew, pa
30180 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  th, 0, 0, 0);.  
30190 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
301a0 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
301b0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
301c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
301d0 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
301e0 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
301f0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
30200 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
30210 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
30220 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
30230 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
30240 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
30250 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
30260 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
30270 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
30280 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
30290 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
302a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
302b0 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
302c0 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
302d0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
302e0 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
302f0 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
30300 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77  h */../* Not alw
30310 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ays defined in t
30320 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74  he headers as it
30330 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a   ought to be */.
30340 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f  extern int getho
30350 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64  stuuid(uuid_t id
30360 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  , const struct t
30370 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a  imespec *wait);.
30380 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74  ./* get the host
30390 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75   ID via gethostu
303a0 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d  uid(), pHostID m
303b0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f  ust point to PRO
303c0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a  XY_HOSTIDLEN .**
303d0 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62   bytes of writab
303e0 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
303f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
30400 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64  tHostID(unsigned
30410 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20   char *pHostID, 
30420 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  int *pError){.  
30430 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53  assert(PROXY_HOS
30440 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66  TIDLEN == sizeof
30450 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d  (uuid_t));.  mem
30460 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20  set(pHostID, 0, 
30470 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
30480 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
30490 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAX_OS_X_VERSION
304a0 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a  _MIN_REQUIRED)\.
304b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
304c0 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52  & __MAC_OS_X_VER
304d0 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45  SION_MIN_REQUIRE
304e0 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73  D<1050.  {.    s
304f0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
30500 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
30510 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
30520 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
30530 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
30540 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
30550 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
30560 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
30570 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
30580 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
30590 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
305a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
305b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
305c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
305d0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
305e0 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61  TEST.  /* simula
305f0 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
30600 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
30610 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
30620 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20   paths */.  if( 
30630 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
30640 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48  um != 0){.    pH
30650 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72  ostID[0] = (char
30660 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28  )(pHostID[0] + (
30670 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f  char)(sqlite3_ho
30680 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29  stid_num & 0xFF)
30690 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
306a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
306b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  _OK;.}../* The c
306c0 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69  onch file contai
306d0 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68  ns the header, h
306e0 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20  ost id and lock 
306f0 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64  file path. */.#d
30700 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43  efine PROXY_CONC
30710 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20  HVERSION 2   /* 
30720 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31  1-byte header, 1
30730 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20  6-byte host id, 
30740 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  path */.#define 
30750 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20  PROXY_HEADERLEN 
30760 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20     1   /* conch 
30770 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67  file header leng
30780 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
30790 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20  OXY_PATHINDEX   
307a0 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
307b0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
307c0 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  N).#define PROXY
307d0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50  _MAXCONCHLEN  (P
307e0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
307f0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d  ROXY_HOSTIDLEN+M
30800 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a  AXPATHLEN)../* .
30810 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e  ** Takes an open
30820 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70   conch file, cop
30830 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ies the contents
30840 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61   to a new path a
30850 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a  nd then moves .*
30860 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20  * it back.  The 
30870 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69  newly created fi
30880 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69  le's file descri
30890 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64  ptor is assigned
308a0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68   to the.** conch
308b0 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
308c0 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20  and finally the 
308d0 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66  original conch f
308e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
308f0 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52  s .** closed.  R
30900 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73  eturns zero if s
30910 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74  uccessful..*/.st
30920 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72  atic int proxyBr
30930 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  eakConchLock(uni
30940 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
30950 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a  id_t myHostID){.
30960 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
30970 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
30980 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
30990 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
309a0 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
309b0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
309c0 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
309d0 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61  File;.  char tPa
309e0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
309f0 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59    char buf[PROXY
30a00 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
30a10 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70   char *cPath = p
30a20 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
30a30 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61  th;.  size_t rea
30a40 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65  dLen = 0;.  size
30a50 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a  _t pathLen = 0;.
30a60 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34    char errmsg[64
30a70 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64  ] = "";.  int fd
30a80 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
30a90 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50  = -1;.  UNUSED_P
30aa0 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49  ARAMETER(myHostI
30ab0 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65  D);..  /* create
30ac0 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72   a new path by r
30ad0 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c  eplace the trail
30ae0 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74  ing '-conch' wit
30af0 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20  h '-break' */.  
30b00 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70  pathLen = strlcp
30b10 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20  y(tPath, cPath, 
30b20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69  MAXPATHLEN);.  i
30b30 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41  f( pathLen>MAXPA
30b40 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e  THLEN || pathLen
30b50 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72  <6 || .     (str
30b60 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68  lcpy(&tPath[path
30b70 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c  Len-5], "break",
30b80 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20   6) != 5) ){.   
30b90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30ba0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
30bb0 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72  ,errmsg,"path er
30bc0 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
30bd0 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  nt)pathLen);.   
30be0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
30bf0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65  ock;.  }.  /* re
30c00 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e  ad the conch con
30c10 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65  tent */.  readLe
30c20 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
30c30 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50  hFile->h, buf, P
30c40 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
30c50 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64  , 0);.  if( read
30c60 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len<PROXY_PATHIN
30c70 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEX ){.    sqlit
30c80 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
30c90 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73  of(errmsg),errms
30ca0 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c  g,"read error (l
30cb0 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61  en %d)",(int)rea
30cc0 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dLen);.    goto 
30cd0 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
30ce0 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74   }.  /* write it
30cf0 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70   out to the temp
30d00 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65  orary break file
30d10 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73   */.  fd = robus
30d20 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f  t_open(tPath, (O
30d30 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f  _RDWR|O_CREAT|O_
30d40 45 58 43 4c 29 2c 0a 20 20 20 20 20 20 20 20 20  EXCL),.         
30d50 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
30d60 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
30d70 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
30d80 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71  ( fd<0 ){.    sq
30d90 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
30da0 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
30db0 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66  rrmsg, "create f
30dc0 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
30dd0 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
30de0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
30df0 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65 28  .  if( osPwrite(
30e00 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e  fd, buf, readLen
30e10 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74  , 0) != (ssize_t
30e20 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20  )readLen ){.    
30e30 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30e40 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
30e50 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20   errmsg, "write 
30e60 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
30e70 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
30e80 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
30e90 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74  }.  if( rename(t
30ea0 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a  Path, cPath) ){.
30eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30ec0 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
30ed0 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65  sg), errmsg, "re
30ee0 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29  name failed (%d)
30ef0 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
30f00 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
30f10 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
30f20 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
30f30 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20  r, "broke stale 
30f40 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63  lock on %s\n", c
30f50 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f  Path);.  robust_
30f60 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e  close(pFile, con
30f70 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e  chFile->h, __LIN
30f80 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  E__);.  conchFil
30f90 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e  e->h = fd;.  con
30fa0 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
30fb0 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
30fc0 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b  REAT;..end_break
30fd0 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29  lock:.  if( rc )
30fe0 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  {.    if( fd>=0 
30ff0 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
31000 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20  k(tPath);.      
31010 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
31020 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  le, fd, __LINE__
31030 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
31040 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
31050 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74  iled to break st
31060 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20  ale lock on %s, 
31070 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72  %s\n", cPath, er
31080 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
31090 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
310a0 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ke the requested
310b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
310c0 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61  ch file and brea
310d0 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69  k a stale lock i
310e0 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69  f the .** host i
310f0 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  d matches..*/.st
31100 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f  atic int proxyCo
31110 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
31120 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
31130 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f  myHostID, int lo
31140 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79  ckType){.  proxy
31150 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
31160 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
31170 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31180 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31190 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
311a0 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
311b0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
311c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
311d0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65  _OK;.  int nTrie
311e0 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  s = 0;.  struct 
311f0 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f  timespec conchMo
31200 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b  dTime;.  .  do {
31210 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
31220 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
31230 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
31240 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
31250 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72  ckType);.    nTr
31260 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ies ++;.    if( 
31270 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
31280 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
31290 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
312a0 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
312b0 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
312c0 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
312d0 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
312e0 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
312f0 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
31300 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
31310 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
31320 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
31330 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
31340 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
31350 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
31360 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
31370 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
31380 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
31390 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
313a0 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
313b0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
313c0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
313d0 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e   if( osFstat(con
313e0 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
313f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
31400 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
31410 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
31420 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
31430 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  R_LOCK;.      }.
31440 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
31450 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20   nTries==1 ){.  
31460 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
31470 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  me = buf.st_mtim
31480 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75  espec;.        u
31490 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f  sleep(500000); /
314a0 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61  * wait 0.5 sec a
314b0 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
314c0 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20  again*/.        
314d0 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
314e0 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
314f0 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20  t( nTries>1 );. 
31500 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f       if( conchMo
31510 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20  dTime.tv_sec != 
31520 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
31530 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20  .tv_sec || .    
31540 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
31550 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66  e.tv_nsec != buf
31560 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
31570 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20  _nsec ){.       
31580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
31590 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  USY;.      }.   
315a0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
315b0 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20  ries==2 ){  .   
315c0 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50       char tBuf[P
315d0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
315e0 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ];.        int l
315f0 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
31600 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c  chFile->h, tBuf,
31610 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
31620 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  EN, 0);.        
31630 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
31640 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
31650 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
31660 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
31670 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
31680 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
31690 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
316a0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
316b0 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
316c0 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
316d0 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
316e0 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
316f0 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
31700 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
31710 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
31720 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
31730 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
31740 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
31750 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
31760 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
31770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31780 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
31790 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
317a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
317b0 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
317c0 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
317d0 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
317e0 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
317f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31800 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
31810 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
31820 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
31830 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
31840 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
31850 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
31860 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
31870 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
31880 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
31890 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
318a0 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
318b0 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
318c0 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
318d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
318e0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
318f0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
31900 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
31910 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
31920 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
31930 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
31940 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
31950 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20  _LOCK);         
31960 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
31970 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
31980 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
31990 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
319a0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
319b0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
319c0 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
319d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
319e0 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
319f0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
31a00 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20  && nTries<3 );. 
31a10 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
31a20 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
31a30 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
31a40 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
31a50 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
31a60 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
31a70 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
31a80 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
31a90 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
31aa0 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
31ab0 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
31ac0 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
31ad0 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
31ae0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
31af0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
31b00 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
31b10 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
31b20 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
31b30 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
31b40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
31b50 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
31b60 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
31b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
31b80 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
31b90 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
31ba0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31bb0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
31bc0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31bd0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
31be0 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
31bf0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
31c00 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
31c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
31c30 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
31c40 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
31c50 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
31c60 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
31c70 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
31c80 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
31c90 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
31ca0 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
31cb0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
31cc0 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
31cd0 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
31ce0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
31cf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
31d00 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
31d10 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
31d20 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
31d30 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
31d40 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
31d50 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
31d60 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
31d70 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
31d80 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
31d90 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
31da0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
31db0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
31dc0 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
31dd0 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
31de0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
31df0 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
31e00 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20  etpid()));..    
31e10 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
31e20 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
31e30 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
31e40 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
31e50 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
31e60 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
31e70 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
31e80 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
31e90 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
31ea0 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
31eb0 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
31ec0 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
31ed0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31ef0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
31f00 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
31f10 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
31f20 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
31f30 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
31f40 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
31f50 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
31f60 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
31f70 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
31f80 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
31f90 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
31fa0 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
31fb0 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
31fc0 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
31fd0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
31fe0 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
31ff0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
32000 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
32010 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
32020 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
32030 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
32040 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
32050 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
32060 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
32070 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
32080 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
32090 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
320a0 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
320b0 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
320c0 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
320d0 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
320e0 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
320f0 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
32100 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
32110 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
32120 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
32130 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
32140 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
32150 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
32160 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
32170 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
32180 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
32190 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
321a0 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
321b0 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
321c0 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
321d0 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
321e0 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
321f0 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
32200 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
32210 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
32220 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
32230 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
32240 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
32250 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
32260 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
32270 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
32280 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
32290 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
322a0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
322b0 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
322c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322d0 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
322e0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
322f0 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
32300 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
32310 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
32320 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
32330 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
32340 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
32350 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
32360 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
32370 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
32380 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
32390 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
323a0 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
323b0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
323c0 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
323d0 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
323e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
323f0 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
32400 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
32410 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
32420 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
32430 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
32440 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
32450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
32460 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
32470 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
32480 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
32490 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
324a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
324b0 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
324c0 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
324d0 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
324e0 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
324f0 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
32500 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
32510 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
32520 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
32530 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
32540 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
32550 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32560 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
32570 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
32580 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
32590 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
325a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
325b0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
325c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
325d0 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
325e0 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
325f0 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
32600 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
32610 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
32620 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
32630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32640 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
32650 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
32660 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
32670 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
32680 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
32690 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
326a0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
326b0 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
326c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
326d0 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
326e0 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
326f0 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
32700 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
32710 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20  n't take it */. 
32720 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46       if( (conchF
32730 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
32740 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20  _RDWR) == 0 ){. 
32750 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32760 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
32770 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
32780 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
32790 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74     .      /* eit
327a0 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69  her the conch di
327b0 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65  dn't match or we
327c0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
327d0 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20  a new one */.   
327e0 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
327f0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
32800 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c         proxyGetL
32810 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
32820 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
32830 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
32840 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
32850 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
32860 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
32870 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
32880 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69  ck path _only_ i
32890 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
328a0 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  aken */.      }.
328b0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
328c0 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
328d0 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
328e0 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
328f0 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
32900 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20  .      ** has a 
32910 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65  shared lock alre
32920 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73  ady), if the hos
32930 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73  t id matches, us
32940 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20  e the big.      
32950 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20  ** stick..      
32960 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73  */.      futimes
32970 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e  (conchFile->h, N
32980 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
32990 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21  hostIdMatch && !
329a0 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
329b0 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68         if( conch
329c0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
329d0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
329e0 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
329f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
32a00 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
32a10 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
32a20 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
32a30 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
32a40 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70         ** same p
32a50 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
32a60 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
32a70 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   lock. */.      
32a80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32a90 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
32aa0 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20  else {          
32ab0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32ac0 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
32ad0 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
32ae0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
32af0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32b10 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
32b20 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
32b30 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
32b40 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
32b50 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
32b60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
32b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32b80 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42       char writeB
32b90 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43  uffer[PROXY_MAXC
32ba0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
32bb0 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20    int writeSize 
32bc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 0;.        .  
32bd0 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65        writeBuffe
32be0 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f  r[0] = (char)PRO
32bf0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b  XY_CONCHVERSION;
32c00 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
32c10 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
32c20 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
32c30 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
32c40 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
32c50 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
32c60 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c  kProxyPath!=NULL
32c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
32c80 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
32c90 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
32ca0 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EX], pCtx->lockP
32cb0 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
32cc0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
32cd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32ce0 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
32cf0 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
32d00 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50  NDEX], tempLockP
32d10 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
32d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32d30 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20      writeSize = 
32d40 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
32d50 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42  + strlen(&writeB
32d60 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
32d70 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20  INDEX]);.       
32d80 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
32d90 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
32da0 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
32db0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
32dc0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
32dd0 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
32de0 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
32df0 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
32e00 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
32e10 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
32e20 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
32e30 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
32e40 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
32e50 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
32e60 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
32e70 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
32e80 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
32e90 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
32ea0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
32eb0 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
32ec0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
32ed0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
32ee0 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
32ef0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
32f00 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
32f10 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61  int err = osFsta
32f20 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
32f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32f40 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20   err==0 ){.     
32f50 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d         mode_t cm
32f60 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64  ode = buf.st_mod
32f70 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55  e&(S_IRUSR|S_IWU
32f80 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49  SR | S_IRGRP|S_I
32f90 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20  WGRP |.         
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
32fc0 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b  _IROTH|S_IWOTH);
32fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32fe0 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
32ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52   database file R
33000 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  /W permissions, 
33010 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a  ignore failure *
33020 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
33030 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20  _PROXY_DEBUG.   
33040 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f           osFchmo
33050 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
33060 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20  cmode);.#else.  
33070 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20            do{.  
33080 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
33090 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46   osFchmod(conchF
330a0 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
330b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 77 68 69              }whi
330c0 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20  le( rc==(-1) && 
330d0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
330e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
330f0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
33100 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
33110 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
33120 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
33130 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
33140 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
33150 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
33160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
33170 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  ode, code, strer
33180 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20  ror(code));.    
33190 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
331a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
331b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
331c0 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44  fchmod %o SUCCED
331d0 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20  ED\n",cmode);.  
331e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
331f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33200 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
33210 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
33220 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
33230 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
33240 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
33250 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
33260 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c              err,
33270 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
33280 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20  code));.#endif. 
33290 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
332a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
332b0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
332c0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
332d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
332e0 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
332f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20  LOCK);.      .  
33300 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a    end_takeconch:
33310 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
33320 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
33330 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
33340 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ->h));.      if(
33350 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33360 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  & pFile->openFla
33370 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  gs ){.        if
33380 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
33390 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62 75 73  .          robus
333a0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
333b0 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
333c0 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _);.        }.  
333d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
333e0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   -1;.        int
333f0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
33400 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
33410 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
33420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33430 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
33440 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
33450 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
33460 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
33470 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64  SPROXY: OPEN  %d
33480 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20  \n", fd));.     
33490 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
334a0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
334b0 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20  >h = fd;.       
334c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
334d0 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54    rc=SQLITE_CANT
334e0 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51  OPEN_BKPT; /* SQ
334f0 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79  LITE_BUSY? proxy
33500 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64  TakeConch called
33510 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69  .           duri
33520 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  ng locking */.  
33530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33540 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33550 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78  LITE_OK && !pCtx
33560 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ->lockProxy ){. 
33570 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74         char *pat
33580 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h = tempLockPath
33590 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   ? tempLockPath 
335a0 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
335b0 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72  yPath;.        r
335c0 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
335d0 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70  nixFile(path, &p
335e0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20  Ctx->lockProxy, 
335f0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
33600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
33610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
33620 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50  M && tryOldLockP
33630 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
33640 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20   /* we couldn't 
33650 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79  create the proxy
33660 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20   lock file with 
33670 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c  the old lock fil
33680 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
33690 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69    ** so try agai
336a0 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e  n via auto-namin
336b0 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  g .           */
336c0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65  .          force
336d0 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  NewLockPath = 1;
336e0 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c  .          tryOl
336f0 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
33700 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
33710 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f  e; /* go back to
33720 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65   the do {} while
33730 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72   start point, tr
33740 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  y again */.     
33750 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33760 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33770 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33780 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
33790 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69  a copy of path i
337a0 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74  f we extracted t
337b0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
337c0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f    ** from the co
337d0 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20  nch file or the 
337e0 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74  path was allocat
337f0 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a  ed on the stack.
33800 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
33810 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b      if( tempLock
33820 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
33830 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
33840 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
33850 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c  bStrDup(0, tempL
33860 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ockPath);.      
33870 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
33880 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
33890 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
338a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
338b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
338c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
338d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
338e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
338f0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
33900 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 1;.        .  
33910 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
33920 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
33930 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
33940 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ods ){.         
33950 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
33960 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20  xt *afpCtx;.    
33970 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28        afpCtx = (
33980 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
33990 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
339a0 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
339b0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ext;.          a
339c0 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20  fpCtx->dbPath = 
339d0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
339e0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ath;.        }. 
339f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
33a00 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
33a10 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
33a20 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
33a30 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
33a40 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
33a50 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41      OSTRACE(("TA
33a60 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  KECONCH  %d %s\n
33a70 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
33a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33a90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f  rc==SQLITE_OK?"o
33aa0 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20  k":"failed"));. 
33ab0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33ac0 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b      } while (1);
33ad0 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e   /* in case we n
33ae0 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68 65  eed to retry the
33af0 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c   :auto: lock fil
33b00 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e - .           
33b10 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
33b20 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65 72  ld never get her
33b30 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68 65  e except via the
33b40 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c   'continue' call
33b50 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  . */.  }.}../*.*
33b60 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
33b70 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
33b80 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
33b90 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
33ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
33bb0 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
33bc0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
33bd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33be0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
33bf0 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
33c00 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
33c10 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33c20 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
33c30 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
33c40 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
33c50 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
33c60 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
33c70 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
33c80 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
33c90 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
33ca0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33cb0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
33cc0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
33cd0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
33ce0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
33cf0 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f  RACE(("RELEASECO
33d00 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
33d10 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
33d20 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
33d30 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
33d40 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
33d50 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
33d60 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
33d70 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
33d80 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63  );.  if( pCtx->c
33d90 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
33da0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
33db0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
33dc0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
33dd0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
33de0 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74  LOCK);.  }.  pCt
33df0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
33e00 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
33e10 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25  LEASECONCH  %d %
33e20 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
33e30 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
33e40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
33e50 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
33e60 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
33e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
33e80 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
33e90 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d  tabase file, com
33ea0 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  pute the name of
33eb0 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e   its conch file.
33ec0 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f  .** Store the co
33ed0 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nch filename in 
33ee0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
33ef0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
33f00 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  loc()..** Make *
33f10 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74  pConchPath point
33f20 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65   to the new name
33f30 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
33f40 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
33f50 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
33f60 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f  M if unable to o
33f70 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  btain memory..**
33f80 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
33f90 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
33fa0 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
33fb0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
33fc0 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73  mory.** space is
33fd0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
33fe0 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68  d..**.** *pConch
33ff0 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e  Path is set to N
34000 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  ULL if a memory 
34010 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
34020 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
34030 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
34040 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
34050 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
34060 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29  ar **pConchPath)
34070 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
34080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34090 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
340a0 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d  r */.  int len =
340b0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
340c0 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20  ath); /* Length 
340d0 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
340e0 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f  name - dbPath */
340f0 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61  .  char *conchPa
34100 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
34110 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68   /* buffer in wh
34120 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
34130 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a   conch name */..
34140 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
34150 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ace for the conc
34160 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  h filename and i
34170 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61  nitialize the na
34180 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e  me to.  ** the n
34190 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ame of the origi
341a0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
341b0 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63  e. */  .  *pConc
341c0 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74  hPath = conchPat
341d0 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  h = (char *)sqli
341e0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b  te3_malloc(len +
341f0 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68   8);.  if( conch
34200 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Path==0 ){.    r
34210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
34220 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  EM;.  }.  memcpy
34230 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61  (conchPath, dbPa
34240 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20  th, len+1);.  . 
34250 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61   /* now insert a
34260 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20   "." before the 
34270 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72  last / character
34280 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65   */.  for( i=(le
34290 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20  n-1); i>=0; i-- 
342a0 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68  ){.    if( conch
342b0 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[i]=='/' ){.
342c0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
342d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
342e0 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  }.  conchPath[i]
342f0 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20  ='.';.  while ( 
34300 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e  i<len ){.    con
34310 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61  chPath[i+1]=dbPa
34320 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a  th[i];.    i++;.
34330 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64    }..  /* append
34340 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75   the "-conch" su
34350 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65  ffix to the file
34360 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f   */.  memcpy(&co
34370 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d  nchPath[i+1], "-
34380 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73  conch", 7);.  as
34390 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
343a0 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20  n(conchPath) == 
343b0 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75  len+7 );..  retu
343c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
343d0 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c  ../* Takes a ful
343e0 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72  ly configured pr
343f0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  oxy locking-styl
34400 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  e unix file and 
34410 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20  switches.** the 
34420 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
34430 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20  path .*/.static 
34440 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  int switchLockPr
34450 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65  oxyPath(unixFile
34460 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
34470 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
34480 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34490 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
344a0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
344b0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
344c0 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a  ontext;.  char *
344d0 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  oldPath = pCtx->
344e0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
344f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34500 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c  _OK;..  if( pFil
34510 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
34520 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
34530 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34540 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74  .  }  ..  /* not
34550 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68  hing to do if th
34560 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20  e path is NULL, 
34570 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65  :auto: or matche
34580 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 70  s the existing p
34590 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61  ath */.  if( !pa
345a0 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27  th || path[0]=='
345b0 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70  \0' || !strcmp(p
345c0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c  ath, ":auto:") |
345d0 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26  |.    (oldPath &
345e0 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61  & !strncmp(oldPa
345f0 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54  th, path, MAXPAT
34600 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65  HLEN)) ){.    re
34610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
34630 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
34640 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
34650 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f  xy;.    pCtx->lo
34660 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20  ckProxy=NULL;.  
34670 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
34680 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c  d = 0;.    if( l
34690 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29  ockProxy!=NULL )
346a0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50  {.      rc=lockP
346b0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
346c0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
346d0 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  ile *)lockProxy)
346e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
346f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34700 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
34710 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d  ockProxy);.    }
34720 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
34730 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20  e(oldPath);.    
34740 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
34750 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
34760 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a  trDup(0, path);.
34770 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
34780 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69  rc;.}../*.** pFi
34790 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68 61  le is a file tha
347a0 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
347b0 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70  d by a prior xOp
347c0 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68  en call.  dbPath
347d0 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
347e0 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
347f0 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61  MAXPATHLEN+1 cha
34800 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e  racters in size.
34810 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
34820 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c  ine find the fil
34830 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64  ename associated
34840 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20   with pFile and 
34850 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74  writes it.** int
34860 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74   dbPath..*/.stat
34870 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44  ic int proxyGetD
34880 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
34890 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
348a0 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b  , char *dbPath){
348b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
348c0 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46  PPLE__).  if( pF
348d0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
348e0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
348f0 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c  .    /* afp styl
34900 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72 65  e keeps a refere
34910 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70 61  nce to the db pa
34920 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61  th in the filePa
34930 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a  th field .    **
34940 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20 2a   of the struct *
34950 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  /.    assert( (i
34960 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  nt)strlen((char*
34970 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34980 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
34990 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
349a0 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70  py(dbPath, ((afp
349b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
349c0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
349d0 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c  ontext)->dbPath,
349e0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
349f0 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
34a00 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
34a10 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  od == &dotlockIo
34a20 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
34a30 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65  * dot lock style
34a40 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e   uses the lockin
34a50 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
34a60 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a  re the dot lock.
34a70 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68      ** file path
34a80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20   */.    int len 
34a90 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
34aa0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34ab0 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e  ontext) - strlen
34ac0 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29  (DOTLOCK_SUFFIX)
34ad0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50  ;.    memcpy(dbP
34ae0 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
34af0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34b00 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20  xt, len + 1);.  
34b10 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c  }else{.    /* al
34b20 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75  l other styles u
34b30 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  se the locking c
34b40 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
34b50 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68  the db file path
34b60 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34b70 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
34b80 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34b90 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
34ba0 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
34bb0 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
34bc0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34bd0 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45  ntext, MAXPATHLE
34be0 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
34bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
34c00 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c  *.** Takes an al
34c10 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20  ready filled in 
34c20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c  unix file and al
34c30 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66  ters it so all f
34c40 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20  ile locking .** 
34c50 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65  will be performe
34c60 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  d on the local p
34c70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20  roxy lock file. 
34c80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
34c90 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65  ields.** are pre
34ca0 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f  served in the lo
34cb0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f  cking context so
34cc0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
34cd0 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a  e restored and .
34ce0 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75  ** the unix stru
34cf0 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63  cture properly c
34d00 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f  leaned up at clo
34d10 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c  se time:.**  ->l
34d20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a  ockingContext.**
34d30 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73    ->pMethod.*/.s
34d40 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
34d50 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
34d60 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
34d70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
34d80 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
34d90 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34da0 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68  x;.  char dbPath
34db0 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20  [MAXPATHLEN+1]; 
34dc0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
34dd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34de0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
34df0 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69  ckPath=NULL;.  i
34e00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34e10 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c  K;.  .  if( pFil
34e20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
34e30 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
34e40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34e50 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44  .  }.  proxyGetD
34e60 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
34e70 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b  (pFile, dbPath);
34e80 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
34e90 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
34ea0 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
34eb0 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20  :auto:") ){.    
34ec0 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
34ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b   }else{.    lock
34ee0 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74  Path=(char *)pat
34ef0 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52  h;.  }.  .  OSTR
34f00 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
34f10 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
34f20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
34f30 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63  .           (loc
34f40 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68  kPath ? lockPath
34f50 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
34f60 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74  tpid()));..  pCt
34f70 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
34f80 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
34f90 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
34fa0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
34fb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
34fc0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
34fd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
34fe0 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
34ff0 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
35000 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
35010 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
35020 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
35030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35040 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
35050 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
35060 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
35070 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20  Ctx->conchFile, 
35080 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
35090 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
350a0 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e  && ((pFile->open
350b0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
350c0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
350d0 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20  if (a) the open 
350e0 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f  flags are not O_
350f0 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f  RDWR, (b) the co
35100 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c  nch isn't there,
35110 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63   and.      ** (c
35120 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  ) the file syste
35130 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  m is read-only, 
35140 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c  then enable no-l
35150 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20  ocking access.. 
35160 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e       ** Ugh, sin
35170 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30  ce O_RDONLY==0x0
35180 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20  000 we test for 
35190 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e  !O_RDWR since un
351a0 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20  ixOpen asserts. 
351b0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65       ** that ope
351c0 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65  nFlags will have
351d0 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52   only one of O_R
351e0 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e  DONLY or O_RDWR.
351f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35200 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
35210 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
35220 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66  ct stat conchInf
35230 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c  o;.      int goL
35240 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20  ockless = 0;..  
35250 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 70      if( osStat(p
35260 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
35270 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20  th, &conchInfo) 
35280 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
35290 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
352a0 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  o;.        if( (
352b0 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20  err==ENOENT) && 
352c0 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20  (statfs(dbPath, 
352d0 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20  &fsInfo) != -1) 
352e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c  ){.          goL
352f0 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66  ockless = (fsInf
35300 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44  o.f_flags&MNT_RD
35310 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f  ONLY) == MNT_RDO
35320 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NLY;.        }. 
35330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35340 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20   goLockless ){. 
35350 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
35360 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20  chHeld = -1; /* 
35370 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f  read only FS/ lo
35380 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
35390 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
353a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
353b0 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d    }  .  if( rc==
353c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
353d0 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74  kPath ){.    pCt
353e0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
353f0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
35400 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b  up(0, lockPath);
35410 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
35420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35430 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
35440 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
35450 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20  0, dbPath);.    
35460 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68  if( pCtx->dbPath
35470 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
35480 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
35490 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
354a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
354b0 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d   ){.    /* all m
354c0 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
354d0 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63  ed, proxys are c
354e0 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67  reated and assig
354f0 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69  ned, .    ** swi
35500 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
35510 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
35520 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e  hod then return.
35530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78  .    */.    pCtx
35540 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
35550 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
35560 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
35570 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
35580 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
35590 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
355a0 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
355b0 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
355c0 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78  >pMethod = &prox
355d0 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  yIoMethods;.  }e
355e0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74  lse{.    if( pCt
355f0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20  x->conchFile ){ 
35600 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  .      pCtx->con
35610 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
35620 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
35630 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f  _file *)pCtx->co
35640 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
35650 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
35660 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
35670 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
35680 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
35690 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
356a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
356b0 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
356c0 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69  Path); .    sqli
356d0 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
356e0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
356f0 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25  TRANSPROXY  %d %
35700 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  s\n", pFile->h,.
35710 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
35720 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
35730 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
35740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35750 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
35760 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69  ine handles sqli
35770 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
35780 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72  () calls that ar
35790 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  e specific.** to
357a0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
357b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
357c0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
357d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
357e0 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
357f0 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
35800 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
35810 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
35820 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
35830 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
35840 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
35850 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  ;.      if( pFil
35860 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
35870 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b  roxyIoMethods ){
35880 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f  .        proxyLo
35890 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
358a0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
358b0 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
358c0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
358d0 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54  ;.        proxyT
358e0 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
358f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
35900 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28   ){.          *(
35920 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
35930 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  rg = pCtx->lockP
35940 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
35950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35960 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
35970 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f  **)pArg = ":auto
35980 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20  : (not held)";. 
35990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
359a0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
359b0 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
359c0 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pArg = NULL;.   
359d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
359e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
359f0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
35a00 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
35a10 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
35a20 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
35a30 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
35a40 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
35a50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
35a60 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  nt isProxyStyle 
35a70 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  = (pFile->pMetho
35a80 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
35a90 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  hods);.      if(
35aa0 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28   pArg==NULL || (
35ab0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
35ac0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
35ad0 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
35ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
35af0 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
35b00 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75  locking - not su
35b10 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20  pported */.     
35b20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35b30 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f  _ERROR /*SQLITE_
35b40 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45  PROTOCOL? SQLITE
35b50 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20  _MISUSE?*/;.    
35b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b70 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
35b80 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
35b90 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e   already off - N
35ba0 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOP */.         
35bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35be0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78  const char *prox
35bf0 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  yPath = (const c
35c00 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  har *)pArg;.    
35c10 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
35c20 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
35c30 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
35c40 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20  ntext *pCtx = . 
35c50 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78             (prox
35c60 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
35c70 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
35c80 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
35c90 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41    if( !strcmp(pA
35ca0 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20  rg, ":auto:") . 
35cb0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43            || (pC
35cc0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35cd0 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  h &&.           
35ce0 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74      !strncmp(pCt
35cf0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35d00 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  , proxyPath, MAX
35d10 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20  PATHLEN)).      
35d20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
35d30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
35d40 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  K;.          }el
35d50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
35d60 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50  rc = switchLockP
35d70 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20  roxyPath(pFile, 
35d80 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
35d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35db0 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78   /* turn on prox
35dc0 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  y file locking *
35dd0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
35de0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
35df0 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70  nixFile(pFile, p
35e00 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
35e10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35e20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
35e30 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
35e40 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
35e50 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61   0 );  /* The ca
35e60 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20  ll assures that 
35e70 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64  only valid opcod
35e80 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20  es are sent */. 
35e90 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
35ea0 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75  REACHED*/.  retu
35eb0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
35ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e  .}../*.** Within
35ed0 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28   this division (
35ee0 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  the proxying loc
35ef0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
35f00 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75  ion) the procedu
35f10 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69  res.** above thi
35f20 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20  s point are all 
35f30 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20  utilities.  The 
35f40 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74  lock-related met
35f50 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  hods of the.** p
35f60 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c  roxy-locking sql
35f70 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f  ite3_io_method o
35f80 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f  bject follow..*/
35f90 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
35fa0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
35fb0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
35fc0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
35fd0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
35fe0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
35ff0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
36000 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
36010 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
36020 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
36030 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
36040 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
36050 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
36060 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
36070 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
36080 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
36090 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
360a0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
360b0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
360c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
360d0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
360e0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
360f0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
36100 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t) {.  unixFile 
36110 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
36120 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
36130 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
36140 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
36150 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36160 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
36170 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
36180 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
36190 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
361a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
361b0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
361c0 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
361d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
361e0 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
361f0 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72  oxy;.      retur
36200 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  n proxy->pMethod
36210 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  ->xCheckReserved
36220 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
36230 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f  le*)proxy, pResO
36240 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  ut);.    }else{ 
36250 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
36260 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
36270 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b        pResOut=0;
36280 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
36290 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
362a0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
362b0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
362c0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
362d0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
362e0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
362f0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
36300 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
36310 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
36320 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
36330 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
36340 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
36350 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
36360 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
36370 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
36380 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
36390 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
363a0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
363b0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
363c0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
363d0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
363e0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
363f0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
36400 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
36410 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
36420 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
36430 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
36440 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
36450 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
36460 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
36470 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
36480 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
36490 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
364a0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
364b0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
364c0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
364d0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
364e0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
364f0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
36500 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
36510 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
36520 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
36530 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
36540 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
36550 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36560 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
36570 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
36580 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
36590 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
365a0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
365b0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
365c0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
365d0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
365e0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
365f0 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
36600 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
36610 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
36620 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
36630 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
36640 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36650 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
36660 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36670 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36680 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
36690 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
366a0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
366b0 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
366c0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
366d0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
366e0 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20  Proxy;.      rc 
366f0 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
36700 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
36710 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46  _file*)proxy, eF
36720 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
36730 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
36740 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c   = proxy->eFileL
36750 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
36760 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65        /* conchHe
36770 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
36780 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ss */.    }.  }.
36790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
367a0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
367b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
367c0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
367d0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
367e0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
367f0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
36800 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
36810 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
36820 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
36830 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
36840 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
36850 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
36860 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
36870 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
36880 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
36890 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
368a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
368b0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
368c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
368d0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
368e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
368f0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
36900 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
36910 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
36920 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36930 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
36940 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
36950 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36960 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36970 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36980 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
36990 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
369a0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
369b0 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
369c0 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
369d0 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
369e0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
369f0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
36a00 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  y, eFileLock);. 
36a10 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
36a20 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65  eLock = proxy->e
36a30 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65  FileLock;.    }e
36a40 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
36a50 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
36a60 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
36a70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
36a90 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65   a file that use
36aa0 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a  s proxy locks..*
36ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36ac0 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
36ad0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
36ae0 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
36af0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36b00 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
36b10 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
36b20 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
36b30 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36b40 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
36b50 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
36b60 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
36b70 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
36b80 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69  roxy;.    unixFi
36b90 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
36ba0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
36bb0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
36bc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
36bd0 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20    if( lockProxy 
36be0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
36bf0 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
36c00 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
36c10 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
36c20 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  xy, NO_LOCK);.  
36c30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36c40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
36c50 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
36c60 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
36c70 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
36c80 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
36c90 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36ca0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
36cb0 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
36cc0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f  ;.      pCtx->lo
36cd0 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20  ckProxy = 0;.   
36ce0 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68   }.    if( conch
36cf0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  File ){.      if
36d00 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
36d10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
36d20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  = proxyReleaseCo
36d30 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
36d40 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36d50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
36d60 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
36d70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36d80 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
36d90 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b  ile*)conchFile);
36da0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36db0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36dc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
36dd0 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
36de0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
36df0 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  e(0, pCtx->lockP
36e00 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
36e10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36e20 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
36e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
36e40 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50  ree(0, pCtx->dbP
36e50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73  ath);.    /* res
36e60 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61  tore the origina
36e70 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  l locking contex
36e80 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
36e90 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20  en close it */. 
36ea0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
36eb0 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d  gContext = pCtx-
36ec0 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
36ed0 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  xt;.    pFile->p
36ee0 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70  Method = pCtx->p
36ef0 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73  OldMethod;.    s
36f00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36f10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46  );.    return pF
36f20 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
36f30 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  lose(id);.  }.  
36f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36f50 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.}....#endif /*
36f60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
36f70 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
36f80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
36f90 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
36fa0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74  proxy locking st
36fb0 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  yle is intended 
36fc0 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50  for use with AFP
36fd0 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
36fe0 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69   And since AFP i
36ff0 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
37000 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20   on MacOSX, the 
37010 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
37020 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63   also.** restric
37030 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a  ted to MacOSX..*
37040 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  * .**.**********
37050 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
37060 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
37070 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
37080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37090 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
370a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
370b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
370c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
370d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
370e0 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ****/../*.** Ini
370f0 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
37100 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
37110 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
37120 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
37130 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70  ters all VFS imp
37140 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
37150 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61   unix-like opera
37160 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
37170 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20    This routine, 
37180 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  and the sqlite3_
37190 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  os_end() routine
371a0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a   that follows,.*
371b0 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  * should be the 
371c0 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e  only routines in
371d0 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20   this file that 
371e0 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d  are visible from
371f0 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e   other.** files.
37200 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
37210 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
37220 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ce during SQLite
37230 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
37240 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67  and by a.** sing
37250 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20  le thread.  The 
37260 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
37270 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  n and mutex subs
37280 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a  ystems have not.
37290 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62  ** necessarily b
372a0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
372b0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
372c0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64  e is called, and
372d0 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75   so they.** shou
372e0 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a  ld not be used..
372f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
37300 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20  s_init(void){ . 
37310 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f   /* .  ** The fo
37320 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65  llowing macro de
37330 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  fines an initial
37340 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69  izer for an sqli
37350 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
37360 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    ** The name of
37370 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45   the VFS is NAME
37380 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20  .  The pAppData 
37390 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
373a0 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74  a pointer.  ** t
373b0 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66  o the "finder" f
373c0 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44  unction.  (pAppD
373d0 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ata is a pointer
373e0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65   to a pointer be
373f0 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79  cause.  ** silly
37400 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69   C90 rules prohi
37410 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d  bit a void* from
37420 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61   being cast to a
37430 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
37440 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65  r.  ** and so we
37450 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f   have to go thro
37460 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64  ugh the intermed
37470 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  iate pointer to 
37480 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
37490 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
374a0 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  ng with -pedanti
374b0 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e  c-errors on GCC.
374c0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
374d0 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72  FINDER parameter
374e0 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
374f0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
37500 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
37510 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e  .  ** finder-fun
37520 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64  ction.  The find
37530 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er-function retu
37540 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
37550 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
37560 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
37570 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
37580 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c  ts the desired l
37590 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61  ocking.  ** beha
375a0 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20  viors.  See the 
375b0 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74  division above t
375c0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
375d0 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20   IOMETHODS.  ** 
375e0 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69  macro for additi
375f0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  on information o
37600 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  n finder-functio
37610 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ns..  **.  ** Mo
37620 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c  st finders simpl
37630 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  y return a point
37640 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
37650 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
37660 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42  .  ** object.  B
37670 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b  ut the "autolock
37680 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61  IoFinder" availa
37690 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f  ble on MacOSX do
376a0 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a  es a little.  **
376b0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b   more than that;
376c0 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65   it looks at the
376d0 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
376e0 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20   that hosts the 
376f0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
37700 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ile and tries to
37710 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69   choose an locki
37720 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70  ng method approp
37730 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74  riate for.  ** t
37740 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74  hat filesystem t
37750 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66  ime..  */.  #def
37760 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e  ine UNIXVFS(VFSN
37770 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20  AME, FINDER) {  
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37790 20 20 20 20 20 20 5c 0a 20 20 20 20 33 2c 20 20        \.    3,  
377a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377b0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
377c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377d0 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
377e0 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
377f0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
37800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37810 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
37820 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
37830 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
37840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37850 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
37860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
37870 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
37880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37890 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20      VFSNAME,    
378a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
378b0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
378c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
378d0 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52    (void*)&FINDER
378e0 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ,       /* pAppD
378f0 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
37900 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37910 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
37920 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
37930 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37940 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37950 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
37960 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
37970 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37980 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37990 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
379a0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
379b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379c0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
379d0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
379e0 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
379f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37a00 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
37a10 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
37a20 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
37a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a40 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
37a50 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
37a60 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
37a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37a80 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
37a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
37aa0 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
37ab0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37ac0 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
37ad0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
37ae0 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
37af0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
37b00 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
37b10 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
37b20 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
37b30 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37b40 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
37b50 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
37b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b70 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37b80 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
37b90 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
37ba0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37bb0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
37bc0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
37bd0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
37be0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37bf0 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
37c00 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
37c10 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
37c20 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  64 */           
37c30 5c 0a 20 20 20 20 75 6e 69 78 53 65 74 53 79 73  \.    unixSetSys
37c40 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
37c50 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
37c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37c70 20 20 20 20 75 6e 69 78 47 65 74 53 79 73 74 65      unixGetSyste
37c80 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
37c90 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20  tSystemCall */  
37ca0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37cb0 20 20 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d    unixNextSystem
37cc0 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
37cd0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20  SystemCall */   
37ce0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
37cf0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
37d00 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
37d10 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
37d20 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
37d30 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
37d40 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
37d50 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
37d60 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
37d70 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
37d80 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
37d90 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
37da0 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
37db0 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
37dc0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
37dd0 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
37de0 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
37df0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
37e00 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
37e10 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
37e20 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
37e30 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20   && (OS_VXWORKS 
37e40 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
37e50 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56  LE__)).    UNIXV
37e60 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
37e70 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
37e80 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
37e90 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
37ea0 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
37eb0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
37ec0 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
37ed0 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
37ee0 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
37ef0 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37f00 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
37f10 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
37f20 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37f30 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20 20 20 70  nix-excl",     p
37f40 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
37f50 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
37f60 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
37f70 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
37f80 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
37f90 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
37fa0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
37fb0 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
37fc0 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
37fd0 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
37fe0 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
37ff0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
38000 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
38010 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
38020 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
38030 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
38040 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
38050 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
38060 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
38070 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61  nix-afp",      a
38080 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fpIoFinder ),.  
38090 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
380a0 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f  nfs",      nfsIo
380b0 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
380c0 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
380d0 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
380e0 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
380f0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
38100 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
38110 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
38120 2f 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  /..  /* Double-c
38130 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
38140 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
38150 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
38160 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
38170 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
38180 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
38190 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
381a0 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
381b0 61 6c 6c 29 3d 3d 31 38 20 29 3b 0a 0a 20 20 2f  all)==18 );..  /
381c0 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56  * Register all V
381d0 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20  FSes defined in 
381e0 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79  the aVfs[] array
381f0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
38200 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73  <(sizeof(aVfs)/s
38210 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
38220 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  s)); i++){.    s
38230 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
38240 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d  ter(&aVfs[i], i=
38250 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  =0);.  }.  retur
38260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
38270 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
38280 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
38290 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
382a0 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61  **.** Some opera
382b0 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67  ting systems mig
382c0 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f  ht need to do so
382d0 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68  me cleanup in th
382e0 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74  is routine,.** t
382f0 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69  o release dynami
38300 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
38310 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f  objects.  But no
38320 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68  t on unix..** Th
38330 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
38340 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a  no-op for unix..
38350 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
38360 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
38370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
38380 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a  ; .}. .#endif /*
38390 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
383a0 2a 2f 0a                                         */.