/ Hex Artifact Content
Login

Artifact b83e0924d1a832a89989d3d2770179205d0e066a:


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 69 6e 74 20 64 69 72 66 64 3b   */.  int dirfd;
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1b10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1b20: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
1b30: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1b40: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1b60: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1b70: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1b80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
1b90: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
1ba0: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1bb0: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1bc0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1bd0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c00: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c10: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1c20: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1c30: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1c40: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1c50: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1c60: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1c70: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c90: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1ca0: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cd0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1ce0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1cf0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1d20: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1d30: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1d40: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1d70: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1d80: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1d90: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1da0: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1db0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dd0: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1de0: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1df0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1e00: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1e10: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1e20: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1e30: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1e60: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1e70: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1e80: 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20 69  _VXWORKS.  int i
1e90: 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20  sDelete;        
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb0: 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  * Delete on clos
1ec0: 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 73  e if true */.  s
1ed0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
1ee0: 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20  eId *pId;       
1ef0: 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c     /* Unique fil
1f00: 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  e ID */.#endif.#
1f10: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1f20: 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  /* The next grou
1f30: 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61  p of variables a
1f40: 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b  re used to track
1f50: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1f60: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  the.  ** transac
1f70: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20  tion counter in 
1f80: 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64  bytes 24-27 of d
1f90: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
1fa0: 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77  e updated.  ** w
1fb0: 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74  henever any part
1fc0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fd0: 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73   changes.  An as
1fe0: 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
1ff0: 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66  ll.  ** occur if
2000: 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74   a file is updat
2010: 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20  ed without also 
2020: 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61  updating the tra
2030: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
2040: 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73  unter.  This tes
2050: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f  t is made to avo
2060: 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20  id new problems 
2070: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
2080: 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65   ** one describe
2090: 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38  d by ticket #358
20a0: 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67  4. .  */.  unsig
20b0: 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e  ned char transCn
20c0: 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75  trChng;   /* Tru
20d0: 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  e if the transac
20e0: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61  tion counter cha
20f0: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
2100: 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65  ed char dbUpdate
2110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2120: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
2130: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2140: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2150: 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61  ned char inNorma
2160: 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75  lWrite;   /* Tru
2170: 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  e if in a normal
2180: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
2190: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
21a0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
21b0: 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c  /* In test mode,
21c0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
21d0: 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ze of this struc
21e0: 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68  ture a bit so th
21f0: 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c  at .  ** it is l
2200: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
2210: 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20  truct CrashFile 
2220: 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36  defined in test6
2230: 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  .c..  */.  char 
2240: 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65  aPadding[32];.#e
2250: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
2260: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
2270: 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63  r the unixFile.c
2280: 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b  trlFlags bitmask
2290: 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  :.*/.#define UNI
22a0: 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 30 78 30  XFILE_EXCL   0x0
22b0: 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  1     /* Connect
22c0: 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72  ions from one pr
22d0: 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64  ocess only */.#d
22e0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52  efine UNIXFILE_R
22f0: 44 4f 4e 4c 59 20 30 78 30 32 20 20 20 20 20 2f  DONLY 0x02     /
2300: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * Connection is 
2310: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a  read only */../*
2320: 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65  .** Include code
2330: 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20   that is common 
2340: 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69  to all os_*.c fi
2350: 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  les.*/.#include 
2360: 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f  "os_common.h"../
2370: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69  *.** Define vari
2380: 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20  ous macros that 
2390: 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  are missing from
23a0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a   some systems..*
23b0: 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47  /.#ifndef O_LARG
23c0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
23d0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
23e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
23f0: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20  E_DISABLE_LFS.# 
2400: 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  undef O_LARGEFIL
2410: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2420: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2430: 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c  #ifndef O_NOFOLL
2440: 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f  OW.# define O_NO
2450: 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a  FOLLOW 0.#endif.
2460: 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59  #ifndef O_BINARY
2470: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41  .# define O_BINA
2480: 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RY 0.#endif../*.
2490: 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20  ** The threadid 
24a0: 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74  macro resolves t
24b0: 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20  o the thread-id 
24c0: 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66  or to 0.  Used f
24d0: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
24e0: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
24f0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
2500: 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69  THREADSAFE.#defi
2510: 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72  ne threadid pthr
2520: 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65  ead_self().#else
2530: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
2540: 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d 0.#endif../*.*
2550: 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78  * Different Unix
2560: 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65   systems declare
2570: 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65   open() in diffe
2580: 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65  rent ways.  Same
2590: 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e   use.** open(con
25a0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64  st char*,int,mod
25b0: 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73  e_t).  Others us
25c0: 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e open(const cha
25d0: 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20  r*,int,...)..** 
25e0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
25f0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e  s important when
2600: 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72   using a pointer
2610: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
2620: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65  ..**.** The safe
2630: 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77  st way to deal w
2640: 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ith the problem 
2650: 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65  is to always use
2660: 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a   this wrapper.**
2670: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61   which always ha
2680: 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d  s the same well-
2690: 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63  defined interfac
26a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26b0: 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74   posixOpen(const
26c0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
26d0: 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64  t flags, int mod
26e0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  e){.  return ope
26f0: 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  n(zFile, flags, 
2700: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mode);.}../*.** 
2710: 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c  Many system call
2720: 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74  s are accessed t
2730: 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74  hrough pointer-t
2740: 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74  o-functions so t
2750: 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20  hat.** they may 
2760: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74  be overridden at
2770: 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69   runtime to faci
2780: 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a  litate fault inj
2790: 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a  ection during.**
27a0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e   testing and san
27b0: 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f  dboxing.  The fo
27c0: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
27d0: 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e  lds the names an
27e0: 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  d pointers.** to
27f0: 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c   all overrideabl
2800: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a  e system calls..
2810: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
2820: 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a   unix_syscall {.
2830: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2840: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2850: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
2860: 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  ytem call */.  s
2870: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2880: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
2890: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
28a0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
28b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
28c0: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
28d0: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
28e0: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
28f0: 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70  ll[] = {.  { "op
2900: 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  en",         (sq
2910: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2920: 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20  r)posixOpen,  0 
2930: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
2940: 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  en      ((int(*)
2950: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2960: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30  ,int))aSyscall[0
2970: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
2980: 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20   "close",       
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 63 6c 6f 73 65 2c 20 20 20 20  l_ptr)close,    
29b0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
29c0: 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e  osClose     ((in
29d0: 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61  t(*)(int))aSysca
29e0: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
29f0: 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20  .  { "access",  
2a00: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2a10: 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73  scall_ptr)access
2a20: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
2a30: 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20  ine osAccess    
2a40: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
2a50: 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61  har*,int))aSysca
2a60: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[2].pCurrent).
2a70: 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20  .  { "getcwd",  
2a80: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2a90: 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64  scall_ptr)getcwd
2aa0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
2ab0: 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20  ine osGetcwd    
2ac0: 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a  ((char*(*)(char*
2ad0: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
2ae0: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
2af0: 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20    { "stat",     
2b00: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2b10: 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20  call_ptr)stat,  
2b20: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2b30: 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28  ne osStat      (
2b40: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
2b50: 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a  ar*,struct stat*
2b60: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
2b70: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54  urrent)../*.** T
2b80: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
2b90: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
2ba0: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
2bb0: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
2bc0: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
2bd0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
2be0: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
2bf0: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
2c00: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
2c10: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
2c20: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
2c30: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
2c40: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
2c50: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
2c60: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
2c70: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
2c80: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  fdef __DJGPP__. 
2c90: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
2ca0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2cb0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2cc0: 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c  ine osFstat(a,b,
2cd0: 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20  c)    0.#else   
2ce0: 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20    .  { "fstat", 
2cf0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2d00: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61  syscall_ptr)fsta
2d10: 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  t,      0  },.#d
2d20: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20  efine osFstat   
2d30: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73    ((int(*)(int,s
2d40: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
2d50: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
2d60: 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22  t).#endif..  { "
2d70: 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28  ftruncate",    (
2d80: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2d90: 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20  ptr)ftruncate,  
2da0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2db0: 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28  Ftruncate ((int(
2dc0: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  *)(int,off_t))aS
2dd0: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
2de0: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22  nt)..  { "fcntl"
2df0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2e00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
2e10: 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ntl,      0  },.
2e20: 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20  #define osFcntl 
2e30: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2e40: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
2e50: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
2e60: 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20  .  { "read",    
2e70: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2e80: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20  scall_ptr)read, 
2e90: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2ea0: 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20  ine osRead      
2eb0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
2ec0: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  ,void*,size_t))a
2ed0: 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72  Syscall[8].pCurr
2ee0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
2ef0: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
2f00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2f10: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
2f20: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
2f30: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2f40: 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20  _ptr)pread,     
2f50: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
2f60: 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20   "pread",       
2f70: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2f80: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
2f90: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
2fa0: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20  define osPread  
2fb0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
2fc0: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
2fd0: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
2fe0: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
2ff0: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3000: 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65  READ64).  { "pre
3010: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
3020: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3030: 29 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20  )pread64,    0  
3040: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
3050: 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71  ead64",      (sq
3060: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3070: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
3080: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
3090: 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28  ne osPread64   (
30a0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
30b0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
30c0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d  _t))aSyscall[10]
30d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
30e0: 22 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20  "write",        
30f0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3100: 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20  _ptr)write,     
3110: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3120: 73 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69  sWrite     ((ssi
3130: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3140: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29  t void*,size_t))
3150: 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75  aSyscall[11].pCu
3160: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3170: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
3180: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
3190: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
31a0: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
31b0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31c0: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20  ll_ptr)pwrite,  
31d0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
31e0: 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20   { "pwrite",    
31f0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3200: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3210: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3220: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
3230: 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e    ((ssize_t(*
3240: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
3250: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
3260: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
3270: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31        aSyscall[1
3280: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
3290: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
32a0: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69  EAD64).  { "pwri
32b0: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
32c0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
32d0: 70 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d  pwrite64,   0  }
32e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
32f0: 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c  ite64",     (sql
3300: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3310: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3320: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3330: 65 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28  e osPwrite64  ((
3340: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3350: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3360: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3380: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
3390: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
33a0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
33b0: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63 68 6d  _STYLE.  { "fchm
33c0: 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  od",       (sqli
33d0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
33e0: 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d  fchmod,     0  }
33f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68  ,.#else.  { "fch
3400: 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c  mod",       (sql
3410: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3420: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3430: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3440: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
3450: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
3460: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
3470: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3480: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
3490: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
34a0: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
34b0: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
34c0: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
34d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
34e0: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
34f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3500: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3510: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3520: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3530: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3540: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
3550: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
3560: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
3570: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3580: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
3590: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
35a0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
35b0: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
35c0: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
35d0: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
35e0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
35f0: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
3600: 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20  * "unix" VFSes. 
3610: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
3620: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
3630: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
3640: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
3650: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
3660: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
3670: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
3680: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
3690: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
36a0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
36b0: 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43  t unixSetSystemC
36c0: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
36d0: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
36e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
36f0: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
3700: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
3710: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
3720: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3730: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
3740: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
3750: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3760: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
3770: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
3780: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
3790: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
37a0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
37b0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
37c0: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
37d0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
37e0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
37f0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
3800: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
3810: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
3820: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
3830: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
3840: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
3850: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
3860: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
3870: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
3880: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
3890: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
38a0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
38b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
38c0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
38d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
38e0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
38f0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
3900: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
3910: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
3920: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
3930: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
3940: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
3950: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
3960: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
3970: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
3980: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
3990: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
39a0: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
39b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
39c0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
39d0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
39e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
39f0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
3a00: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
3a10: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3a20: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
3a30: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3a40: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
3a50: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
3a60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
3a70: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
3a80: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
3a90: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
3aa0: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
3ab0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
3ac0: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
3ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3ae0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3af0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3b00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
3b10: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
3b20: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
3b30: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
3b40: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
3b50: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
3b60: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
3b70: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
3b80: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
3b90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
3ba0: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
3bb0: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
3bc0: 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79  ll_ptr unixGetSy
3bd0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
3be0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
3bf0: 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d,.  const char 
3c00: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69  *zName.){.  unsi
3c10: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55  gned int i;..  U
3c20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3c30: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72  pNotUsed);.  for
3c40: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3c50: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3c60: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3c70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
3c80: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
3c90: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
3ca0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
3cb0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
3cc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3ce0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
3cf0: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
3d00: 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49   after zName.  I
3d10: 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a  f zName==NULL.**
3d20: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
3d30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
3d40: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  st system call. 
3d50: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3d60: 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20  zName.** is the 
3d70: 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  last system call
3d80: 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20   or if zName is 
3d90: 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  not the name of 
3da0: 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65  a valid.** syste
3db0: 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  m call..*/.stati
3dc0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
3dd0: 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  ixNextSystemCall
3de0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
3df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
3e00: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
3e10: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
3e20: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
3e30: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
3e40: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
3e50: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
3e60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
3e70: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
3e80: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
3e90: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
3ea0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
3eb0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
3ec0: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
3ed0: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
3ee0: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
3ef0: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
3f00: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
3f10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3f20: 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65 6e 28 29  .** Retry open()
3f30: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
3f40: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
3f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
3f60: 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  st_open(const ch
3f70: 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e  ar *z, int f, in
3f80: 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  t m){.  int rc;.
3f90: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65    do{ rc = osOpe
3fa0: 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65  n(z,f,m); }while
3fb0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
3fc0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
3fd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3fe0: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
3ff0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
4000: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
4010: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
4020: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
4030: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
4040: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
4050: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
4060: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
4070: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
4080: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
4090: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
40a0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
40b0: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
40c0: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
40d0: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
40e0: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
40f0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
4100: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
4110: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
4120: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
4130: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
4140: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
4150: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
4160: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
4170: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
4180: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
4190: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
41a0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
41b0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
41c0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
41d0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
41e0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
41f0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
4200: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4210: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
4220: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c  tatic void unixL
4230: 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
4240: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4250: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
4260: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
4270: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
4280: 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
4290: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
42a0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
42b0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
42c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
42d0: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
42e0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
42f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
4300: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
4310: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
4320: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
4330: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
4340: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
4350: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
4360: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
4370: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
4380: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
4390: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
43a0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
43b0: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
43c0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
43d0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
43e0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65  azFileLock(int e
43f0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69  FileLock){.  swi
4400: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
4410: 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f  {.    case NO_LO
4420: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
4430: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41 52  ";.    case SHAR
4440: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
4450: 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61  "SHARED";.    ca
4460: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
4470: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
4480: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45  ED";.    case PE
4490: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
44a0: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
44b0: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
44c0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
44d0: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
44e0: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
44f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
4500: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
4510: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
4520: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
4530: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
4540: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
4550: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4560: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
4570: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
4580: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
4590: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
45a0: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
45b0: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
45c0: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
45d0: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
45e0: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
45f0: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
4600: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
4610: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
4620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4630: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
4640: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
4650: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
4660: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
4670: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
4680: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
4690: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
46a0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
46b0: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
46c0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
46d0: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
46e0: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
46f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f  }else{.    s = o
4700: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
4710: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
4720: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
4730: 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25   unknown %d %d %
4740: 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29  d\n", fd, op, s)
4750: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a  ;.    return s;.
4760: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74    }.  if( p->l_t
4770: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4780: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
4790: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
47a0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
47b0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
47c0: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65   = "WRLCK";.  }e
47d0: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
47e0: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
47f0: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
4800: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
4810: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
4820: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f  .  assert( p->l_
4830: 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54  whence==SEEK_SET
4840: 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74   );.  s = osFcnt
4850: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
4860: 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72  savedErrno = err
4870: 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  no;.  sqlite3Deb
4880: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
4890: 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25  %d %d %s %s %d %
48a0: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
48b0: 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a   threadid, fd, z
48c0: 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28  OpName, zType, (
48d0: 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20  int)p->l_start, 
48e0: 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20  (int)p->l_len,. 
48f0: 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69      (int)p->l_pi
4900: 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d  d, s);.  if( s==
4910: 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45  (-1) && op==F_SE
4920: 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70  TLK && (p->l_typ
4930: 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d  e==F_RDLCK || p-
4940: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
4950: 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
4960: 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32  flock l2;.    l2
4970: 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e   = *p;.    osFcn
4980: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
4990: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
49a0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
49b0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
49c0: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
49d0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
49e0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
49f0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
4a00: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
4a10: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
4a20: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
4a30: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
4a40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4a50: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
4a60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4a70: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
4a80: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
4a90: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
4aa0: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
4ab0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
4ac0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
4ad0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
4ae0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
4af0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
4b00: 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20  urn s;.}.#undef 
4b10: 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20  osFcntl.#define 
4b20: 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63  osFcntl lockTrac
4b30: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
4b40: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f  TE_LOCK_TRACE */
4b50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74  ../*.** Retry ft
4b60: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20  runcate() calls 
4b70: 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f  that fail due to
4b80: 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63   EINTR.*/.static
4b90: 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75   int robust_ftru
4ba0: 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c  ncate(int h, sql
4bb0: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a  ite3_int64 sz){.
4bc0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20    int rc;.  do{ 
4bd0: 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65  rc = osFtruncate
4be0: 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20  (h,sz); }while( 
4bf0: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
4c00: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
4c10: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
4c20: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
4c30: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
4c40: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
4c50: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
4c60: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
4c70: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
4c80: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
4c90: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
4ca0: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
4cb0: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
4cc0: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
4cd0: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
4ce0: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
4cf0: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
4d00: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
4d10: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
4d20: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
4d30: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
4d40: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
4d50: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
4d60: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
4d70: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
4d80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
4d90: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
4da0: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
4db0: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
4dc0: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
4dd0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
4de0: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
4df0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
4e00: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
4e10: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
4e20: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
4e30: 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f  ror) {.#if 0.  /
4e40: 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
4e50: 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f 74  his code was not
4e60: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
4e70: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73 20  In theory, this 
4e80: 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75  branch.  ** shou
4e90: 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74 2c  ld never be hit,
4ea0: 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
4eb0: 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  n should only be
4ec0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20 20   called after.  
4ed0: 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c  ** a locking-rel
4ee0: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28 69  ated function (i
4ef0: 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61 73  .e. fcntl()) has
4f00: 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65   returned non-ze
4f10: 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ro with.  ** the
4f20: 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20   value of errno 
4f30: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
4f40: 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20 73  ument. Since a s
4f50: 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20 66  ystem call has f
4f60: 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e  ailed,.  ** errn
4f70: 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d  o should be non-
4f80: 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
4f90: 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69 66  Despite this, if
4fa0: 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73   errno really is
4fb0: 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20   zero, we still 
4fc0: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
4fd0: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
4fe0: 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d 20  _OK. The system 
4ff0: 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64  call failed, and
5000: 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65   *some* SQLite e
5010: 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a 20  rror should be. 
5020: 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20 62   ** propagated b
5030: 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ack to the calle
5040: 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68  r. Commenting th
5050: 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d 65  is branch out me
5060: 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a  ans errno==0.  *
5070: 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65  * will be handle
5080: 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75 6c  d by the "defaul
5090: 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a  t:" case below..
50a0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a    */.  case 0: .
50b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
50c0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  E_OK;.#endif..  
50d0: 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63  case EAGAIN:.  c
50e0: 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20  ase ETIMEDOUT:. 
50f0: 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63   case EBUSY:.  c
5100: 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73  ase EINTR:.  cas
5110: 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20  e ENOLCK:  .    
5120: 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65  /* random NFS re
5130: 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73  try error, unles
5140: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
5150: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
5160: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
5170: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
5180: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
5190: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20  hat it says */. 
51a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
51b0: 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61  _BUSY;.    .  ca
51c0: 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20  se EACCES: .    
51d0: 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b  /* EACCES is lik
51e0: 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20  e EAGAIN during 
51f0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
5200: 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ns, but not any 
5210: 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20  other time*/.   
5220: 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72   if( (sqliteIOEr
5230: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
5240: 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71  R_LOCK) || ..(sq
5250: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
5260: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
5270: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
5280: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
5290: 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09  ERR_RDLOCK) ||..
52a0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
52b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
52c0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
52d0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
52e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
52f0: 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66   }.    /* else f
5300: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
5310: 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20   case EPERM: .  
5320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5330: 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a 20  PERM;.    .  /* 
5340: 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c 79 20  EDEADLK is only 
5350: 70 6f 73 73 69 62 6c 65 20 69 66 20 61 20 63 61  possible if a ca
5360: 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45  ll to fcntl(F_SE
5370: 54 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e 20 41  TLKW) is made. A
5380: 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d 6f 64  nd.  ** this mod
5390: 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65 73 20  ule never makes 
53a0: 73 75 63 68 20 61 20 63 61 6c 6c 2e 20 41 6e 64  such a call. And
53b0: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 53 51 4c   the code in SQL
53c0: 69 74 65 20 69 74 73 65 6c 66 20 0a 20 20 2a 2a  ite itself .  **
53d0: 20 61 73 73 65 72 74 73 20 74 68 61 74 20 53 51   asserts that SQ
53e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
53f0: 45 44 20 69 73 20 6e 65 76 65 72 20 72 65 74 75  ED is never retu
5400: 72 6e 65 64 2e 20 46 6f 72 20 74 68 65 73 65 20  rned. For these 
5410: 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74 68 69  reasons.  ** thi
5420: 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 63  s case is also c
5430: 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 66  ommented out. If
5440: 20 74 68 65 20 73 79 73 74 65 6d 20 64 6f 65 73   the system does
5450: 20 73 65 74 20 65 72 72 6e 6f 20 74 6f 20 45 44   set errno to ED
5460: 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65 20  EADLK,.  ** the 
5470: 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f 49  default SQLITE_I
5480: 4f 45 52 52 5f 58 58 58 20 63 6f 64 65 20 77 69  OERR_XXX code wi
5490: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
54a0: 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61 73 65 20  */.#if 0.  case 
54b0: 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74  EDEADLK:.    ret
54c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
54d0: 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64 69 66  _BLOCKED;.#endif
54e0: 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54  .    .#if EOPNOT
54f0: 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20  SUPP!=ENOTSUP.  
5500: 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a  case EOPNOTSUPP:
5510: 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69   .    /* somethi
5520: 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79  ng went terribly
5530: 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75   awry, unless du
5540: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
5550: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
5560: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
5570: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
5580: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
5590: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
55a0: 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50  f.#ifdef ENOTSUP
55b0: 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a  .  case ENOTSUP:
55c0: 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64   .    /* invalid
55d0: 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69   fd, unless duri
55e0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
55f0: 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63  upport introspec
5600: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a  tion, in which .
5610: 20 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c       * it actual
5620: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
5630: 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a   says */.#endif.
5640: 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61    case EIO:.  ca
5650: 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65  se EBADF:.  case
5660: 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20   EINVAL:.  case 
5670: 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65  ENOTCONN:.  case
5680: 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20   ENODEV:.  case 
5690: 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e  ENXIO:.  case EN
56a0: 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45 53 54  OENT:.#ifdef EST
56b0: 41 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ALE             
56c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54 41 4c          /* ESTAL
56d0: 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  E is not defined
56e0: 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79 73 74   on Interix syst
56f0: 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20 45 53  ems */.  case ES
5700: 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63  TALE:.#endif.  c
5710: 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20  ase ENOSYS:.    
5720: 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20  /* these should 
5730: 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74  force the client
5740: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69   to close the fi
5750: 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74  le and reconnect
5760: 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75   */.    .  defau
5770: 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  lt: .    return 
5780: 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d  sqliteIOErr;.  }
5790: 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}..../*********
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57e0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
57f0: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
5800: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
5810: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
5820: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
5830: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
5840: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
5850: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
5860: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
5870: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
5880: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
5890: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
58a0: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
58b0: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
58c0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
58d0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
58e0: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
58f0: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
5900: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
5910: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
5920: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
5930: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
5940: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
5950: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
5960: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
5970: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
5980: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
5990: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
59a0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
59b0: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
59c0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
59d0: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
59e0: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
59f0: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
5a00: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
5a10: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
5a20: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
5a30: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
5a40: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
5a50: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
5a60: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
5a70: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
5a80: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
5a90: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
5aa0: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
5ab0: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
5ac0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
5ad0: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
5ae0: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
5af0: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
5b00: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
5b10: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
5b20: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
5b30: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
5b40: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
5b50: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
5b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5b70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5b80: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
5b90: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
5ba0: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5bc0: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
5bd0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
5be0: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
5bf0: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
5c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
5c10: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
5c20: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
5c30: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
5c40: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
5c50: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
5c60: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
5c70: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
5c80: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
5c90: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
5ca0: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
5cb0: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
5cc0: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
5cd0: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
5ce0: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
5cf0: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
5d00: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
5d10: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
5d20: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
5d30: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
5d40: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
5d50: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
5d60: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
5d70: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
5d80: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
5d90: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
5da0: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
5db0: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
5dc0: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
5dd0: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
5de0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
5df0: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
5e00: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
5e10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
5e20: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
5e30: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
5e40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5e50: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
5e60: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
5e70: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
5e80: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
5e90: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
5ea0: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
5eb0: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
5ec0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
5ed0: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
5ee0: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
5ef0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
5f00: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
5f10: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
5f20: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
5f30: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
5f40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5f50: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
5f60: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
5f70: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
5f80: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
5f90: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
5fa0: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
5fb0: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
5fc0: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
5fd0: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
5fe0: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
5ff0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6000: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
6010: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
6020: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
6030: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
6040: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
6050: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
6060: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
6070: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
6080: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
6090: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
60a0: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
60b0: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
60c0: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
60d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
60e0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
60f0: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
6100: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
6110: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
6120: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
6130: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
6140: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
6150: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
6160: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
6170: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
6180: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
6190: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
61a0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
61b0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
61c0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
61d0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
61e0: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
61f0: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
6200: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
6210: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6220: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
6230: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
6240: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
6250: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
6260: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
6270: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
6280: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
6290: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
62a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
62d0: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
62e0: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
62f0: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
6300: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
6310: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
6320: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
6330: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
6340: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
6350: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e  zeof(*pNew) + (n
6360: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  +1) );.  if( pNe
6370: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
6380: 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  .  pNew->zCanoni
6390: 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  calName = (char*
63a0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d  )&pNew[1];.  mem
63b0: 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  cpy(pNew->zCanon
63c0: 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c  icalName, zAbsol
63d0: 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20  uteName, n+1);. 
63e0: 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70   n = vxworksSimp
63f0: 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a  lifyName(pNew->z
6400: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
6410: 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  );..  /* Search 
6420: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
6430: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
6440: 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61  ing the canonica
6450: 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20  l name..  ** If 
6460: 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  found, increment
6470: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
6480: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
6490: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a  a pointer to.  *
64a0: 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66  * the existing f
64b0: 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75  ile ID..  */.  u
64c0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
64d0: 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74  .  for(pCandidat
64e0: 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  e=vxworksFileLis
64f0: 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70  t; pCandidate; p
6500: 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69  Candidate=pCandi
6510: 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  date->pNext){.  
6520: 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65    if( pCandidate
6530: 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20  ->nName==n .    
6540: 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64   && memcmp(pCand
6550: 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61  idate->zCanonica
6560: 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61  lName, pNew->zCa
6570: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d  nonicalName, n)=
6580: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
6590: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
65a0: 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e  ew);.       pCan
65b0: 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  didate->nRef++;.
65c0: 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
65d0: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
65e0: 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74  return pCandidat
65f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  e;.    }.  }..  
6600: 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20  /* No match was 
6610: 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20  found.  We will 
6620: 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20  make a new file 
6630: 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52  ID */.  pNew->nR
6640: 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e  ef = 1;.  pNew->
6650: 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65  nName = n;.  pNe
6660: 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72  w->pNext = vxwor
6670: 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78  ksFileList;.  vx
6680: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
6690: 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76  pNew;.  unixLeav
66a0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
66b0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
66c0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
66d0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
66e0: 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65  on a vxworksFile
66f0: 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65  Id object.  Free
6700: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77  .** the object w
6710: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
6720: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
6730: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
6740: 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65  void vxworksRele
6750: 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74  aseFileId(struct
6760: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
6770: 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65  pId){.  unixEnte
6780: 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
6790: 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20  rt( pId->nRef>0 
67a0: 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d  );.  pId->nRef--
67b0: 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65  ;.  if( pId->nRe
67c0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  f==0 ){.    stru
67d0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
67e0: 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70   **pp;.    for(p
67f0: 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  p=&vxworksFileLi
6800: 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d  st; *pp && *pp!=
6810: 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70  pId; pp = &((*pp
6820: 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20  )->pNext)){}.   
6830: 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49   assert( *pp==pI
6840: 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  d );.    *pp = p
6850: 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  Id->pNext;.    s
6860: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29  qlite3_free(pId)
6870: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
6880: 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64  eMutex();.}.#end
6890: 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
68a0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
68b0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71  **** End of Uniq
68c0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
68d0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
68e0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
68f0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6940: 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
6950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6990: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
69a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69b0: 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79  * Posix Advisory
69c0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
69d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69e0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49  *****.**.** POSI
69f0: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
6a00: 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64   are broken by d
6a10: 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44  esign.  ANSI STD
6a20: 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a   1003.1 (1996).*
6a30: 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e  * section 6.5.2.
6a40: 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f  2 lines 483 thro
6a50: 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20  ugh 490 specify 
6a60: 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63  that when a proc
6a70: 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63  ess.** sets or c
6a80: 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68  lears a lock, th
6a90: 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65  at operation ove
6aa0: 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72  rrides any prior
6ab0: 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79   locks set.** by
6ac0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
6ad0: 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  s.  It does not 
6ae0: 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73  explicitly say s
6af0: 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c  o, but this impl
6b00: 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f  ies.** that it o
6b10: 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73  verrides locks s
6b20: 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  et by the same p
6b30: 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64  rocess using a d
6b40: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
6b50: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f   descriptor.  Co
6b60: 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74  nsider this test
6b70: 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   case:.**.**    
6b80: 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65     int fd1 = ope
6b90: 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52  n("./file1", O_R
6ba0: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
6bb0: 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  4);.**       int
6bc0: 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd2 = open("./f
6bd0: 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile2", O_RDWR|O_
6be0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
6bf0: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69  .** Suppose ./fi
6c00: 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20  le1 and ./file2 
6c10: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73  are really the s
6c20: 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ame file (becaus
6c30: 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61  e.** one is a ha
6c40: 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c  rd or symbolic l
6c50: 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72  ink to the other
6c60: 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65  ) then if you se
6c70: 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76  t.** an exclusiv
6c80: 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74  e lock on fd1, t
6c90: 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61  hen try to get a
6ca0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
6cb0: 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77  .** on fd2, it w
6cc0: 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68  orks.  I would h
6cd0: 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65  ave expected the
6ce0: 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a   second lock to.
6cf0: 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68  ** fail since th
6d00: 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  ere was already 
6d10: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
6d20: 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a  le due to fd1..*
6d30: 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53  * But not so.  S
6d40: 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20  ince both locks 
6d50: 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61  came from the sa
6d60: 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a  me process, the.
6d70: 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69  ** second overri
6d80: 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65  des the first, e
6d90: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
6da0: 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e  were on differen
6db0: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
6dc0: 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20  ptors opened on 
6dd0: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e  different file n
6de0: 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ames..**.** This
6df0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63   means that we c
6e00: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
6e10: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
6e20: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
6e30: 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74  .** among compet
6e40: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
6e50: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
6e60: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
6e70: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
6e80: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
6e90: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
6ea0: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
6eb0: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
6ec0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
6ed0: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
6ee0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
6ef0: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
6f00: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
6f10: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
6f20: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
6f30: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
6f40: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
6f50: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
6f60: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
6f70: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
6f80: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
6f90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6fa0: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
6fb0: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
6fc0: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
6fd0: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
6fe0: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
6ff0: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
7000: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
7010: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
7020: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
7030: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
7040: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
7050: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
7060: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
7070: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
7080: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
7090: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
70a0: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
70b0: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
70c0: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
70d0: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
70e0: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
70f0: 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73  * (Aside: The us
7100: 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65  e of inode numbe
7110: 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73  rs as unique IDs
7120: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
7130: 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f  n VxWorks..** Fo
7140: 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61  r VxWorks, we ha
7150: 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c  ve to use the al
7160: 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65  ternative unique
7170: 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64   ID system based
7180: 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c   on.** canonical
7190: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d   filename and im
71a0: 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65  plemented in the
71b0: 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69   previous divisi
71c0: 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  on.).**.** The s
71d0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
71e0: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20  cture for POSIX 
71f0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73  is no longer jus
7200: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c  t an integer fil
7210: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e  e.** descriptor.
7220: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74    It is now a st
7230: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c  ructure that hol
7240: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66  ds the integer f
7250: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
7260: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  r and a pointer 
7270: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74  to a structure t
7280: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
7290: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f  e internal.** lo
72a0: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  cks on the corre
72b0: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20  sponding inode. 
72c0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f   There is one lo
72d0: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a  cking structure.
72e0: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f  ** per inode, so
72f0: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   if the same ino
7300: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69  de is opened twi
7310: 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c  ce, both unixFil
7320: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
7330: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
7340: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
7350: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
7360: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
7370: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
7380: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
7390: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
73a0: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
73b0: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
73c0: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
73d0: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
73e0: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
73f0: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
7400: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
7410: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
7420: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
7430: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
7440: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
7450: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
7460: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
7470: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
7480: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
7490: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
74a0: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
74b0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
74c0: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
74d0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
74e0: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
74f0: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
7500: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
7510: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
7520: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
7530: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
7540: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
7550: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
7560: 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74  .** But wait:  t
7570: 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72  here are yet mor
7580: 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  e problems with 
7590: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
75a0: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79  ocks..**.** If y
75b0: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20  ou close a file 
75c0: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
75d0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65  points to a file
75e0: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c   that has locks,
75f0: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e  .** all locks on
7600: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
7610: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65  are owned by the
7620: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
7630: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64   are.** released
7640: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
7650: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20  d this problem, 
7660: 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e  each unixInodeIn
7670: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69  fo object.** mai
7680: 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f  ntains a count o
7690: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
76a0: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  pending locks on
76b0: 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57   tha inode..** W
76c0: 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
76d0: 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20  s made to close 
76e0: 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20  an unixFile, if 
76f0: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68  there are.** oth
7700: 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e  er unixFile open
7710: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   on the same ino
7720: 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64  de that are hold
7730: 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63  ing locks, the c
7740: 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28  all.** to close(
7750: 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  ) the file descr
7760: 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65  iptor is deferre
7770: 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74  d until all of t
7780: 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a  he locks clear..
7790: 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65  ** The unixInode
77a0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b  Info structure k
77b0: 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66  eeps a list of f
77c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
77d0: 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20  that need to.** 
77e0: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68  be closed and th
77f0: 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65  at list is walke
7800: 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20  d (and cleared) 
7810: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
7820: 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a  ck.** clears..**
7830: 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20  .** Yet another 
7840: 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54  problem:  LinuxT
7850: 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c  hreads do not pl
7860: 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73  ay well with pos
7870: 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ix locks..**.** 
7880: 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69  Many older versi
7890: 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65  ons of linux use
78a0: 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64   the LinuxThread
78b0: 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20  s library which 
78c0: 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20  is.** not posix 
78d0: 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65  compliant.  Unde
78e0: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  r LinuxThreads, 
78f0: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
7900: 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61  y thread.** A ca
7910: 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64  nnot be modified
7920: 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62   or overridden b
7930: 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  y a different th
7940: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20  read B..** Only 
7950: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64  thread A can mod
7960: 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c  ify the lock.  L
7970: 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20  ocking behavior 
7980: 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66  is correct.** if
7990: 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20   the appliation 
79a0: 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e  uses the newer N
79b0: 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65  ative Posix Thre
79c0: 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c  ad Library (NPTL
79d0: 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20  ).** on linux - 
79e0: 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b  with NPTL a lock
79f0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
7a00: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
7a10: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68  e locks.** in th
7a20: 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65  read B.  But the
7a30: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
7a40: 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d  know at compile-
7a50: 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68  time which.** th
7a60: 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20  reading library 
7a70: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
7a80: 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  So there is no w
7a90: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a  ay to know at.**
7aa0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
7ab0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
7ac0: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
7ad0: 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65  de locks on thre
7ae0: 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73  ad B..** One has
7af0: 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d   to do a run-tim
7b00: 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f  e check to disco
7b10: 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72  ver the behavior
7b20: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   of the.** curre
7b30: 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  nt process..**.*
7b40: 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f  * SQLite used to
7b50: 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68   support LinuxTh
7b60: 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70  reads.  But supp
7b70: 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72  ort for LinuxThr
7b80: 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70  eads.** was drop
7b90: 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ped beginning wi
7ba0: 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30  th version 3.7.0
7bb0: 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73  .  SQLite will s
7bc0: 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a  till work with.*
7bd0: 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70  * LinuxThreads p
7be0: 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29  rovided that (1)
7bf0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72   there is no mor
7c00: 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65  e than one conne
7c10: 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61  ction .** per da
7c20: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
7c30: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
7c40: 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65  and (2) database
7c50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
7c60: 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f  do not move acro
7c70: 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a  ss threads..*/..
7c80: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
7c90: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
7ca0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
7cb0: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
7cc0: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
7cd0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e   a particular un
7ce0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
7cf0: 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ct..*/.struct un
7d00: 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76  ixFileId {.  dev
7d10: 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20  _t dev;         
7d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
7d30: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  ce number */.#if
7d40: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
7d50: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7d60: 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69  Id *pId;  /* Uni
7d70: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
7d80: 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73  vxworks. */.#els
7d90: 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  e.  ino_t ino;  
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20  /* Inode number 
7dc0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
7dd0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
7de0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7df0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
7e00: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
7e10: 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20   open.** inode. 
7e20: 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72   Or, on LinuxThr
7e30: 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f  eads, there is o
7e40: 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75  ne of these stru
7e50: 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61  ctures for.** ea
7e60: 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20  ch inode opened 
7e70: 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a  by each thread..
7e80: 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69  **.** A single i
7e90: 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75  node can have mu
7ea0: 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63  ltiple file desc
7eb0: 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68  riptors, so each
7ec0: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
7ed0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
7ee0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
7ef0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
7f00: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73   object and this
7f10: 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73  .** object keeps
7f20: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
7f30: 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69  number of unixFi
7f40: 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  le pointing to i
7f50: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
7f60: 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73  xInodeInfo {.  s
7f70: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
7f80: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f   fileId;       /
7f90: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79  * The lookup key
7fa0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65   */.  int nShare
7fb0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
7fc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7fd0: 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  of SHARED locks 
7fe0: 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  held */.  unsign
7ff0: 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63  ed char eFileLoc
8000: 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  k;        /* One
8010: 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c   of SHARED_LOCK,
8020: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65   RESERVED_LOCK e
8030: 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tc. */.  unsigne
8040: 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c  d char bProcessL
8050: 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65  ock;     /* An e
8060: 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73  xclusive process
8070: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f   lock is held */
8080: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
80b0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73  pointers to this
80c0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
80d0: 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
80e0: 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  mNode;          
80f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
8100: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8110: 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20   this inode */. 
8120: 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20   int nLock;     
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
8150: 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c  tstanding file l
8160: 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  ocks */.  UnixUn
8170: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
8180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75            /* Unu
8190: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
81a0: 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f  tors to close */
81b0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
81c0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
81d0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
81e0: 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  l unixInodeInfo 
81f0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69  objects */.  uni
8200: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65  xInodeInfo *pPre
8210: 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v;           /* 
8220: 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c     .... doubly l
8230: 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c  inked */.#if SQL
8240: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
8250: 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67  NG_STYLE.  unsig
8260: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
8270: 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f  aredByte;  /* fo
8280: 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20  r AFP simulated 
8290: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23  shared lock */.#
82a0: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57  endif.#if OS_VXW
82b0: 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53  ORKS.  sem_t *pS
82c0: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
82d0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20         /* Named 
82e0: 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20  POSIX semaphore 
82f0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61  */.  char aSemNa
8300: 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
8310: 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  2];  /* Name of 
8320: 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a  that semaphore *
8330: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8340: 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c  ** A lists of al
8350: 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  l unixInodeInfo 
8360: 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74  objects..*/.stat
8370: 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ic unixInodeInfo
8380: 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b   *inodeList = 0;
8390: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ../*.**.** This 
83a0: 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c  function - unixL
83b0: 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73 20  ogError_x(), is 
83c0: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
83d0: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
83e0: 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29  * unixLogError()
83f0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e  ..**.** It is in
8400: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
8410: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
8420: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e  n OS function an
8430: 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e  d errno has been
8440: 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73  .** set. It logs
8450: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
8460: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
8470: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
8480: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
8490: 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20  * errno and, if 
84a0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
84b0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
84c0: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72  ivalent from str
84d0: 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74  error() or.** st
84e0: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a  rerror_r()..**.*
84f0: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
8500: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
8510: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
8520: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
8530: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
8540: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
8550: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
8560: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
8570: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
8580: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
8590: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
85a0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
85b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
85c0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
85d0: 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75   failed (e.g. "u
85e0: 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20  nlink", "open") 
85f0: 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f  and the the asso
8600: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
8610: 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61  em path,.** if a
8620: 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75  ny..*/.#define u
8630: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  nixLogError(a,b,
8640: 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  c)     unixLogEr
8650: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
8660: 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63  __LINE__).static
8670: 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f   int unixLogErro
8680: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
8690: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
86a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
86b0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
86c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
86d0: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
86e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
86f0: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
8700: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
8710: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8730: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
8740: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
8750: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20  */.  int iLine  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
8780: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
8790: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
87a0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
87b0: 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rr;             
87c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61          /* Messa
87d0: 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  ge from strerror
87e0: 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  () or equivalent
87f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f   */.  int iErrno
8800: 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20   = errno;       
8810: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73        /* Saved s
8820: 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d  yscall error num
8830: 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ber */..  /* If 
8840: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68  this is not a th
8850: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28  readsafe build (
8860: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8870: 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a  E==0), then use.
8880: 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f    ** the strerro
8890: 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
88a0: 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e  obtain the human
88b0: 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20  -readable error 
88c0: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75  message.  ** equ
88d0: 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f  ivalent to errno
88e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
88f0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20   strerror_r().. 
8900: 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f   */ .#if SQLITE_
8910: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
8920: 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52  fined(HAVE_STRER
8930: 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45  ROR_R).  char aE
8940: 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74  rr[80];.  memset
8950: 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (aErr, 0, sizeof
8960: 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20  (aErr));.  zErr 
8970: 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66  = aErr;..  /* If
8980: 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52   STRERROR_R_CHAR
8990: 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63  _P (set by autoc
89a0: 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20  onf scripts) or 
89b0: 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66  __USE_GNU is def
89c0: 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d  ined,.  ** assum
89d0: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
89e0: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 74  m provides the t
89f0: 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f  he GNU version o
8a00: 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74  f strerror_r() t
8a10: 68 61 74 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  hat .  ** return
8a20: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
8a30: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
8a40: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
8a50: 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74  sage. That point
8a60: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69  er .  ** may poi
8a70: 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72  nt to aErr[], or
8a80: 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   it may point to
8a90: 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f   some static sto
8aa0: 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20  rage somewhere. 
8ab0: 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
8ac0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
8ad0: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
8ae0: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
8af0: 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65  on of .  ** stre
8b00: 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20  rror_r(), which 
8b10: 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e  always writes an
8b20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
8b30: 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a  nto aErr[]..  **
8b40: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64  .  ** If the cod
8b50: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73  e incorrectly as
8b60: 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
8b70: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
8b80: 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  on that is.  ** 
8b90: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65  available, the e
8ba0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
8bb0: 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d  l often be an em
8bc0: 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20  pty string. Not 
8bd0: 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62  a.  ** huge prob
8be0: 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79  lem. Incorrectly
8bf0: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74   concluding that
8c00: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
8c10: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20   is available . 
8c20: 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74   ** could lead t
8c30: 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f  o a segfault tho
8c40: 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  ugh..  */.#if de
8c50: 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52  fined(STRERROR_R
8c60: 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69  _CHAR_P) || defi
8c70: 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20  ned(__USE_GNU). 
8c80: 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66   zErr = .# endif
8c90: 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45  .  strerror_r(iE
8ca0: 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65  rrno, aErr, size
8cb0: 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65  of(aErr)-1);..#e
8cc0: 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  lif SQLITE_THREA
8cd0: 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20  DSAFE.  /* This 
8ce0: 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20  is a threadsafe 
8cf0: 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72  build, but strer
8d00: 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61  ror_r() is not a
8d10: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a  vailable. */.  z
8d20: 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  Err = "";.#else.
8d30: 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73    /* Non-threads
8d40: 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73  afe build, use s
8d50: 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20  trerror(). */.  
8d60: 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28  zErr = strerror(
8d70: 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a  iErrno);.#endif.
8d80: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
8d90: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
8da0: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
8db0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
8dc0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
8dd0: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75  ode,.      "os_u
8de0: 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  nix.c:%d: (%d) %
8df0: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
8e00: 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f     iLine, iErrno
8e10: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
8e20: 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zErr.  );..  ret
8e30: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
8e40: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
8e50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
8e60: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
8e70: 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f  hat close() almo
8e80: 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c  st always works,
8e90: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c   since it is onl
8ea0: 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73  y in a.** very s
8eb0: 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ick application 
8ec0: 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63  or on a very sic
8ed0: 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20  k platform that 
8ee0: 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a  it might fail..*
8ef0: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69  * If it does fai
8f00: 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74  l, simply leak t
8f10: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
8f20: 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74  or, but do log t
8f30: 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  he.** error..**.
8f40: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
8f50: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72  is not safe to r
8f60: 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74  etry close() aft
8f70: 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74  er EINTR since t
8f80: 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  he.** file descr
8f90: 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65  iptor might have
8fa0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
8fb0: 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20  used by another 
8fc0: 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65  thread..** So we
8fd0: 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20   don't even try 
8fe0: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
8ff0: 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20  an EINTR.  Just 
9000: 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  log the error.**
9010: 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f   and move on..*/
9020: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62  .static void rob
9030: 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69  ust_close(unixFi
9040: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68  le *pFile, int h
9050: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
9060: 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20   if( osClose(h) 
9070: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  ){.    unixLogEr
9080: 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45  rorAtLine(SQLITE
9090: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63  _IOERR_CLOSE, "c
90a0: 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20  lose",.         
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
90c0: 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61  ile ? pFile->zPa
90d0: 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b  th : 0, lineno);
90e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
90f0: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73  ose all file des
9100: 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61  criptors accumua
9110: 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49  ted in the unixI
9120: 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65  nodeInfo->pUnuse
9130: 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74  d list..*/ .stat
9140: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e  ic void closePen
9150: 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65  dingFds(unixFile
9160: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
9170: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
9180: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9190: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
91a0: 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73  d *p;.  UnixUnus
91b0: 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66  edFd *pNext;.  f
91c0: 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e  or(p=pInode->pUn
91d0: 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74  used; p; p=pNext
91e0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
91f0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62  ->pNext;.    rob
9200: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
9210: 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   p->fd, __LINE__
9220: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
9230: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49  ree(p);.  }.  pI
9240: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
9250: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
9260: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
9270: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
9280: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
9290: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
92a0: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
92b0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
92c0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
92d0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
92e0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
92f0: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
9300: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
9310: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9320: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
9330: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9340: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9350: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9360: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
9370: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
9380: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
9390: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
93a0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
93b0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
93c0: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
93d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
93e0: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
93f0: 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 );.      close
9400: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
9410: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
9420: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
9430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
9440: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
9450: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
9460: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
9470: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
9480: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
9490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
94a0: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
94b0: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
94c0: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
94d0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
94e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
94f0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
9500: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
9510: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
9520: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
9530: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
9540: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
9550: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
9560: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9570: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
9580: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
9590: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
95a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
95b0: 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69  , locate the uni
95c0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
95d0: 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  t that.** descri
95e0: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
95f0: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
9600: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
9610: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
9620: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d  * return value m
9630: 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61  ight be uninitia
9640: 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f  lized if an erro
9650: 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  r occurs..**.** 
9660: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
9670: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
9680: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
9690: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
96a0: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
96b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
96c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
96d0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
96e0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
96f0: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
9700: 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  odeInfo(.  unixF
9710: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
9720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
9730: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
9740: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
9750: 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49  e key */.  unixI
9760: 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f  nodeInfo **ppIno
9770: 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  de        /* Ret
9780: 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  urn the unixInod
9790: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72  eInfo object her
97a0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
97b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
97c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74           /* Syst
97d0: 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63  em call return c
97e0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  ode */.  int fd;
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
9810: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
9820: 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74  or pFile */.  st
9830: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
9840: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
9850: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
9860: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
9870: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
9880: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
9890: 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
98a0: 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
98b0: 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  on */.  unixInod
98c0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
98d0: 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64  0;     /* Candid
98e0: 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ate unixInodeInf
98f0: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  o object */..  a
9900: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
9910: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
9920: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
9930: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
9940: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
9950: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
9960: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
9970: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
9980: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
9990: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
99a0: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
99b0: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
99c0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  c!=0 ){.    pFil
99d0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
99e0: 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56  rrno;.#ifdef EOV
99f0: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
9a00: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
9a10: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
9a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
9a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
9a40: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9a50: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
9a60: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
9a70: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
9a80: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
9a90: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
9aa0: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
9ab0: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
9ac0: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
9ad0: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
9ae0: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
9af0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
9b00: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
9b10: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
9b20: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
9b30: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
9b40: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
9b50: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
9b60: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
9b70: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
9b80: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
9b90: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
9ba0: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
9bb0: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
9bc0: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
9bd0: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
9be0: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
9bf0: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
9c00: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
9c10: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
9c20: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
9c30: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
9c40: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
9c50: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
9c60: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
9c70: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
9c80: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
9c90: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
9ca0: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
9cb0: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
9cc0: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
9cd0: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
9ce0: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
9cf0: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
9d00: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
9d10: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
9d20: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
9d30: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
9d40: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
9d50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
9d60: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
9d70: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
9d80: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
9d90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
9da0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
9db0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
9dc0: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
9dd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
9de0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
9df0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
9e00: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
9e10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
9e20: 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  f..  memset(&fil
9e30: 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  eId, 0, sizeof(f
9e40: 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49  ileId));.  fileI
9e50: 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  d.dev = statbuf.
9e60: 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56  st_dev;.#if OS_V
9e70: 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e  XWORKS.  fileId.
9e80: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
9e90: 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64  ;.#else.  fileId
9ea0: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
9eb0: 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20  t_ino;.#endif.  
9ec0: 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
9ed0: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  st;.  while( pIn
9ee0: 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66  ode && memcmp(&f
9ef0: 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e  ileId, &pInode->
9f00: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
9f10: 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70  ileId)) ){.    p
9f20: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
9f30: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
9f40: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
9f50: 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74    pInode = sqlit
9f60: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
9f70: 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20  f(*pInode) );.  
9f80: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
9f90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9fa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9fb0: 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
9fc0: 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Inode, 0, sizeof
9fd0: 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20  (*pInode));.    
9fe0: 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e  memcpy(&pInode->
9ff0: 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c  fileId, &fileId,
a000: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
a010: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  ;.    pInode->nR
a020: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f  ef = 1;.    pIno
a030: 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64  de->pNext = inod
a040: 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64  eList;.    pInod
a050: 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  e->pPrev = 0;.  
a060: 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20    if( inodeList 
a070: 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72  ) inodeList->pPr
a080: 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20  ev = pInode;.   
a090: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
a0a0: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
a0b0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b    pInode->nRef++
a0c0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65  ;.  }.  *ppInode
a0d0: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74   = pInode;.  ret
a0e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a0f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
a100: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
a110: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
a120: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
a130: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
a140: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
a150: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
a160: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
a170: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
a180: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
a190: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
a1a0: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
a1b0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
a1c0: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
a1d0: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
a1e0: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
a1f0: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
a200: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
a210: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
a220: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
a230: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
a240: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
a250: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
a260: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
a270: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
a280: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
a290: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
a2a0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
a2b0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
a2c0: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
a2d0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
a2e0: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
a2f0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
a300: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
a310: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
a320: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
a330: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
a340: 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a  threads */..  /*
a350: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
a360: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
a370: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
a380: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
a390: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
a3a0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
a3b0: 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
a3c0: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
a3d0: 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
a3e0: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
a3f0: 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
a400: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44    */.#ifndef __D
a410: 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65  JGPP__.  if( !re
a420: 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65  served && !pFile
a430: 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
a440: 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74  ssLock ){.    st
a450: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
a460: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
a470: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
a480: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
a490: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
a4a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
a4b0: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
a4c0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
a4d0: 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28      if( osFcntl(
a4e0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
a4f0: 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  K, &lock) ){.   
a500: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
a510: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
a520: 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46  EDLOCK;.      pF
a530: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
a540: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c   errno;.    } el
a550: 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
a560: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
a570: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
a580: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  1;.    }.  }.#en
a590: 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61  dif.  .  unixLea
a5a0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
a5b0: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
a5c0: 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e  OCK %d %d %d (un
a5d0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
a5e0: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
a5f0: 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
a600: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
a610: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a620: 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61  Attempt to set a
a630: 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20   system-lock on 
a640: 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20  the file pFile. 
a650: 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   The lock is .**
a660: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c   described by pL
a670: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
a680: 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e  e pFile was open
a690: 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72  ed read/write fr
a6a0: 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68  om unix-excl, th
a6b0: 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b  en the only lock
a6c0: 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65  .** ever obtaine
a6d0: 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76  d is an exclusiv
a6e0: 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69  e lock, and it i
a6f0: 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74  s obtained exact
a700: 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66  ly once.** the f
a710: 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f  irst time any lo
a720: 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e  ck is attempted.
a730: 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74    All subsequent
a740: 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a   system locking.
a750: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65  ** operations be
a760: 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f  come no-ops.  Lo
a770: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
a780: 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e   still happen in
a790: 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20  ternally,.** in 
a7a0: 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e  order to coordin
a7b0: 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65  ate access betwe
a7c0: 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61  en separate data
a7d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
a7e0: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
a7f0: 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c  process, but all
a800: 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64   of that is hand
a810: 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e  led in memory an
a820: 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  d the.** operati
a830: 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  ng system does n
a840: 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a  ot participate..
a850: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
a860: 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68  ion is a pass-th
a870: 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46  rough to fcntl(F
a880: 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65  _SETLK) if pFile
a890: 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79   is using.** any
a8a0: 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20   VFS other than 
a8b0: 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69  "unix-excl" or i
a8c0: 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65  f pFile is opene
a8d0: 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  d on "unix-excl"
a8e0: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d  .** and is read-
a8f0: 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f  only..**.** Zero
a900: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
a910: 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74  the call complet
a920: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  es successfully,
a930: 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c   or -1 if a call
a940: 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66  .** to fcntl() f
a950: 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ails. In this ca
a960: 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74  se, errno is set
a970: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28   appropriately (
a980: 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a  by fcntl())..*/.
a990: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
a9a0: 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  ileLock(unixFile
a9b0: 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20   *pFile, struct 
a9c0: 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20  flock *pLock){. 
a9d0: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49   int rc;.  unixI
a9e0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a9f0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
aa00: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
aa10: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
aa20: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21   assert( pInode!
aa30: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46  =0 );.  if( ((pF
aa40: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
aa50: 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21   UNIXFILE_EXCL)!
aa60: 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50  =0 || pInode->bP
aa70: 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26  rocessLock).   &
aa80: 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  & ((pFile->ctrlF
aa90: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
aaa0: 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b  RDONLY)==0).  ){
aab0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
aac0: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
aad0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
aae0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
aaf0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
ab00: 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  e->nLock==0 );. 
ab10: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
ab20: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
ab30: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
ab40: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
ab50: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
ab60: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
ab70: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  ;.      lock.l_t
ab80: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
ab90: 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74       rc = osFcnt
aba0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
abb0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
abc0: 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65     if( rc<0 ) re
abd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
abe0: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
abf0: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ock = 1;.      p
ac00: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
ac10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ac20: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
ac30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
ac40: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
ac50: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63  h, F_SETLK, pLoc
ac60: 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
ac70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
ac80: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
ac90: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
aca0: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
acb0: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
acc0: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
acd0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
ace0: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
acf0: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
ad00: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
ad10: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
ad20: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
ad30: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
ad40: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
ad50: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
ad60: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
ad70: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
ad80: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
ad90: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
ada0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
adb0: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
adc0: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
add0: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
ade0: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
adf0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
ae00: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
ae10: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
ae20: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
ae30: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
ae40: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
ae50: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
ae60: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
ae70: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
ae80: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
ae90: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
aea0: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
aeb0: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
aec0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
aed0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
aee0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
aef0: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
af00: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
af10: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
af20: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
af30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
af40: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
af50: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
af60: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
af70: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
af80: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
af90: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
afa0: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
afb0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
afc0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
afd0: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
afe0: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
aff0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
b000: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
b010: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
b020: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
b030: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
b040: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
b050: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
b060: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
b070: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
b080: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
b090: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
b0a0: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
b0b0: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
b0c0: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
b0d0: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
b0e0: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
b0f0: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
b100: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
b110: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
b120: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
b130: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
b140: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
b150: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
b160: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
b170: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
b180: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
b190: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
b1a0: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
b1b0: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
b1c0: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
b1d0: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
b1e0: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
b1f0: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
b200: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
b210: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
b220: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
b230: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
b240: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
b250: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
b260: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
b270: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
b280: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
b290: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
b2a0: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
b2b0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
b2c0: 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64  ccessful, a rand
b2d0: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65  om byte from the
b2e0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
b2f0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  ** range' is rea
b300: 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  d-locked and the
b310: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
b320: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
b330: 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ased..  **.  ** 
b340: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
b350: 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  ly obtain a RESE
b360: 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20  RVED lock after 
b370: 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20  it has a SHARED 
b380: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53  lock..  ** A RES
b390: 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d  ERVED lock is im
b3a0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61  plemented by gra
b3b0: 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  bbing a write-lo
b3c0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27  ck on the.  ** '
b3d0: 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20  reserved byte'. 
b3e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
b3f0: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
b400: 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c  tain a PENDING l
b410: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
b420: 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a   obtained a.  **
b430: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20   SHARED lock. A 
b440: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
b450: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
b460: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
b470: 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68  -lock.  ** on th
b480: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
b490: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
b4a0: 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45  hat no new SHARE
b4b0: 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20  D locks can be. 
b4c0: 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75   ** obtained, bu
b4d0: 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45  t existing SHARE
b4e0: 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f  D locks are allo
b4f0: 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20  wed to persist. 
b500: 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64  A process.  ** d
b510: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
b520: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
b530: 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61  D lock on the wa
b540: 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c  y to a PENDING l
b550: 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ock..  ** This p
b560: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
b570: 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d  by the algorithm
b580: 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63   for rolling bac
b590: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
b5a0: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72  .  ** after a cr
b5b0: 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ash..  **.  ** A
b5c0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
b5d0: 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72  , obtained after
b5e0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
b5f0: 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a  is held, is.  **
b600: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
b610: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
b620: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e  e-lock on the en
b630: 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74  tire 'shared byt
b640: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53  e.  ** range'. S
b650: 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c  ince all other l
b660: 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72  ocks require a r
b670: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  ead-lock on one 
b680: 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a  of the bytes.  *
b690: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61  * within this ra
b6a0: 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  nge, this ensure
b6b0: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
b6c0: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
b6d0: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
b6e0: 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ase. .  **.  ** 
b6f0: 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e  The reason a sin
b700: 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20  gle byte cannot 
b710: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
b720: 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62  of the 'shared b
b730: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
b740: 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  is that some ver
b750: 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73  sions of windows
b760: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
b770: 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20  read-locks. By. 
b780: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61   ** locking a ra
b790: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61  ndom byte from a
b7a0: 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65   range, concurre
b7b0: 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  nt SHARED locks 
b7c0: 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65  may exist.  ** e
b7d0: 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69  ven if the locki
b7e0: 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65  ng primitive use
b7f0: 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72  d is always a wr
b800: 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ite-lock..  */. 
b810: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b820: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
b830: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
b840: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
b850: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
b860: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
b870: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
b880: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72  lock;.  int tErr
b890: 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
b8a0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
b8b0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
b8c0: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
b8d0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
b8e0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
b8f0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
b900: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
b910: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
b920: 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
b930: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f   azFileLock(pIno
b940: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
b950: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
b960: 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
b970: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
b980: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
b990: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
b9a0: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
b9b0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
b9c0: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
b9d0: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
b9e0: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
b9f0: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
ba00: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
ba10: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
ba20: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
ba30: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ba40: 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
ba50: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
ba60: 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
ba70: 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 75  already held) (u
ba80: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
ba90: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  h,.            a
baa0: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
bab0: 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
bac0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
bad0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
bae0: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
baf0: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
bb00: 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20  t..  **  (1) We 
bb10: 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20  never move from 
bb20: 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74  unlocked to anyt
bb30: 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e  hing higher than
bb40: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20   shared lock..  
bb50: 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e  **  (2) SQLite n
bb60: 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  ever explicitly 
bb70: 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69  requests a pendi
bb80: 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33  g lock..  **  (3
bb90: 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ) A shared lock 
bba0: 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77  is always held w
bbb0: 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f  hen a reserve lo
bbc0: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  ck is requested.
bbd0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
bbe0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
bbf0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  !=NO_LOCK || eFi
bc00: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
bc10: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
bc20: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44   eFileLock!=PEND
bc30: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
bc40: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
bc50: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
bc60: 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  | pFile->eFileLo
bc70: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
bc80: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  );..  /* This mu
bc90: 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
bca0: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
bcb0: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
bcc0: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
bcd0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
bce0: 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
bcf0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
bd00: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
bd10: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
bd20: 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
bd30: 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
bd40: 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
bd50: 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
bd60: 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
bd70: 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
bd80: 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
bd90: 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
bda0: 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  k!=pInode->eFile
bdb0: 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20  Lock && .       
bdc0: 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
bdd0: 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
bde0: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
bdf0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
be00: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
be10: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
be20: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
be30: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
be40: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
be50: 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
be60: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
be70: 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
be80: 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
be90: 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
bea0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
beb0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
bec0: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
bed0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
bee0: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
bef0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
bf00: 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d   .      (pInode-
bf10: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
bf20: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
bf30: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
bf40: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
bf50: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
bf60: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
bf70: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
bf80: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
bf90: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
bfa0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
bfb0: 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
bfc0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
bfd0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
bfe0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
bff0: 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
c000: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
c010: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
c020: 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ...  /* A PENDIN
c030: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
c040: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
c050: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
c060: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
c070: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
c080: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
c090: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
c0a0: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
c0b0: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
c0c0: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  ased..  */.  loc
c0d0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
c0e0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
c0f0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20  SEEK_SET;.  if( 
c100: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c110: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
c120: 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
c130: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
c140: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
c150: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
c160: 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  ){.    lock.l_ty
c170: 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  pe = (eFileLock=
c180: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52  =SHARED_LOCK?F_R
c190: 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20  DLCK:F_WRLCK);. 
c1a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c1b0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
c1c0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
c1d0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
c1e0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
c1f0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c200: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
c210: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
c220: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
c230: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
c240: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c250: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
c260: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
c270: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
c280: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
c290: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
c2a0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
c2b0: 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
c2c0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
c2d0: 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
c2e0: 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
c2f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
c300: 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
c310: 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
c320: 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
c330: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
c340: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c350: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
c360: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
c370: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
c380: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
c390: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
c3a0: 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  OK );..    /* No
c3b0: 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
c3c0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
c3d0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
c3e0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
c3f0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
c400: 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e  SIZE;.    if( un
c410: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
c420: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
c430: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
c440: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c450: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
c460: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
c470: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
c480: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c490: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
c4a0: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
c4b0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
c4c0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
c4d0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
c4e0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
c4f0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
c500: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  LCK;.    if( uni
c510: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
c520: 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53   &lock) && rc==S
c530: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c540: 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20    /* This could 
c550: 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65  happen with a ne
c560: 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20  twork mount */. 
c570: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
c580: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
c590: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
c5a0: 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK; .    }..   
c5b0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c5c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c5d0: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
c5e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c5f0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
c600: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
c610: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  d_lock;.    }els
c620: 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
c630: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
c640: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
c650: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
c660: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
c670: 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
c680: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
c690: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
c6a0: 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
c6b0: 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
c6c0: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
c6d0: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
c6e0: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
c6f0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
c700: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
c710: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
c720: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
c730: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
c740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
c750: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
c760: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
c770: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
c780: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
c790: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
c7a0: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
c7b0: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
c7c0: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
c7d0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
c7e0: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
c7f0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
c800: 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
c810: 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ock );.    lock.
c820: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
c830: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
c840: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
c850: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  ED_LOCK || eFile
c860: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
c870: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  LOCK );.    if( 
c880: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
c890: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
c8a0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c8b0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
c8c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c8d0: 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65   = 1L;.    }else
c8e0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
c8f0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
c900: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
c910: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
c920: 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IZE;.    }..    
c930: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
c940: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
c950: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
c960: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
c970: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
c980: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
c990: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
c9a0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
c9b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
c9c0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  SY ){.        pF
c9d0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c9e0: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
c9f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23  .    }.  }.  ..#
ca00: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
ca10: 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72  /* Set up the tr
ca20: 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65  ansaction-counte
ca30: 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e  r change checkin
ca40: 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a  g flags when.  *
ca50: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  * transitioning 
ca60: 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f  from a SHARED to
ca70: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
ca80: 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20  .  The change.  
ca90: 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ** from SHARED t
caa0: 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73  o RESERVED marks
cab0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
cac0: 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  f a normal.  ** 
cad0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
cae0: 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e  (not a hot journ
caf0: 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20  al rollback)..  
cb00: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
cb10: 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69  ITE_OK.   && pFi
cb20: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  le->eFileLock<=S
cb30: 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26  HARED_LOCK.   &&
cb40: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
cb50: 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20  RVED_LOCK.  ){. 
cb60: 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
cb70: 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ntrChng = 0;.   
cb80: 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
cb90: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
cba0: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
cbb0: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   1;.  }.#endif..
cbc0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
cbd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
cbe0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
cbf0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
cc00: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
cc10: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
cc20: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
cc30: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
cc40: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
cc50: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
cc60: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
cc70: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
cc80: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
cc90: 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a  .  }..end_lock:.
cca0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
ccb0: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
ccc0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
ccd0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
cce0: 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
ccf0: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
cd00: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
cd10: 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
cd20: 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
cd30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
cd40: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
cd50: 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c  ptor used by fil
cd60: 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74  e handle pFile t
cd70: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
cd80: 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c  ing.** pUnused l
cd90: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
cda0: 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64  oid setPendingFd
cdb0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
cdc0: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
cdd0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
cde0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
cdf0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20  ixUnusedFd *p = 
ce00: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  pFile->pUnused;.
ce10: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
ce20: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ode->pUnused;.  
ce30: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
ce40: 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  = p;.  pFile->h 
ce50: 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  = -1;.  pFile->p
ce60: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
ce70: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
ce80: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
ce90: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
cea0: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
ceb0: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
cec0: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
ced0: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
cee0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
cef0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
cf00: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
cf10: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
cf20: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
cf30: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
cf40: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
cf50: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
cf60: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a  s a no-op..** .*
cf70: 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e  * If handleNFSUn
cf80: 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68  lock is true, th
cf90: 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e  en on downgradin
cfa0: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c  g an EXCLUSIVE_L
cfb0: 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a  OCK to SHARED.**
cfc0: 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20   the byte range 
cfd0: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
cfe0: 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20  2 parts and the 
cff0: 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e  first part is un
d000: 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73  locked then.** s
d010: 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63  et to a read loc
d020: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65  k, then the othe
d030: 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79  r part is simply
d040: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73   unlocked.  This
d050: 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e   works .** aroun
d060: 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e  d a bug in BSD N
d070: 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73  FS lockd (also s
d080: 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30  een on MacOSX 10
d090: 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20  .3+) that fails 
d0a0: 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  to .** remove th
d0b0: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
d0c0: 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20  a region when a 
d0d0: 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
d0e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d0f0: 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  posixUnlock(sqli
d100: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
d110: 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74  t eFileLock, int
d120: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
d130: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
d140: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
d150: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
d160: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
d170: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
d180: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
d190: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
d1a0: 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  h;..  assert( pF
d1b0: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
d1c0: 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
d1d0: 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
d1e0: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
d1f0: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
d200: 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c  Lock,.      pFil
d210: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
d220: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
d230: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
d240: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
d250: 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29        getpid()))
d260: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  ;..  assert( eFi
d270: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
d280: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
d290: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65  le->eFileLock<=e
d2a0: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
d2b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d2c0: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
d2d0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20  rMutex();.  h = 
d2e0: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f  pFile->h;.  pIno
d2f0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
d300: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
d310: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
d320: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
d330: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
d340: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
d350: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
d360: 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
d370: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
d380: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
d390: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
d3a0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
d3b0: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
d3c0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
d3d0: 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20  gn(0);..#ifndef 
d3e0: 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  NDEBUG.    /* Wh
d3f0: 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
d400: 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
d410: 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
d420: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
d430: 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
d440: 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
d450: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
d460: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
d470: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
d480: 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
d490: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
d4a0: 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
d4b0: 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
d4c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
d4d0: 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
d4e0: 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
d4f0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
d500: 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
d510: 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
d520: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
d530: 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
d540: 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
d550: 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
d560: 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
d570: 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
d580: 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
d590: 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
d5a0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
d5b0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30  on..    */.#if 0
d5c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
d5d0: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
d5e0: 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  e==0.         ||
d5f0: 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
d600: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
d610: 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
d620: 43 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69  Chng==1 );.#endi
d630: 66 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  f.    pFile->inN
d640: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
d650: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64  #endif..    /* d
d660: 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20  owngrading to a 
d670: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e  shared lock on N
d680: 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61  FS involves clea
d690: 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c  ring the write l
d6a0: 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  ock.    ** befor
d6b0: 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74  e establishing t
d6c0: 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f  he readlock - to
d6d0: 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f   avoid a race co
d6e0: 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67  ndition we downg
d6f0: 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  rade.    ** the 
d700: 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73  lock in 2 blocks
d710: 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f  , so that part o
d720: 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c  f the range will
d730: 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61   be covered by a
d740: 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c   .    ** write l
d750: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ock until the re
d760: 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79  st is covered by
d770: 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20   a read lock:.  
d780: 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57    **  1:   [WWWW
d790: 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20  W].    **  2:   
d7a0: 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20  [....W].    **  
d7b0: 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20  3:   [RRRRW].   
d7c0: 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e   **  4:   [RRRR.
d7d0: 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ].    */.    if(
d7e0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
d7f0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20  ED_LOCK ){..#if 
d800: 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45  !defined(__APPLE
d810: 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45  __) || !SQLITE_E
d820: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
d830: 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29  YLE.      (void)
d840: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b  handleNFSUnlock;
d850: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
d860: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d  andleNFSUnlock==
d870: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  0 );.#endif.#if 
d880: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
d890: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
d8a0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
d8b0: 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64  E.      if( hand
d8c0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20  leNFSUnlock ){. 
d8d0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
d8e0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
d8f0: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
d900: 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rom system call 
d910: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
d920: 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
d930: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
d940: 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
d950: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d960: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
d970: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
d980: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
d990: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d9a0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
d9b0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
d9c0: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
d9d0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
d9e0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
d9f0: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
da00: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
da10: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
da20: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
da30: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
da40: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
da50: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
da60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
da70: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
da80: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
da90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
daa0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
dab0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dac0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
dad0: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
dae0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
daf0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
db00: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
db10: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
db20: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
db30: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
db40: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
db50: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
db60: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
db70: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
db80: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
db90: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
dba0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
dbb0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
dbc0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20  OERR_RDLOCK);.  
dbd0: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
dbe0: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
dbf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
dc00: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dc10: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
dc20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
dc30: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
dc40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc50: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
dc60: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
dc70: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
dc80: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
dc90: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
dca0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69   SHARED_FIRST+di
dcb0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c  vSize;.        l
dcc0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
dcd0: 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b  ED_SIZE-divSize;
dce0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
dcf0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
dd00: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
dd10: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
dd20: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
dd30: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
dd40: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
dd50: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
dd60: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
dd70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  {.            pF
dd80: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
dd90: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
dda0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
ddb0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
ddc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ddd0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
dde0: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
ddf0: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
de00: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
de10: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  E */.      {.   
de20: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
de30: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
de40: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
de50: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
de60: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
de70: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
de80: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
de90: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
dea0: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IZE;.        if(
deb0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
dec0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
ded0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74           /* In t
dee0: 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20  heory, the call 
def0: 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  to unixFileLock(
df00: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65  ) cannot fail be
df10: 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20  cause another.  
df20: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
df30: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  ss is holding an
df40: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f   incompatible lo
df50: 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ck. If it does, 
df60: 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
df70: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ** indicates tha
df80: 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63  t the other proc
df90: 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
dfa0: 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67  wing the locking
dfb0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
dfc0: 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20  otocol. If this 
dfd0: 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20  happens, return 
dfe0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
dff0: 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20  OCK. Returning. 
e000: 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
e010: 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f  TE_BUSY would co
e020: 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72 20  nfuse the upper 
e030: 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74 69  layer (in practi
e040: 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20 20  ce it causes .  
e050: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73          ** an as
e060: 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a  sert to fail). *
e070: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  / .          rc 
e080: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
e090: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  DLOCK;.         
e0a0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e0b0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e0c0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
e0d0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
e0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e0f0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e100: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
e110: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
e120: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
e130: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
e140: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
e150: 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
e160: 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
e170: 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
e180: 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
e190: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e1a0: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
e1b0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
e1c0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
e1d0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
e1e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e1f0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e200: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
e210: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
e220: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
e230: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  _unlock;.    }. 
e240: 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f   }.  if( eFileLo
e250: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck==NO_LOCK ){. 
e260: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
e270: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
e280: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
e290: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
e2a0: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
e2b0: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
e2c0: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
e2d0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
e2e0: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
e2f0: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
e300: 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
e310: 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
e320: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
e330: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ed==0 ){.      l
e340: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e350: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
e360: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
e370: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
e380: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
e390: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
e3a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
e3b0: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
e3c0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
e3d0: 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
e3e0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
e3f0: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
e400: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e410: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e420: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
e430: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e440: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
e450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e460: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e470: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 09 70 46 69 6c  RR_UNLOCK;..pFil
e480: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
e490: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 49  rrno;.        pI
e4a0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
e4b0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
e4c0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
e4d0: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
e4e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e4f0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
e500: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
e510: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
e520: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
e530: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
e540: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
e550: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
e560: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
e570: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
e580: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
e590: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
e5a0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
e5b0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
e5c0: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
e5d0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
e5e0: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
e5f0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
e600: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
e610: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
e620: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a  e);.    }.  }...
e630: 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e  end_unlock:.  un
e640: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
e650: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e660: 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
e670: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
e680: 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
e690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
e6a0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e6b0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
e6c0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
e6d0: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
e6e0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
e6f0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
e700: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
e710: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
e720: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
e730: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e740: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
e750: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
e760: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
e770: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
e780: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
e790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
e7a0: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
e7b0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
e7c0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  FileLock){.  ret
e7d0: 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
e7e0: 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
e7f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e800: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
e810: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
e820: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
e830: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
e840: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
e850: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
e860: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
e870: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
e880: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
e890: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
e8a0: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
e8b0: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
e8c0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
e8d0: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
e8e0: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
e8f0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
e900: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
e910: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
e920: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
e930: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
e940: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
e950: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
e960: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
e970: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
e980: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
e990: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
e9a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
e9b0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
e9c0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
e9d0: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
e9e0: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ->dirfd>=0 ){.  
e9f0: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
ea00: 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72  File, pFile->dir
ea10: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
ea20: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d     pFile->dirfd=
ea30: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  -1;.  }.  if( pF
ea40: 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ile->h>=0 ){.   
ea50: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
ea60: 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f  ile, pFile->h, _
ea70: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46  _LINE__);.    pF
ea80: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d  ile->h = -1;.  }
ea90: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
eaa0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64    if( pFile->pId
eab0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
eac0: 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20  e->isDelete ){. 
ead0: 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c       unlink(pFil
eae0: 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
eaf0: 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  alName);.    }. 
eb00: 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73     vxworksReleas
eb10: 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70  eFileId(pFile->p
eb20: 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  Id);.    pFile->
eb30: 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  pId = 0;.  }.#en
eb40: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
eb50: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
eb60: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
eb70: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
eb80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
eb90: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
eba0: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
ebb0: 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
ebc0: 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
ebd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ebe0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
ebf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
ec00: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
ec10: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
ec20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ec30: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
ec40: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
ec50: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f  *)id;.  unixUnlo
ec60: 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
ec70: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
ec80: 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46  x();..  /* unixF
ec90: 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c  ile.pInode is al
eca0: 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e  ways valid here.
ecb0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69   Otherwise, a di
ecc0: 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20  fferent close.  
ecd0: 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e  ** routine (e.g.
ece0: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20   nolockClose()) 
ecf0: 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  would be called 
ed00: 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  instead..  */.  
ed10: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
ed20: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
ed30: 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
ed40: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
ed50: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
ed60: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20  (pFile->pInode) 
ed70: 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
ed80: 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
ed90: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
eda0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
edb0: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
edc0: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
edd0: 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
ede0: 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
edf0: 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
ee00: 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
ee10: 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
ee20: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
ee30: 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
ee40: 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
ee50: 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
ee60: 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a  ly closed .    *
ee70: 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
ee80: 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
ee90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50  .    */.    setP
eea0: 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
eeb0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e  .  }.  releaseIn
eec0: 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
eed0: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
eee0: 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
eef0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
ef00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
ef20: 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
ef30: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
ef40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
efb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
f020: 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
f030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f050: 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
f060: 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
f070: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
f080: 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
f090: 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
f0a0: 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
f0b0: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
f0c0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
f0d0: 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
f0e0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
f0f0: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
f100: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
f110: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
f120: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
f130: 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
f140: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
f150: 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
f160: 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
f170: 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
f180: 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
f190: 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
f1a0: 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
f1b0: 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
f1c0: 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
f1d0: 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
f1e0: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
f1f0: 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
f200: 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
f210: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
f220: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
f230: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
f240: 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
f250: 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
f260: 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
f270: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
f280: 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
f290: 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
f2a0: 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
f2b0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
f2c0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
f2d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
f2e0: 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
f2f0: 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
f300: 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
f310: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
f320: 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
f330: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
f340: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
f350: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
f360: 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
f370: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
f380: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
f390: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
f3a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f3b0: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
f3c0: 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
f3d0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
f3e0: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
f3f0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
f400: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
f410: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
f420: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f430: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f440: 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
f450: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
f460: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
f470: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
f480: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
f490: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
f4a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f4b0: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
f4c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f4d0: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
f4e0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
f4f0: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
f500: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
f510: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
f520: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
f530: 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
f540: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
f550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
f5b0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
f5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f600: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
f610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
f620: 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
f630: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
f640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f650: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
f660: 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
f670: 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
f680: 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
f690: 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
f6a0: 20 66 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20   files in order 
f6b0: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
f6c0: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
f6d0: 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f  e.  This works o
f6e0: 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20  n just.** about 
f6f0: 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d  every filesystem
f700: 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75   imaginable.  Bu
f710: 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69  t there are seri
f720: 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a  ous downsides:.*
f730: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
f740: 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75  re is zero concu
f750: 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c  rrency.  A singl
f760: 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20  e reader blocks 
f770: 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20  all other.**    
f780: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
f790: 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72   from reading or
f7a0: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
f7b0: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
f7c0: 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74  (2)  An applicat
f7d0: 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77  ion crash or pow
f7e0: 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76  er loss can leav
f7f0: 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c  e stale lock fil
f800: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69  es.**         si
f810: 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61  tting around tha
f820: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
f830: 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a  ared manually..*
f840: 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73  *.** Nevertheles
f850: 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20  s, a dotlock is 
f860: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c  an appropriate l
f870: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20  ocking mode for 
f880: 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68  use if no.** oth
f890: 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  er locking strat
f8a0: 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  egy is available
f8b0: 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20  ..**.** Dotfile 
f8c0: 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79  locking works by
f8d0: 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65   creating a file
f8e0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
f8f0: 65 63 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a  ectory as the.**
f900: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69   database and wi
f910: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
f920: 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f   but with a ".lo
f930: 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64  ck" extension ad
f940: 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73  ded..** The exis
f950: 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20  tance of a lock 
f960: 66 69 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20  file implies an 
f970: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
f980: 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a   All other lock.
f990: 2a 2a 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ** types (SHARED
f9a0: 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
f9b0: 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
f9c0: 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
f9d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
f9e0: 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
f9f0: 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
fa00: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
fa10: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
fa20: 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  .** lock file..*
fa30: 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
fa40: 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
fa50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
fa60: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
fa70: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
fa80: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
fa90: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
faa0: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
fab0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
fac0: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
fad0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
fae0: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
faf0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
fb00: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
fb10: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
fb20: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
fb30: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
fb40: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
fb50: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
fb60: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
fb70: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
fb80: 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
fb90: 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
fba0: 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
fbb0: 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
fbc0: 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
fbd0: 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
fbe0: 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
fbf0: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
fc00: 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
fc10: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
fc20: 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
fc30: 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
fc40: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
fc50: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
fc60: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
fc70: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
fc80: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
fc90: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
fca0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
fcb0: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
fcc0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
fcd0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
fce0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
fcf0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
fd00: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
fd10: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
fd20: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
fd30: 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
fd40: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
fd50: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
fd60: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
fd70: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
fd80: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
fd90: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  LOCK ){.    /* E
fda0: 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65  ither this conne
fdb0: 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74  ction or some ot
fdc0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
fdd0: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
fde0: 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  ss.    ** holds 
fdf0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
fe00: 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  le.  No need to 
fe10: 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a  check further. *
fe20: 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  /.    reserved =
fe30: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
fe40: 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20   /* The lock is 
fe50: 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79  held if and only
fe60: 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65   if the lockfile
fe70: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63   exists */.    c
fe80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  onst char *zLock
fe90: 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
fea0: 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
feb0: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72  ngContext;.    r
fec0: 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65  eserved = osAcce
fed0: 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29  ss(zLockFile, 0)
fee0: 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ==0;.  }.  OSTRA
fef0: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
ff00: 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
ff10: 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
ff20: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
ff30: 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
ff40: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
ff50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ff60: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
ff70: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
ff80: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
ff90: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
ffa0: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
ffb0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
ffc0: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
ffd0: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
ffe0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
fff0: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
10000 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
10010 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
10020 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
10030 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
10040 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
10050 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
10060 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
10070 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
10080 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
10090 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
100a0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
100b0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
100c0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
100d0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
100e0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
100f0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
10100 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
10110 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
10120 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
10130 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
10140 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
10150 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
10160 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
10170 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
10180 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
10190 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
101a0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
101b0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
101c0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
101d0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
101e0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
101f0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
10200 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
10210 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10220 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
10230 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
10240 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
10250 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
10260 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
10270 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
10280 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
10290 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
102a0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
102b0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
102c0 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
102d0 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
102e0 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
102f0 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
10300 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
10310 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10320 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
10330 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
10340 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10350 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66  ile*)id;.  int f
10360 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
10370 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
10380 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10390 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  text;.  int rc =
103a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20   SQLITE_OK;...  
103b0 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e  /* If we have an
103c0 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  y lock, then the
103d0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61   lock file alrea
103e0 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20  dy exists.  All 
103f0 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
10400 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72  do is adjust our
10410 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
10420 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76   of the lock lev
10430 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  el..  */.  if( p
10440 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10450 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  > NO_LOCK ){.   
10460 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10470 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
10480 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64     /* Always upd
10490 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ate the timestam
104a0 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c  p on the old fil
104b0 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45  e */.#ifdef HAVE
104c0 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65  _UTIME.    utime
104d0 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c  (zLockFile, NULL
104e0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69  );.#else.    uti
104f0 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  mes(zLockFile, N
10500 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
10510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10520 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
10530 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
10540 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20   lock */.  fd = 
10550 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4c 6f 63  robust_open(zLoc
10560 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f  kFile,O_RDONLY|O
10570 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36  _CREAT|O_EXCL,06
10580 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  00);.  if( fd<0 
10590 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
105a0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
105b0 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e  the file, someon
105c0 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20  e else may have 
105d0 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20  stolen the lock 
105e0 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  */.    int tErrn
105f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
10600 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72  f( EEXIST == tEr
10610 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
10620 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
10630 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
10640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
10650 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
10660 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10670 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
10680 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
10690 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
106a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
106b0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
106c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
106d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
106e0 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
106f0 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e  pFile, fd, __LIN
10700 45 5f 5f 29 3b 0a 20 20 0a 20 20 2f 2a 20 67 6f  E__);.  .  /* go
10710 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
10720 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
10730 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
10740 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
10750 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
10760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
10770 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
10780 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
10790 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
107a0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
107b0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
107c0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
107d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
107e0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
107f0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
10800 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10810 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
10820 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
10830 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
10840 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
10850 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
10860 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c  **.** When the l
10870 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61  ocking level rea
10880 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65  ches NO_LOCK, de
10890 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
108a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
108b0 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  t dotlockUnlock(
108c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
108d0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
108e0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
108f0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10900 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
10910 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
10920 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
10930 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65  Context;..  asse
10940 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
10950 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
10960 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
10970 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
10980 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
10990 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c  leLock,..   pFil
109a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
109b0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
109c0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
109d0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
109e0 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
109f0 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
10a00 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10a10 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
10a20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10a30 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
10a40 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  To downgrade to 
10a50 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75  shared, simply u
10a60 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
10a70 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65  al notion of the
10a80 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  .  ** lock state
10a90 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65  .  No need to me
10aa0 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ss with the file
10ab0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
10ac0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
10ad0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
10ae0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10af0 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
10b00 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
10b10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10b20 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e    /* To fully un
10b30 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
10b40 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  e, delete the lo
10b50 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73  ck file */.  ass
10b60 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
10b70 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  NO_LOCK );.  if(
10b80 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c   unlink(zLockFil
10b90 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  e) ){.    int rc
10ba0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45   = 0;.    int tE
10bb0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
10bc0 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
10bd0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
10be0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
10bf0 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  R_UNLOCK;.    }.
10c00 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
10c10 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
10c20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10c30 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10c40 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
10c50 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
10c60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
10c70 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
10c80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10c90 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
10ca0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
10cb0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65  lock has been re
10cc0 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c  leased before cl
10cd0 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  osing..*/.static
10ce0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73   int dotlockClos
10cf0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10d00 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  id) {.  int rc;.
10d10 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
10d20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10d30 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10d40 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  .    dotlockUnlo
10d50 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
10d60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10d70 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
10d80 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20  Context);.  }.  
10d90 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
10da0 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e  le(id);.  return
10db0 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   rc;.}./********
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
10dd0 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
10de0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
10df0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
10e00 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e50 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ea0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ec0 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
10ed0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
10ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ef0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
10f00 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
10f10 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
10f20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
10f30 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
10f40 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
10f50 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
10f60 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
10f70 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
10f80 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
10f90 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
10fa0 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
10fb0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
10fc0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
10fd0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
10fe0 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
10ff0 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
11000 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
11010 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
11020 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
11030 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
11040 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
11050 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
11060 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
11070 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
11080 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
11090 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
110a0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
110b0 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
110c0 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
110d0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
110e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
110f0 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
11100 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c   or if.** compil
11110 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e  ing for VXWORKS.
11120 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
11130 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11140 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
11150 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  KS../*.** Retry 
11160 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
11170 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
11180 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
11190 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
111a0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
111b0 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
111c0 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
111d0 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
111e0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
111f0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
11200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
11210 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
11220 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
11230 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
11240 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
11250 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
11260 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
11270 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
11280 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
11290 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
112a0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
112b0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
112c0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
112d0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
112e0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
112f0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
11300 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
11310 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
11320 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
11330 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
11340 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
11350 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
11360 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
11370 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
11380 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
11390 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
113a0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
113b0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
113c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
113d0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
113e0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
113f0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11400 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
11410 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
11420 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
11430 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
11440 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
11450 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
11460 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
11470 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
11480 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
11490 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
114a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
114b0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
114c0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
114d0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
114e0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
114f0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
11500 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
11510 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
11520 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
11530 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
11540 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
11550 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
11560 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
11570 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
11580 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
11590 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
115a0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
115b0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
115c0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
115d0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
115e0 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
115f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
11600 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11610 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
11620 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
11630 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
11640 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
11650 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
11660 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
11670 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
11680 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
11690 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
116a0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
116b0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
116c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
116d0 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
116e0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
116f0 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
11700 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
11710 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
11720 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
11730 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
11740 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
11750 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
11760 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
11770 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
11780 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
11790 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
117a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
117b0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
117c0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
117d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
117e0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
117f0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11800 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
11810 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
11820 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
11830 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
11840 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
11850 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
11860 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
11870 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
11880 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11890 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
118a0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
118b0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
118c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
118d0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
118e0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
118f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
11900 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
11910 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
11920 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
11930 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
11940 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
11950 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
11960 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
11970 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
11980 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
11990 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
119a0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
119b0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
119c0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
119d0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
119e0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
119f0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
11a00 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
11a10 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
11a20 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
11a30 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
11a40 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
11a50 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
11a60 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
11a70 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
11a80 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
11a90 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
11aa0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
11ab0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
11ac0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
11ad0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
11ae0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
11af0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
11b00 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
11b10 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
11b20 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
11b30 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
11b40 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
11b50 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11b60 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
11b70 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
11b80 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
11b90 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
11ba0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
11bb0 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
11bc0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
11bd0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
11be0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
11bf0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
11c00 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
11c10 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
11c20 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
11c30 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
11c40 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
11c50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
11c60 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
11c70 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
11c80 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
11c90 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
11ca0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
11cb0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
11cc0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
11cd0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
11ce0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
11cf0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
11d00 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
11d10 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
11d20 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11d30 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
11d40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11d50 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
11d60 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11d70 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
11d80 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
11d90 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
11da0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
11db0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
11dc0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
11dd0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
11de0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
11df0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
11e00 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
11e10 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
11e20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
11e30 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
11e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11e50 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
11e60 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
11e70 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
11e80 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
11e90 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
11ea0 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
11eb0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
11ec0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
11ed0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
11ee0 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
11ef0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
11f00 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11f10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
11f20 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
11f30 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11f40 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11f50 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11f60 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
11f70 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
11f80 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
11f90 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
11fa0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
11fb0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
11fc0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
11fd0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
11fe0 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
11ff0 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
12000 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
12010 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
12020 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
12030 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
12040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
12050 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12060 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
12070 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
12080 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
12090 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
120a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
120b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
120c0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
120d0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
120e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
120f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
12100 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
12110 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
12120 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
12130 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
12140 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
12150 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
12160 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12170 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12180 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12190 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
121a0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
121b0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
121c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
121d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
121e0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
121f0 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
12200 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12210 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
12220 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
12230 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12240 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
12250 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12260 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
12270 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
12280 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
12290 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
122a0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
122b0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
122c0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
122d0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
122e0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
122f0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
12300 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
12310 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
12320 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
12330 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
12340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12350 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
12360 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
12370 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
12380 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
12390 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
123a0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
123b0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
123c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
123d0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
123e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
123f0 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
12400 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
12410 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
12420 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
12430 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
12440 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
12450 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
12460 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12470 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
12480 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
12490 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
124a0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
124b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
124c0 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
124d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
124e0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
124f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12500 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
12510 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
12520 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12530 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
12540 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
12550 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b   id ){.    flock
12560 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
12570 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  CK);.  }.  retur
12580 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
12590 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  id);.}..#endif /
125a0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
125b0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
125c0 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a   !OS_VXWORK */..
125d0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
125e0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
125f0 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65  flock lock imple
12600 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
12610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
12670 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
126e0 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20  Named Semaphore 
126f0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
12700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12710 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  .**.** Named sem
12720 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
12730 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
12740 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
12750 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
12760 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
12770 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20  -lock and flock 
12780 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c  in that it reall
12790 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72  y only.** suppor
127a0 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ts EXCLUSIVE loc
127b0 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69  king.  Only a si
127c0 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
127d0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a   read or write.*
127e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
127f0 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ile at a time.  
12800 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74  This reduces pot
12810 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e  ential concurren
12820 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73  cy, but.** makes
12830 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   the lock implem
12840 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61  entation much ea
12850 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f  sier..*/.#if OS_
12860 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54  VXWORKS../*.** T
12870 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
12880 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
12890 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
128a0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
128b0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
128c0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
128d0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
128e0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
128f0 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
12900 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
12910 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
12920 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
12930 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
12940 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
12950 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
12960 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
12970 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12980 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
12990 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
129a0 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76  t semCheckReserv
129b0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
129c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
129d0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
129e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
129f0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
12a00 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
12a10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12a20 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
12a30 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
12a40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
12a50 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
12a60 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
12a70 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
12a80 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
12a90 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
12aa0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
12ab0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
12ac0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
12ad0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12ae0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
12af0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
12b00 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
12b10 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
12b20 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
12b30 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
12b40 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
12b50 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
12b60 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74  pSem;.    struct
12b70 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a   stat statBuf;..
12b80 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77      if( sem_tryw
12b90 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
12ba0 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
12bb0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12bc0 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74   if( EAGAIN != t
12bd0 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
12be0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12bf0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12c00 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12c10 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
12c20 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
12c30 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12c40 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
12c50 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
12c60 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
12c70 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
12c80 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e  when we are in N
12c90 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20  O_LOCK */.      
12ca0 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46    reserved = (pF
12cb0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
12cc0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
12cd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12ce0 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f  {.      /* we co
12cf0 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77  uld have it if w
12d00 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20  e want it */.   
12d10 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d     sem_post(pSem
12d20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
12d30 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
12d40 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
12d50 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
12d60 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
12d70 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
12d80 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
12d90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12da0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
12db0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
12dc0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
12dd0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
12de0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
12df0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
12e00 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
12e10 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
12e20 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
12e30 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
12e40 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
12e50 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
12e60 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
12e70 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
12e80 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
12e90 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
12ea0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
12eb0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
12ec0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
12ed0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
12ee0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
12ef0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
12f00 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
12f10 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
12f20 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
12f30 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
12f40 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
12f50 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
12f60 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
12f70 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
12f80 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
12f90 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
12fa0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
12fb0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
12fc0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
12fd0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
12fe0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
12ff0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
13000 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
13010 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
13020 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
13030 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
13040 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
13050 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
13060 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  cks only really 
13070 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
13080 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
13090 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
130a0 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
130b0 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
130c0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
130d0 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
130e0 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
130f0 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
13100 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
13110 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
13120 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
13130 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
13140 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
13150 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
13160 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
13170 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
13180 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
13190 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
131a0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
131b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
131c0 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  emLock(sqlite3_f
131d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
131e0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
131f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13200 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
13210 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  nt fd;.  sem_t *
13220 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
13230 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e  node->pSem;.  in
13240 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13250 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
13260 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
13270 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
13280 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
13290 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
132a0 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
132b0 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
132c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
132d0 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
132e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
132f0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
13300 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13310 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
13320 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
13330 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68    /* lock semaph
13340 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c  ore now but bail
13350 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64   out when alread
13360 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69  y locked. */.  i
13370 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
13380 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
13390 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
133a0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
133b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
133c0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
133d0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
133e0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
133f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13400 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65  ileLock;.. sem_e
13410 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72  nd_lock:.  retur
13420 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
13430 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
13440 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
13450 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
13460 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
13470 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
13480 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
13490 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
134a0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
134b0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
134c0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
134d0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
134e0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
134f0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
13500 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
13510 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13520 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
13530 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c  nt semUnlock(sql
13540 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13550 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13560 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13570 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13580 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
13590 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
135a0 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72  ->pSem;..  asser
135b0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73  t( pFile );.  as
135c0 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20  sert( pSem );.  
135d0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
135e0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
135f0 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  id=%d (sem)\n", 
13600 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
13610 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ock,..   pFile->
13620 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
13630 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
13640 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
13650 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
13660 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
13670 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
13680 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
13690 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
136a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
136b0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
136c0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
136d0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
136e0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
136f0 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
13700 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
13710 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
13720 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13730 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
13740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13750 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13760 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
13770 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
13780 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
13790 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
137a0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
137b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
137c0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
137d0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
137e0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
137f0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
13800 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
13810 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
13820 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
13830 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
13840 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
13850 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
13860 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
13870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13880 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
13890 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
138a0 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69  nt semClose(sqli
138b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
138c0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
138d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
138e0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
138f0 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69  .    semUnlock(i
13900 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
13910 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13920 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
13930 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65  utex();.    rele
13940 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
13950 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  le);.    unixLea
13960 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63  veMutex();.    c
13970 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
13980 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
13990 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
139a0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
139b0 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
139c0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
139d0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
139e0 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
139f0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
13a00 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
13a10 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
13a20 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
13a30 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
13a40 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
13a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a90 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ae0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
13af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b00 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
13b10 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
13b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b30 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
13b40 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
13b50 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
13b60 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
13b70 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
13b80 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
13b90 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
13ba0 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
13bb0 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
13bc0 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
13bd0 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
13be0 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
13bf0 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
13c00 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
13c10 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
13c20 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
13c30 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
13c40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
13c50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
13c60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
13c70 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
13c80 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
13c90 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
13ca0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
13cb0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13cc0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
13cd0 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
13ce0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
13cf0 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20  int reserved;.  
13d00 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
13d10 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
13d20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
13d30 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  pen file */.};..
13d40 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
13d50 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
13d60 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
13d70 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
13d80 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
13d90 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
13da0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13db0 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
13dc0 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
13dd0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
13de0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13df0 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
13e00 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
13e10 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
13e20 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
13e30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
13e40 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
13e50 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
13e60 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
13e70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
13e80 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
13e90 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
13ea0 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
13eb0 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
13ec0 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
13ef0 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
13f00 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
13f10 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
13f20 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
13f30 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
13f40 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
13f50 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
13f60 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
13f70 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e  ility for settin
13f80 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20  g or clearing a 
13f90 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f  bit-range lock o
13fa0 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65  n an.** AFP file
13fb0 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52  system..** .** R
13fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
13fd0 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
13fe0 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75  TE_BUSY on failu
13ff0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
14000 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20  t afpSetLock(.  
14010 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
14020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
14030 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
14040 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
14050 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  or unlocked */. 
14060 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14080 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
14090 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20  criptor on path 
140a0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
140b0 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
140c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
140d0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
140e0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
140f0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20  g long length,  
14100 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14110 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
14120 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  .  int setLockFl
14130 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
14140 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
14150 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f   lock.  False to
14160 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29   clear lock */.)
14170 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
14180 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a  angeLockPB2 pb;.
14190 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
141a0 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
141b0 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
141c0 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
141d0 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
141e0 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
141f0 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
14200 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
14210 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a   = pFile->h;.  .
14220 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
14230 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20  ETLOCK [%s] for 
14240 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c  %d%s in range %l
14250 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
14260 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
14270 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65  N":"OFF"), pFile
14280 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f  ->h, (pb.fd==-1?
14290 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22  "[testval-1]":""
142a0 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c  ),.    offset, l
142b0 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d  ength));.  err =
142c0 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
142d0 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
142e0 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
142f0 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
14300 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
14310 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
14320 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
14330 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
14340 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
14350 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
14360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
14370 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
14380 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a  rror(tErrno)));.
14390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
143a0 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
143b0 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51  RORS.    rc = SQ
143c0 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65  LITE_BUSY;.#else
143d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
143e0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
143f0 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20  ror(tErrno,.    
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
14420 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
14430 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
14440 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f  NLOCK);.#endif /
14450 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
14460 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  AFP_LOCK_ERRORS 
14470 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  */.    if( IS_LO
14480 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
14490 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
144a0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
144b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
144c0 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  n rc;.  } else {
144d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
144e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
144f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14500 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
14510 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
14520 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14530 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
14540 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
14550 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
14560 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
14570 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
14580 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
14590 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
145a0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
145b0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
145c0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
145d0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
145e0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
145f0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
14600 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
14610 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
14620 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52  ic int afpCheckR
14630 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
14640 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14650 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
14660 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14670 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
14680 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
14690 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
146a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53  File*)id;.  .  S
146b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
146c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
146d0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
146e0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
146f0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14700 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
14710 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
14720 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14730 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
14740 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66  ingContext;.  if
14750 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  ( context->reser
14760 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ved ){.    *pRes
14770 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Out = 1;.    ret
14780 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14790 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
147a0 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
147b0 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
147c0 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
147d0 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20   threads */.  . 
147e0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
147f0 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
14800 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
14810 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
14820 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
14830 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
14840 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
14850 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
14860 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
14870 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
14880 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
14890 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28   it..   */.  if(
148a0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
148b0 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45    /* lock the RE
148c0 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20  SERVED byte */. 
148d0 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70     int lrc = afp
148e0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
148f0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
14900 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
14910 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53  ,1);  .    if( S
14920 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b  QLITE_OK==lrc ){
14930 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
14940 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b  succeeded in tak
14950 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64  ing the reserved
14960 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
14970 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20   to restore.    
14980 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
14990 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20  l state */.     
149a0 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
149b0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
149c0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
149d0 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
149e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
149f0 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c     /* if we fail
14a00 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  ed to get the lo
14a10 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20  ck then someone 
14a20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69  else must have i
14a30 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72  t */.      reser
14a40 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
14a50 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
14a60 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
14a70 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d     rc=lrc;.    }
14a80 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
14a90 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
14aa0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
14ab0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61  LOCK %d %d %d (a
14ac0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
14ad0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
14ae0 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20  ;.  .  *pResOut 
14af0 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
14b00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14b10 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
14b20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
14b30 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
14b40 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
14b50 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
14b60 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
14b70 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
14b80 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
14b90 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
14ba0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
14bb0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
14bc0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
14bd0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
14be0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
14bf0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
14c00 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
14c10 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
14c20 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
14c30 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
14c40 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
14c50 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
14c60 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
14c70 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
14c80 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
14c90 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
14ca0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
14cb0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
14cc0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
14cd0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
14ce0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
14cf0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
14d00 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
14d10 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
14d20 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
14d30 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
14d40 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
14d50 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
14d60 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
14d70 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
14d80 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
14d90 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
14da0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
14db0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
14dc0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14dd0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
14de0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
14df0 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
14e00 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
14e10 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
14e20 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
14e30 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f  static int afpLo
14e40 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14e50 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14e60 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
14e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
14e80 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14e90 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
14ea0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
14eb0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
14ec0 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b  Inode;.  afpLock
14ed0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
14ee0 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
14ef0 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
14f00 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
14f10 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
14f20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
14f30 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
14f40 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
14f50 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
14f60 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
14f70 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
14f80 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
14f90 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
14fa0 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
14fb0 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
14fc0 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  k(pInode->eFileL
14fd0 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53  ock), pInode->nS
14fe0 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29  hared , getpid()
14ff0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
15000 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
15010 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
15020 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
15030 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
15040 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
15050 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
15060 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f  e the afp_end_lo
15070 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
15080 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
15090 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
150a0 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
150b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
150c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
150d0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
150e0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
150f0 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
15100 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22  y held) (afp)\n"
15110 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
15120 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
15130 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
15140 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15150 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
15160 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
15170 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
15180 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20  s correct.  **  
15190 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
151a0 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
151b0 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
151c0 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
151d0 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
151e0 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
151f0 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
15200 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
15210 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
15220 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
15230 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
15240 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
15250 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
15260 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
15270 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
15280 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
15290 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
152a0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
152b0 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
152c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
152d0 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
152e0 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
152f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15300 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
15310 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
15320 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
15330 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
15340 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
15350 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
15360 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
15370 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
15380 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
15390 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
153a0 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
153b0 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
153c0 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
153d0 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
153e0 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
153f0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
15400 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
15410 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
15420 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
15430 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
15440 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65   .       (pInode
15450 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
15460 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
15470 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
15480 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
15490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
154a0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
154b0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
154c0 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
154d0 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
154e0 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
154f0 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
15500 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
15510 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
15520 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
15530 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
15540 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
15550 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
15560 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
15570 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
15580 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
15590 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65  .     (pInode->e
155a0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
155b0 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
155c0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
155d0 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
155e0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
155f0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15600 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15610 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15620 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
15630 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
15640 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
15650 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
15660 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
15670 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
15680 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
15690 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
156a0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
156b0 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50   }.    .  /* A P
156c0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
156d0 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
156e0 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
156f0 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
15700 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
15710 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
15720 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
15730 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
15740 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
15750 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
15760 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
15770 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
15780 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
15790 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
157a0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
157b0 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
157c0 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
157d0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69   failed;.    fai
157e0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
157f0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
15800 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
15810 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20  _BYTE, 1, 1);.  
15820 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a    if (failed) {.
15830 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
15840 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  d;.      goto af
15850 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
15860 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  }.  }.  .  /* If
15870 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
15880 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
15890 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
158a0 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
158b0 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
158c0 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
158d0 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
158e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
158f0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
15900 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72  CK ){.    int lr
15910 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
15920 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  rno;.    long lk
15930 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
15940 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
15950 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
15960 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
15970 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
15980 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
15990 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
159a0 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
159b0 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
159c0 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
159d0 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
159e0 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
159f0 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
15a00 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
15a10 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
15a20 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
15a30 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
15a40 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
15a50 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
15a60 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
15a70 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
15a80 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
15a90 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
15aa0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
15ab0 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
15ac0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
15ad0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
15ae0 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
15af0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15b00 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
15b10 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
15b20 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
15b30 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
15b40 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
15b50 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
15b60 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
15b70 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
15b80 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
15b90 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
15ba0 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
15bb0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
15bc0 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
15bd0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
15be0 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rc1Errno;.      
15bf0 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
15c00 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15c10 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
15c20 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15c30 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
15c40 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
15c50 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15c60 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
15c70 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
15c80 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
15c90 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
15ca0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
15cb0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15cc0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
15cd0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
15ce0 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
15cf0 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
15d00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
15d10 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
15d20 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
15d30 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
15d40 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
15d50 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
15d60 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
15d70 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
15d80 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
15d90 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
15da0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
15db0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
15dc0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15dd0 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
15de0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
15df0 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
15e00 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
15e10 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
15e20 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
15e30 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
15e40 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
15e50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
15e60 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
15e70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
15e80 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
15e90 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
15ea0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
15eb0 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
15ec0 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
15ed0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
15ee0 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
15ef0 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
15f00 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
15f10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
15f20 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
15f30 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15f40 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15f50 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
15f60 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
15f70 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
15f80 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
15f90 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
15fa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15fb0 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
15fc0 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
15fd0 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
15fe0 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
15ff0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16000 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
16010 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
16020 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
16030 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
16040 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
16050 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
16060 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
16070 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
16080 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
16090 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
160a0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
160b0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
160c0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
160d0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
160e0 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
16110 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
16120 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
16130 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
16140 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
16150 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
16160 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
16170 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
16180 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
16190 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
161a0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
161b0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
161e0 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
161f0 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
16200 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
16210 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16220 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16230 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
16240 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
16250 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
16260 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
16270 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
16280 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
16290 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
162a0 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
162b0 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
162c0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
162d0 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
162e0 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
162f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
16300 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
16310 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
16320 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
16330 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
16340 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
16350 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
16360 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16370 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
16380 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
16390 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
163a0 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
163b0 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
163c0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
163d0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
163e0 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
163f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16400 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16410 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
16420 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
16430 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
16440 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
16450 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
16460 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
16470 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16480 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
16490 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
164a0 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
164b0 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
164c0 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
164d0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
164e0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
164f0 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
16500 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
16510 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16520 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
16530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
16540 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
16550 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
16560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
16570 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16580 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
16590 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
165a0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
165b0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
165c0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
165d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
165e0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
165f0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
16600 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16610 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
16620 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
16630 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
16640 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
16650 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
16670 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
16680 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
16690 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
166a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
166b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
166c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
166d0 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
166e0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
166f0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16700 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
16710 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
16720 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
16730 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
16740 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
16750 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16760 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
16770 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
16780 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
16790 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
167a0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
167b0 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
167c0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
167d0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
167e0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
167f0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
16800 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
16810 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
16820 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
16830 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
16840 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
16850 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
16860 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
16870 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16880 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
16890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
168a0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
168b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
168c0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
168d0 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
168e0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
168f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
16900 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
16910 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
16920 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16930 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
16940 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
16950 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16960 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
16970 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16980 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
16990 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
169a0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
169b0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
169c0 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
169d0 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
169e0 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
169f0 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
16a00 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
16a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
16a20 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
16a30 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
16a40 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
16a50 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
16a60 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
16a70 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
16a80 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
16a90 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
16aa0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
16ab0 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
16ac0 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
16ad0 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
16ae0 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
16af0 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
16b00 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
16b10 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
16b20 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
16b30 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
16b40 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
16b50 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
16b60 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
16b70 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
16b80 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
16b90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  /.    assert( pF
16ba0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
16bb0 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
16bc0 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64   || pFile->dbUpd
16bd0 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ate==0.         
16be0 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e    || pFile->tran
16bf0 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a  sCntrChng==1 );.
16c00 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
16c10 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
16c20 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66  ndif.    .    if
16c30 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16c40 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
16c50 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
16c60 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16c70 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16c80 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
16c90 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
16ca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
16cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
16cc0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16cd0 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
16ce0 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20  >nShared>1) ){. 
16cf0 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72         /* only r
16d00 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  e-establish the 
16d10 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e  shared lock if n
16d20 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
16d30 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f      int sharedLo
16d40 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
16d50 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
16d60 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20  aredByte;.      
16d70 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
16d80 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16d90 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
16da0 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b  LockByte, 1, 1);
16db0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
16dc0 20 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72          skipShar
16dd0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
16de0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16df0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
16e00 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
16e10 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
16e20 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
16e30 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16e40 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
16e50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
16e60 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69  0);.    } .    i
16e70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16e80 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
16e90 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
16ea0 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e  OCK && context->
16eb0 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
16ec0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
16ed0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16ee0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
16ef0 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
16f00 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
16f10 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78   .        contex
16f20 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b  t->reserved = 0;
16f30 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
16f40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16f50 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c  TE_OK && (eFileL
16f60 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16f70 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   || pInode->nSha
16f80 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70  red>1)){.      p
16f90 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16fa0 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
16fb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
16fc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16fd0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
16fe0 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44  OCK ){..    /* D
16ff0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
17000 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
17010 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
17020 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
17030 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
17040 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
17050 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
17060 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
17070 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
17080 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
17090 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
170a0 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ong sharedLockBy
170b0 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
170c0 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
170d0 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Byte;.    pInode
170e0 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20  ->nShared--;.   
170f0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68   if( pInode->nSh
17100 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ared==0 ){.     
17110 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17120 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
17130 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17140 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20  ( h=(-1) ).     
17150 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17160 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
17170 20 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64   if( !skipShared
17180 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17190 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
171a0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
171b0 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
171c0 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
171d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63   }.      if( !rc
171e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
171f0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
17200 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  NO_LOCK;.       
17210 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17220 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
17230 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17250 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
17260 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20  ->nLock--;.     
17270 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
17280 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
17290 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
172a0 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
172b0 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
172c0 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
172d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
172e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
172f0 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
17300 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
17310 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17320 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
17330 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
17340 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65  ose a file & cle
17350 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69  anup AFP specifi
17360 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  c locking contex
17370 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t .*/.static int
17380 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65   afpClose(sqlite
17390 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
173a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
173b0 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
173c0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
173d0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
173e0 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f  )id;.    afpUnlo
173f0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
17400 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
17410 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70  tex();.    if( p
17420 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
17430 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
17440 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
17450 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
17460 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
17470 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
17480 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
17490 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65  just.      ** ye
174a0 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
174b0 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
174c0 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
174d0 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
174e0 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
174f0 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50  or to pInode->aP
17500 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c  ending.  It will
17510 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
17520 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20  y closed when.  
17530 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
17540 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
17550 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17560 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
17570 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  le);.    }.    r
17580 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
17590 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69  pFile);.    sqli
175a0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
175b0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
175c0 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
175d0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
175e0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
175f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17600 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
17610 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
17620 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
17630 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
17640 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
17650 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
17660 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
17670 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
17680 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
17690 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
176a0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
176b0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
176c0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
176d0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
176e0 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
176f0 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
17700 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
17710 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
17720 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
17730 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
17740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17750 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
17760 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
17770 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
17780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
177e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
17830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17840 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
17850 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
17860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
17880 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
17890 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
178a0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
178b0 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
178c0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
178d0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
178e0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
178f0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
17900 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20  ock. ** must be 
17910 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
17920 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20  r SHARED_LOCK.. 
17930 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f  **. ** If the lo
17940 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
17950 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
17960 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
17970 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68   or below. ** th
17980 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
17990 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
179a0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
179b0 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  op.. */.static i
179c0 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c  nt nfsUnlock(sql
179d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
179e0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
179f0 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
17a00 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
17a10 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  k, 1);.}..#endif
17a20 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
17a30 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
17a40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
17a50 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
17a60 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
17a70 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
17a80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
17a90 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
17aa0 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
17ab0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
17ac0 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
17ad0 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
17ae0 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
17af0 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a  s available.  .*
17b00 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
17b10 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
17b20 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
17b30 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
17b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b50 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
17b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ba0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
17bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17bf0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
17c00 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20  *** Non-locking 
17c10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
17c20 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
17c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c40 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  **.**.** The nex
17c50 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  t division conta
17c60 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ins implementati
17c70 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68  ons for all meth
17c80 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ods of the .** s
17c90 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
17ca0 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ct other than th
17cb0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
17cc0 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  s.  The locking.
17cd0 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20  ** methods were 
17ce0 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73  defined in divis
17cf0 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20  ions above (one 
17d00 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70  locking method p
17d10 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e  er.** division).
17d20 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20    Those methods 
17d30 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20  that are common 
17d40 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d  to all locking m
17d50 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68  odes.** are gath
17d60 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  er together into
17d70 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a   this division..
17d80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  */../*.** Seek t
17d90 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
17da0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
17db0 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
17dc0 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
17dd0 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
17de0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
17df0 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
17e00 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
17e10 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
17e20 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
17e30 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
17e40 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
17e50 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
17e60 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
17e70 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
17e80 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
17e90 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
17ea0 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
17eb0 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
17ec0 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
17ed0 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79  PREAD.** any any
17ee0 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
17ef0 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
17f00 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
17f10 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
17f20 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
17f30 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
17f40 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
17f50 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
17f60 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
17f70 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
17f80 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
17f90 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
17fa0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
17fb0 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
17fc0 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
17fd0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
17fe0 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
17ff0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
18000 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66  t got;.#if (!def
18010 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
18020 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
18030 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
18040 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
18050 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  f.  TIMER_START;
18060 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
18070 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f  _PREAD).  do{ go
18080 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e  t = osPread(id->
18090 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
180a0 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67  fset); }while( g
180b0 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
180c0 49 4e 54 52 20 29 3b 0a 20 20 53 69 6d 75 6c 61  INTR );.  Simula
180d0 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
180e0 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66   -1 );.#elif def
180f0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
18100 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  ).  do{ got = os
18110 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
18120 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
18130 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
18140 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
18150 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
18160 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
18170 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
18180 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
18190 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
181a0 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  SET);.  Simulate
181b0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
181c0 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65  et-- );.  if( ne
181d0 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
181e0 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
181f0 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
18200 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18210 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18220 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
18230 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
18240 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18250 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
18260 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
18270 0a 20 20 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  .  }.  do{ got =
18280 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70   osRead(id->h, p
18290 42 75 66 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c  Buf, cnt); }whil
182a0 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
182b0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64  o==EINTR );.#end
182c0 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
182d0 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
182e0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
182f0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
18300 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54  errno;.  }.  OST
18310 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25  RACE(("READ    %
18320 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
18330 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f  lu\n", id->h, go
18340 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52  t, offset, TIMER
18350 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
18360 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  turn got;.}../*.
18370 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
18380 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
18390 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
183a0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
183b0 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
183c0 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
183d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
183e0 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
183f0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
18400 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
18410 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
18420 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
18430 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
18440 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
18450 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
18460 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
18470 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
18480 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
18490 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20  ssert( id );..  
184a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
184b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
184c0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
184d0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
184e0 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
184f0 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
18500 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
18510 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
18520 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
18530 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
18540 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
18550 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
18560 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
18570 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
18580 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
18590 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
185a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20  ;.#endif..  got 
185b0 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
185c0 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
185d0 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
185e0 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
185f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18600 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
18610 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73  <0 ){.    /* las
18620 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
18630 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
18640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18650 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  OERR_READ;.  }el
18660 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
18670 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a  astErrno = 0; /*
18680 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
18690 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e  ror */.    /* Un
186a0 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
186b0 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
186c0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
186d0 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
186e0 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
186f0 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
18700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18710 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
18720 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
18730 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
18740 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
18750 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
18760 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
18770 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18780 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
18790 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
187a0 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
187b0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
187c0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
187d0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
187e0 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73  ed write the las
187f0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
18800 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
18810 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
18820 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
18830 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
18840 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
18850 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
18860 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
18870 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e  got;.#if (!defin
18880 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26  ed(USE_PREAD) &&
18890 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52   !defined(USE_PR
188a0 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65  EAD64)).  i64 ne
188b0 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a  wOffset;.#endif.
188c0 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23    TIMER_START;.#
188d0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
188e0 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20  READ).  do{ got 
188f0 3d 20 6f 73 50 77 72 69 74 65 28 69 64 2d 3e 68  = osPwrite(id->h
18900 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
18910 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  set); }while( go
18920 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
18930 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66  NTR );.#elif def
18940 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
18950 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  ).  do{ got = os
18960 50 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  Pwrite64(id->h, 
18970 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
18980 74 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  t);}while( got<0
18990 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
189a0 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66  );.#else.  newOf
189b0 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
189c0 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
189d0 5f 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74  _SET);.  Simulat
189e0 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
189f0 73 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e  set-- );.  if( n
18a00 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
18a10 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f   ){.    if( newO
18a20 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20  ffset == -1 ){. 
18a30 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
18a40 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
18a50 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c  = errno;.    }el
18a60 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  se{.      ((unix
18a70 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18a80 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20  rrno = 0;....   
18a90 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31   }.    return -1
18aa0 3b 0a 20 20 7d 0a 20 20 64 6f 7b 20 67 6f 74 20  ;.  }.  do{ got 
18ab0 3d 20 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c  = osWrite(id->h,
18ac0 20 70 42 75 66 2c 20 63 6e 74 29 3b 20 7d 77 68   pBuf, cnt); }wh
18ad0 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
18ae0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
18af0 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44  ndif.  TIMER_END
18b00 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  ;.  if( got<0 ){
18b10 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
18b20 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
18b30 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20  = errno;.  }..  
18b40 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
18b50 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
18b60 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c   %llu\n", id->h,
18b70 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49   got, offset, TI
18b80 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
18b90 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a   return got;.}..
18ba0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
18bb0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
18bc0 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
18bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
18be0 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
18bf0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
18c00 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
18c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18c20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c  unixWrite(.  sql
18c30 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
18c40 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
18c50 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
18c60 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
18c70 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69  offset .){.  uni
18c80 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
18c90 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
18ca0 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
18cb0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
18cc0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
18cd0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
18ce0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
18cf0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
18d00 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
18d10 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
18d20 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
18d30 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
18d40 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
18d50 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
18d60 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
18d70 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
18d80 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
18d90 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
18da0 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
18db0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
18dc0 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
18dd0 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
18de0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
18df0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
18e00 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
18e10 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
18e20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
18e30 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
18e40 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
18e50 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
18e60 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
18e70 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
18e80 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
18e90 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
18ea0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
18eb0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
18ec0 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
18ed0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
18ee0 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
18ef0 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
18f00 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
18f10 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
18f20 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
18f30 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
18f40 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
18f50 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
18f60 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
18f70 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
18f80 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
18f90 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
18fa0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
18fb0 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
18fc0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
18fd0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
18fe0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
18ff0 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
19000 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
19010 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
19020 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
19030 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
19040 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
19050 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
19060 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
19070 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
19080 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
19090 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
190a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
190b0 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
190c0 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
190d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
190e0 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
190f0 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
19100 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66  dWrite(pFile, of
19110 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
19120 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  )>0 ){.    amt -
19130 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
19140 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
19150 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
19160 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
19170 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
19180 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
19190 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
191a0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
191b0 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
191c0 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66   amt=1 ));..  if
191d0 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
191e0 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46  f( wrote<0 && pF
191f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d  ile->lastErrno!=
19200 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20  ENOSPC ){.      
19210 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
19220 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
19230 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
19240 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
19250 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
19260 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
19270 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e  tErrno = 0; /* n
19280 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
19290 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
192a0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
192b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
192c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
192d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
192e0 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
192f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
19300 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
19310 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
19320 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
19330 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
19340 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
19350 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
19360 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
19370 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
19380 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
19390 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
193a0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
193b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
193c0 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
193d0 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
193e0 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
193f0 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
19400 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
19410 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
19420 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
19430 74 68 65 20 28 73 6c 6f 77 65 72 29 20 66 73 79  the (slower) fsy
19440 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  nc()..** If you 
19450 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
19460 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
19470 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
19480 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
19490 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
194a0 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
194b0 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23  c=fdatasync.*/.#
194c0 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74  if !defined(fdat
194d0 61 73 79 6e 63 29 20 26 26 20 21 64 65 66 69 6e  async) && !defin
194e0 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20  ed(__linux__).# 
194f0 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63  define fdatasync
19500 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f   fsync.#endif../
19510 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45  *.** Define HAVE
19520 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20  _FULLFSYNC to 0 
19530 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 1 depending o
19540 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
19550 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53  .** the F_FULLFS
19560 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
19570 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59  ined.  F_FULLFSY
19580 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  NC is currently.
19590 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  ** only availabl
195a0 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20  e on Mac OS X.  
195b0 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63  But that could c
195c0 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  hange..*/.#ifdef
195d0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64   F_FULLFSYNC.# d
195e0 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
195f0 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64  SYNC 1.#else.# d
19600 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
19610 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  SYNC 0.#endif...
19620 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28  /*.** The fsync(
19630 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f  ) system call do
19640 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61  es not work as a
19650 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e  dvertised on man
19660 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d  y.** unix system
19670 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
19680 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  g procedure is a
19690 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  n attempt to mak
196a0 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74  e.** it work bet
196b0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ter..**.** The S
196c0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61  QLITE_NO_SYNC ma
196d0 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c  cro disables all
196e0 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73   fsync()s.  This
196f0 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f   is useful.** fo
19700 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77  r testing when w
19710 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  e want to run th
19720 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73  rough the test s
19730 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a  uite quickly..**
19740 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c   You are strongl
19750 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20  y advised *not* 
19760 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53  to deploy with S
19770 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a  QLITE_NO_SYNC.**
19780 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65   enabled, howeve
19790 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51  r, since with SQ
197a0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61  LITE_NO_SYNC ena
197b0 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73  bled, an OS cras
197c0 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  h.** or power fa
197d0 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  ilure will likel
197e0 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61  y corrupt the da
197f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
19800 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74  ** SQLite sets t
19810 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
19820 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   if the size of 
19830 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68  the file is unch
19840 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64  anged..** The id
19850 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e  ea behind dataOn
19860 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68  ly is that it sh
19870 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20  ould only write 
19880 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  the file content
19890 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74  .** to disk, not
198a0 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20   the inode.  We 
198b0 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c  only set dataOnl
198c0 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69  y if the file si
198d0 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e  ze is .** unchan
198e0 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69  ged since the fi
198f0 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20  le size is part 
19900 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48  of the inode.  H
19910 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20  owever, .** Ted 
19920 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68  Ts'o tells us th
19930 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
19940 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74  ill also write t
19950 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a  he inode if the.
19960 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73  ** file size has
19970 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f   changed.  The o
19980 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65  nly real differe
19990 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74  nce between fdat
199a0 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66  async().** and f
199b0 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c  sync(), Ted tell
199c0 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64  s us, is that fd
199d0 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e  atasync() will n
199e0 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20  ot flush the.** 
199f0 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69  inode if the mti
19a00 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f  me or owner or o
19a10 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69  ther inode attri
19a20 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67  butes have chang
19a30 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63  ed..** We only c
19a40 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69  are about the fi
19a50 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65  le size, not the
19a60 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72   other file attr
19a70 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73  ibutes, so.** as
19a80 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69   far as SQLite i
19a90 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20  s concerned, an 
19aa0 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61  fdatasync() is a
19ab0 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a  lways adequate..
19ac0 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73  ** So, we always
19ad0 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29   use fdatasync()
19ae0 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
19af0 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ble, regardless 
19b00 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  of.** the value 
19b10 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  of the dataOnly 
19b20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flag..*/.static 
19b30 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69  int full_fsync(i
19b40 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53  nt fd, int fullS
19b50 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c  ync, int dataOnl
19b60 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  y){.  int rc;.. 
19b70 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
19b80 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c  g "ifdef/elif/el
19b90 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74  se/" block has t
19ba0 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72  he same structur
19bb0 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e  e as.  ** the on
19bc0 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72  e below. It is r
19bd0 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73  eplicated here s
19be0 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63  olely to avoid c
19bf0 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20  luttering .  ** 
19c00 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65  up the real code
19c10 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44   with the UNUSED
19c20 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63  _PARAMETER() mac
19c30 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ros..  */.#ifdef
19c40 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
19c50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
19c60 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(fd);.  UNUSED
19c70 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
19c80 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
19c90 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
19ca0 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  y);.#elif HAVE_F
19cb0 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45  ULLFSYNC.  UNUSE
19cc0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
19cd0 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55  Only);.#else.  U
19ce0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19cf0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
19d00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
19d10 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a  taOnly);.#endif.
19d20 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
19d30 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
19d40 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
19d50 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
19d60 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
19d70 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
19d80 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
19d90 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
19da0 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
19db0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
19dc0 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
19dd0 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
19de0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
19df0 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
19e00 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
19e10 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
19e20 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
19e30 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
19e40 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
19e50 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
19e60 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
19e70 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
19e80 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
19e90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
19ea0 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c  _SYNC.  rc = SQL
19eb0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41  ITE_OK;.#elif HA
19ec0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69  VE_FULLFSYNC.  i
19ed0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  f( fullSync ){. 
19ee0 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
19ef0 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c  fd, F_FULLFSYNC,
19f00 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
19f10 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
19f20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53  /* If the FULLFS
19f30 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c  YNC failed, fall
19f40 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74   back to attempt
19f50 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a  ing an fsync()..
19f60 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27    ** It shouldn'
19f70 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f  t be possible fo
19f80 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66  r fullfsync to f
19f90 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ail on the local
19fa0 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74   .  ** file syst
19fb0 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20  em (on OSX), so 
19fc0 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65  failure indicate
19fd0 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43  s that FULLFSYNC
19fe0 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70  .  ** isn't supp
19ff0 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66  orted for this f
1a000 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20  ile system. So, 
1a010 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63  attempt an fsync
1a020 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20   .  ** and (for 
1a030 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20  now) ignore the 
1a040 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75  overhead of a su
1a050 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20  perfluous fcntl 
1a060 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27  call.  .  ** It'
1a070 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64  d be better to d
1a080 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20  etect fullfsync 
1a090 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64  support once and
1a0a0 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65   avoid .  ** the
1a0b0 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72   fcntl call ever
1a0c0 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63  y time sync is c
1a0d0 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  alled..  */.  if
1a0e0 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e  ( rc ) rc = fsyn
1a0f0 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65  c(fd);..#elif de
1a100 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1a110 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28  .  /* fdatasync(
1a120 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27  ) on HFS+ doesn'
1a130 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20  t yet flush the 
1a140 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20  file size if it 
1a150 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c  changed correctl
1a160 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e  y.  ** so curren
1a170 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74  tly we default t
1a180 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74  o the macro that
1a190 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61   redefines fdata
1a1a0 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20  sync to fsync.  
1a1b0 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28  */.  rc = fsync(
1a1c0 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63  fd);.#else .  rc
1a1d0 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
1a1e0 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
1a1f0 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26  .  if( rc==-1 &&
1a200 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20   errno==ENOTSUP 
1a210 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e  ){.    rc = fsyn
1a220 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  c(fd);.  }.#endi
1a230 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
1a240 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64  */.#endif /* ifd
1a250 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1a260 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  C elif HAVE_FULL
1a270 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20  FSYNC */..  if( 
1a280 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63  OS_VXWORKS && rc
1a290 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  != -1 ){.    rc 
1a2a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1a2b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1a2c0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1a2d0 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1a2e0 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1a2f0 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1a300 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1a310 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1a320 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1a330 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1a340 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1a350 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1a360 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1a370 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1a380 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1a390 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1a3a0 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1a3b0 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1a3c0 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1a3d0 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1a3e0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1a3f0 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1a400 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1a410 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1a420 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1a430 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1a440 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1a450 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1a460 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1a470 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1a480 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1a490 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1a4a0 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1a4b0 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1a4c0 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1a4d0 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1a4e0 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1a4f0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1a500 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1a510 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1a520 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1a530 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1a540 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1a550 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1a560 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1a570 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1a580 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1a590 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1a5a0 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1a5b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1a5c0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1a5d0 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1a5e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1a5f0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1a600 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1a610 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1a620 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1a630 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1a640 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1a650 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1a660 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1a670 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1a680 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1a690 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1a6a0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1a6b0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1a6c0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1a6d0 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1a6e0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1a6f0 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1a700 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1a710 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1a720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1a730 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1a740 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1a750 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1a760 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1a770 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1a780 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1a790 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1a7a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1a7b0 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1a7c0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1a7d0 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1a7e0 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1a7f0 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1a800 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1a810 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1a820 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1a830 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1a840 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1a850 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1a860 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1a870 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1a880 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1a890 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1a8a0 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1a8b0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ath);.  }.  if( 
1a8c0 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
1a8d0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
1a8e0 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68  "DIRSYNC %-3d (h
1a8f0 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64  ave_fullfsync=%d
1a900 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22   fullsync=%d)\n"
1a910 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a  , pFile->dirfd,.
1a920 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45              HAVE
1a930 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75  _FULLFSYNC, isFu
1a940 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e 64 65  llsync));.#ifnde
1a950 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
1a960 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20  _DIRSYNC.    /* 
1a970 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  The directory sy
1a980 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  nc is only attem
1a990 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79  pted if full_fsy
1a9a0 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72  nc is.    ** tur
1a9b0 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61  ned off or unava
1a9c0 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75  ilable.  If a fu
1a9d0 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65  ll_fsync occurre
1a9e0 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20  d above,.    ** 
1a9f0 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f  then the directo
1aa00 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72  ry sync is super
1aa10 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  fluous..    */. 
1aa20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55     if( (!HAVE_FU
1aa30 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75  LLFSYNC || !isFu
1aa40 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f  llsync) && full_
1aa50 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72  fsync(pFile->dir
1aa60 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
1aa70 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57    /*.       ** W
1aa80 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  e have received 
1aa90 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73  multiple reports
1aaa0 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75   of fsync() retu
1aab0 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20  rning.       ** 
1aac0 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c  errors when appl
1aad0 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69  ied to directori
1aae0 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69  es on certain fi
1aaf0 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  le systems..    
1ab00 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64     ** A failed d
1ab10 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
1ab20 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e   not a big deal.
1ab30 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20    So it seems.  
1ab40 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74       ** better t
1ab50 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72  o ignore the err
1ab60 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35  or.  Ticket #165
1ab70 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  7.       */.    
1ab80 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61 73     /* pFile->las
1ab90 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20  tErrno = errno; 
1aba0 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74  */.       /* ret
1abb0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1abc0 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ; */.    }.#endi
1abd0 66 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65  f.    /* Only ne
1abe0 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
1abf0 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 20 64   so close the  d
1ac00 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77 65  irectory when we
1ac10 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20 20   are done */.   
1ac20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1ac30 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  ile, pFile->dirf
1ac40 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
1ac50 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d    pFile->dirfd =
1ac60 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
1ac70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1ac80 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
1ac90 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
1aca0 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
1acb0 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
1acc0 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
1acd0 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
1ace0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1acf0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
1ad00 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)id;.  int rc;.
1ad10 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1ad20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1ad30 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1ad40 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1ad50 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  TE );..  /* If t
1ad60 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
1ad70 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
1ad80 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
1ad90 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
1ada0 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
1adb0 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
1adc0 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
1add0 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
1ade0 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
1adf0 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
1ae00 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
1ae10 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
1ae20 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
1ae30 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
1ae40 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1ae50 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e  szChunk ){.    n
1ae60 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
1ae70 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1ae80 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
1ae90 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1aea0 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63  Chunk;.  }..  rc
1aeb0 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63   = robust_ftrunc
1aec0 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f  ate(pFile->h, (o
1aed0 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69  ff_t)nByte);.  i
1aee0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1aef0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1af00 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1af10 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1af20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1af30 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1af40 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1af50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64  ;.  }else{.#ifnd
1af60 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
1af70 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1af80 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1af90 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1afa0 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1afb0 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61  o.    ** doing a
1afc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1afd0 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1afe0 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1aff0 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a  her than a.    *
1b000 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1b010 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74  e file) and we t
1b020 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1b030 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c   to zero length,
1b040 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66  .    ** that eff
1b050 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73  ectively updates
1b060 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1b070 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ter.  This might
1b080 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77   happen.    ** w
1b090 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20  hen restoring a 
1b0a0 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
1b0b0 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72  he backup API fr
1b0c0 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  om a zero-length
1b0d0 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a  .    ** source..
1b0e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b0f0 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
1b100 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20  ite && nByte==0 
1b110 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1b120 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
1b130 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
1b140 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b150 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
1b160 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
1b170 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1b180 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
1b190 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1b1a0 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
1b1b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1b1c0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
1b1d0 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
1b1e0 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
1b1f0 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
1b200 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69  osFstat(((unixFi
1b210 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
1b220 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1b230 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1b240 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1b250 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1b260 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1b270 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1b280 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1b290 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1b2a0 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1b2b0 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1b2c0 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1b2d0 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1b2e0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f  dInodeInfo() pro
1b2f0 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74  cedure.  ** writ
1b300 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  es a single byte
1b310 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20   into that file 
1b320 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
1b330 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20   around a bug.  
1b340 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d  ** in the OS-X m
1b350 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e  sdos filesystem.
1b360 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76    In order to av
1b370 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  oid problems wit
1b380 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79  h upper.  ** lay
1b390 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ers, we need to 
1b3a0 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65  report this file
1b3b0 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76   size as zero ev
1b3c0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a  en though it is.
1b3d0 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20    ** really 1.  
1b3e0 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20   Ticket #3260.. 
1b3f0 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65   */.  if( *pSize
1b400 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30  ==1 ) *pSize = 0
1b410 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ;...  return SQL
1b420 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
1b430 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1b440 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1b450 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1b460 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66  ./*.** Handler f
1b470 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  or proxy-locking
1b480 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65   file-control ve
1b490 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65  rbs.  Defined be
1b4a0 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72  low in the.** pr
1b4b0 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64  oxying locking d
1b4c0 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ivision..*/.stat
1b4d0 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
1b4e0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1b4f0 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29  file*,int,void*)
1b500 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a  ;.#endif../* .**
1b510 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b520 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64  s called to hand
1b530 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  le the SQLITE_FC
1b540 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a  NTL_SIZE_HINT .*
1b550 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f  * file-control o
1b560 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
1b570 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
1b580 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
1b590 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
1b5a0 20 66 69 6c 65 2c 20 69 74 20 63 6f 75 6c 64 20   file, it could 
1b5b0 62 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 66  be.** that the f
1b5c0 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
1b5d0 65 78 74 65 6e 64 65 64 20 61 74 20 74 68 69 73  extended at this
1b5e0 20 70 6f 69 6e 74 2e 20 4f 74 68 65 72 77 69 73   point. Otherwis
1b5f0 65 2c 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45  e, the.** SQLITE
1b600 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1b610 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
1b620 6e 6f 2d 6f 70 20 66 6f 72 20 55 6e 69 78 2e 0a  no-op for Unix..
1b630 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63  */.static int fc
1b640 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78  ntlSizeHint(unix
1b650 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34  File *pFile, i64
1b660 20 6e 42 79 74 65 29 7b 0a 20 20 7b 20 2f 2a 20   nByte){.  { /* 
1b670 70 72 65 73 65 72 76 65 20 69 6e 64 65 6e 74 61  preserve indenta
1b680 74 69 6f 6e 20 6f 66 20 72 65 6d 6f 76 65 64 20  tion of removed 
1b690 22 69 66 22 20 2a 2f 0a 20 20 20 20 69 36 34 20  "if" */.    i64 
1b6a0 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
1b6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1b6c0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1b6d0 2a 2f 0a 20 20 20 20 69 36 34 20 73 7a 43 68 75  */.    i64 szChu
1b6e0 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nk;             
1b6f0 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69       /* Chunk si
1b700 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
1b710 20 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20   stat buf;      
1b720 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1b730 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76  to hold return v
1b740 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29  alues of fstat()
1b750 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20   */.   .    if( 
1b760 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
1b770 2c 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e  , &buf) ) return
1b780 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1b790 54 41 54 3b 0a 0a 20 20 20 20 73 7a 43 68 75 6e  TAT;..    szChun
1b7a0 6b 20 3d 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  k = pFile->szChu
1b7b0 6e 6b 3b 0a 20 20 20 20 69 66 28 20 73 7a 43 68  nk;.    if( szCh
1b7c0 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk==0 ){.      
1b7d0 6e 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20  nSize = nByte;. 
1b7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b7f0 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1b800 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 73 7a 43  szChunk-1) / szC
1b810 68 75 6e 6b 29 20 2a 20 73 7a 43 68 75 6e 6b 3b  hunk) * szChunk;
1b820 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
1b830 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1b840 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65  _size ){..#if de
1b850 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1b860 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1b870 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1b880 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  ATE.      /* The
1b890 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68   code below is h
1b8a0 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75  andling the retu
1b8b0 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61  rn value of osFa
1b8c0 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20  llocate() .     
1b8d0 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70   ** correctly. p
1b8e0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1b8f0 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22   is defined to "
1b900 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20  returns zero on 
1b910 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  success, .      
1b920 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e  ** or an error n
1b930 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72  umber on  failur
1b940 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70  e". See the manp
1b950 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  age for details.
1b960 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
1b970 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
1b980 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c       err = osFal
1b990 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  locate(pFile->h,
1b9a0 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53   buf.st_size, nS
1b9b0 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29  ize-buf.st_size)
1b9c0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1b9d0 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  err==EINTR );.  
1b9e0 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65      if( err ) re
1b9f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1ba00 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20  R_WRITE;.#else. 
1ba10 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f       /* If the O
1ba20 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  S does not have 
1ba30 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1ba40 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73  ), fake it. Firs
1ba50 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  t use.      ** f
1ba60 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65  truncate() to se
1ba70 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1ba80 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69   then write a si
1ba90 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20  ngle byte to.   
1baa0 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62     ** the last b
1bab0 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  yte in each bloc
1bac0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  k within the ext
1bad0 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
1bae0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
1baf0 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75  he same techniqu
1bb00 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  e used by glibc 
1bb10 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73  to implement pos
1bb20 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20  ix_fallocate(). 
1bb30 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65       ** on syste
1bb40 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ms that do not h
1bb50 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
1bb60 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61  cate() system ca
1bb70 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1bb80 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1bb90 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1bba0 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1bbb0 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1bbc0 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bbe0 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1bbf0 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1bc00 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
1bc10 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1bc20 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  , nSize) ){.    
1bc30 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1bc40 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1bc50 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
1bc60 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1bc70 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1bc80 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1bc90 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1bca0 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74     }.      iWrit
1bcb0 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a  e = ((buf.st_siz
1bcc0 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f  e + 2*nBlk - 1)/
1bcd0 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20  nBlk)*nBlk-1;.  
1bce0 20 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74      while( iWrit
1bcf0 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  e<nSize ){.     
1bd00 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
1bd10 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1bd20 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
1bd30 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1bd40 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
1bd50 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1bd60 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69  WRITE;.        i
1bd70 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20  Write += nBlk;. 
1bd80 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1bd90 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1bda0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1bdb0 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
1bdc0 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
1bdd0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
1bde0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1bdf0 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
1be00 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1be10 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1be20 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
1be30 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1be40 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1be50 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
1be60 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1be70 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  = ((unixFile*)id
1be80 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  )->eFileLock;.  
1be90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bea0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1beb0 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
1bec0 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
1bed0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
1bee0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1bef0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
1bf00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bf10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bf20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1bf30 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1bf40 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1bf50 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  )->szChunk = *(i
1bf60 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
1bf70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bf80 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1bf90 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1bfa0 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
1bfb0 20 20 72 65 74 75 72 6e 20 66 63 6e 74 6c 53 69    return fcntlSi
1bfc0 7a 65 48 69 6e 74 28 28 75 6e 69 78 46 69 6c 65  zeHint((unixFile
1bfd0 20 2a 29 69 64 2c 20 2a 28 69 36 34 20 2a 29 70   *)id, *(i64 *)p
1bfe0 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  Arg);.    }.#ifn
1bff0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
1c000 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
1c010 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
1c020 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
1c030 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
1c040 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
1c050 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1c060 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
1c070 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
1c080 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
1c090 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
1c0a0 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
1c0b0 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
1c0c0 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
1c0d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c0e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1c0f0 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
1c100 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1c110 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
1c120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c130 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c140 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1c150 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c160 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1c170 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
1c180 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54   case SQLITE_SET
1c190 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a  _LOCKPROXYFILE:.
1c1a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c1b0 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
1c1c0 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
1c1d0 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  n proxyFileContr
1c1e0 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a  ol(id,op,pArg);.
1c1f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1c200 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c210 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1c220 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c230 29 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  ) */.    case SQ
1c240 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f  LITE_FCNTL_SYNC_
1c250 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20 20  OMITTED: {.     
1c260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c270 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70 20 2a  K;  /* A no-op *
1c280 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
1c290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1c2a0 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
1c2b0 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
1c2c0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
1c2d0 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
1c2e0 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
1c2f0 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
1c300 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
1c310 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
1c320 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
1c330 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
1c340 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
1c350 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
1c360 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
1c370 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
1c380 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
1c390 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
1c3a0 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
1c3b0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
1c3c0 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
1c3d0 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
1c3e0 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
1c3f0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
1c400 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
1c410 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1c420 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
1c430 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
1c440 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
1c450 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1c460 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
1c470 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1c480 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
1c490 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1c4a0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
1c4b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c4c0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1c4d0 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
1c4e0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
1c4f0 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e  ways 0 for unix.
1c500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1c510 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
1c520 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
1c530 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
1c540 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c550 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1c560 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
1c570 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c580 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
1c590 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
1c5a0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
1c5b0 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
1c5c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
1c5d0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
1c5e0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
1c5f0 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
1c600 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
1c610 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
1c620 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
1c630 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
1c640 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
1c650 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
1c660 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
1c670 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1c680 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
1c690 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1c6a0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
1c6b0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
1c6c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1c6d0 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
1c6e0 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
1c6f0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
1c700 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
1c710 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
1c720 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
1c730 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
1c740 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
1c750 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
1c760 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
1c770 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
1c780 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
1c790 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
1c7a0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
1c7b0 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
1c7c0 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
1c7d0 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
1c7e0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1c7f0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
1c800 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1c810 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1c820 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
1c830 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1c840 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
1c850 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
1c860 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
1c870 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1c880 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
1c890 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
1c8a0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
1c8b0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1c8c0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
1c8d0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
1c8e0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
1c8f0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1c900 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
1c910 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
1c920 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
1c930 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
1c940 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1c950 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1c960 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
1c970 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1c980 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
1c990 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
1c9a0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1c9b0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1c9c0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c9d0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1c9e0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1c9f0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
1ca00 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
1ca10 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1ca20 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
1ca30 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
1ca40 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
1ca50 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
1ca60 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
1ca70 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
1ca80 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
1ca90 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
1caa0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1cab0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1cac0 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
1cad0 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
1cb00 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
1cb10 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
1cb20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1cb30 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
1cb40 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
1cb50 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
1cb60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1cb70 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
1cb80 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
1cb90 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
1cba0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
1cbb0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
1cbc0 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1cbd0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1cbe0 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1cbf0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1cc00 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1cc30 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1cc40 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1cc50 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1cc60 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1cc70 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1cc80 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1cc90 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1cca0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1ccb0 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1ccc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1ccd0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1cce0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1ccf0 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1cd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1cd10 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1cd20 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1cd30 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1cd40 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1cd50 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1cd60 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1cd70 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1cd80 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1cd90 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1cda0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1cdb0 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1cdc0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1cdd0 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1cde0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1cdf0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1ce00 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1ce10 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1ce20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1ce30 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1ce40 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1ce50 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1ce60 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1ce70 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1ce80 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1ce90 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1cea0 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1ceb0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1cec0 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1ced0 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1cee0 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1cef0 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1cf00 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1cf10 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1cf20 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1cf30 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1cf40 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1cf50 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1cf60 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1cf70 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1cf80 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1cf90 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1cfa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1cfb0 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1cfc0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1cfd0 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
1cfe0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1cff0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1d000 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1d010 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1d020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d030 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1d040 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1d050 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1d060 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d080 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1d090 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1d0a0 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
1d0b0 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1d0c0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1d0d0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1d0e0 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
1d0f0 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
1d100 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
1d110 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
1d120 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
1d130 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
1d140 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
1d150 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
1d160 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
1d170 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
1d180 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
1d190 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1d1a0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
1d1b0 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
1d1c0 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
1d1d0 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
1d1e0 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
1d1f0 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
1d200 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
1d210 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
1d220 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1d230 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
1d240 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  emLock(.  unixSh
1d250 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c  mNode *pShmNode,
1d260 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
1d270 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
1d280 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1d290 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
1d2a0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Type,          /
1d2b0 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c  * F_UNLCK, F_RDL
1d2c0 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a  CK, or F_WRLCK *
1d2d0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1d2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1d2f0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
1d300 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f  locking range */
1d310 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
1d320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d330 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1d340 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
1d350 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
1d360 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
1d370 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
1d380 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1d390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d3a0 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  OK;   /* Result 
1d3b0 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
1d3c0 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
1d3d0 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
1d3e0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1d3f0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1d400 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1d410 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d420 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
1d430 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d  ->mutex) || pShm
1d440 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  Node->nRef==0 );
1d450 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
1d460 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
1d470 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
1d480 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
1d490 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
1d4a0 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
1d4b0 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
1d4c0 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
1d4d0 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
1d4e0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1d4f0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1d500 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
1d510 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1d520 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
1d530 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  eters */.    mem
1d540 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
1d550 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74  f(f));.    f.l_t
1d560 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
1d570 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
1d580 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
1d590 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
1d5a0 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
1d5b0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ;..    rc = osFc
1d5c0 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
1d5d0 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20   F_SETLK, &f);. 
1d5e0 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31     rc = (rc!=(-1
1d5f0 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
1d600 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d610 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1d620 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
1d630 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
1d640 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
1d650 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d660 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20  .  { u16 mask;. 
1d670 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1d680 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20  OCK "));.  mask 
1d690 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
1d6a0 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
1d6b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d6c0 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
1d6d0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
1d6e0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d6f0 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
1d700 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
1d710 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1d720 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1d730 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
1d740 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1d750 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
1d760 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
1d770 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1d780 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
1d790 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d7a0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d7b0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1d7c0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d7d0 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
1d7e0 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
1d7f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
1d800 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
1d810 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1d820 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
1d830 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d840 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d850 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
1d860 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
1d870 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
1d880 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
1d890 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
1d8a0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
1d8b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1d8c0 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
1d8d0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
1d8e0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
1d8f0 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
1d900 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
1d910 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
1d920 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d930 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
1d940 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
1d950 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d960 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
1d970 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
1d980 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
1d990 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
1d9a0 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
1d9b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
1d9c0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1d9d0 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
1d9e0 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
1d9f0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1da00 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a  ;        .}.../*
1da10 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
1da20 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
1da30 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
1da40 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
1da50 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1da60 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1da70 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1da80 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1da90 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1daa0 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1dab0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1dac0 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1dad0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
1dae0 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
1daf0 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
1db00 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
1db10 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
1db20 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
1db30 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
1db40 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
1db50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
1db60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1db70 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
1db80 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  node );.    sqli
1db90 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
1dba0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f  ->mutex);.    fo
1dbb0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
1dbc0 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
1dbd0 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
1dbe0 20 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70          munmap(p
1dbf0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70  ->apRegion[i], p
1dc00 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->szRegion);.   
1dc10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dc20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1dc30 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a  ->apRegion[i]);.
1dc40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1dc50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1dc60 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->apRegion);.   
1dc70 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
1dc80 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
1dc90 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f  se(pFd, p->h, __
1dca0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70  LINE__);.      p
1dcb0 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ->h = -1;.    }.
1dcc0 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
1dcd0 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
1dce0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1dcf0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
1dd00 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  pen a shared-mem
1dd10 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
1dd20 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61  ted with open da
1dd30 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
1dd40 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72  d.  .** This par
1dd50 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e  ticular implemen
1dd60 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70  tation uses mmap
1dd70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
1dd80 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74   The file used t
1dd90 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72  o implement shar
1dda0 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20  ed-memory is in 
1ddb0 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
1ddc0 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65  ry.** as the ope
1ddd0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1dde0 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
1ddf0 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65   name as the ope
1de00 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  n database.** fi
1de10 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68  le with the "-sh
1de20 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e  m" suffix added.
1de30 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
1de40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1de50 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65  ile.** is "/home
1de60 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
1de70 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  " then the file 
1de80 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
1de90 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66  and mmapped.** f
1dea0 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
1deb0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
1dec0 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
1ded0 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a  fig.db-shm".  .*
1dee0 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70  *.** Another app
1def0 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75  roach to is to u
1df00 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76  se files in /dev
1df10 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70  /shm or /dev/tmp
1df20 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f   or an.** some o
1df30 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74  ther tmpfs mount
1df40 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20  . But if a file 
1df50 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  in a different d
1df60 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d  irectory.** from
1df70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1df80 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
1df90 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73   differing acces
1dfa0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  s permissions.**
1dfb0 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d   or a chroot() m
1dfc0 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64  ight cause two d
1dfd0 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
1dfe0 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  es on the same.*
1dff0 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e  * database to en
1e000 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65  d up using diffe
1e010 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73  rent files for s
1e020 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a  hared memory - .
1e030 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  ** meaning that 
1e040 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75  their memory wou
1e050 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  ld not really be
1e060 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74   shared - result
1e070 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61  ing.** in databa
1e080 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
1e090 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68  Nevertheless, th
1e0a0 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73  is tmpfs file us
1e0b0 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e  age.** can be en
1e0c0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
1e0d0 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51  -time using -DSQ
1e0e0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1e0f0 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a  RY="/dev/shm".**
1e100 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65   or the equivale
1e110 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  nt.  The use of 
1e120 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  the SQLITE_SHM_D
1e130 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
1e140 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20  -time.** option 
1e150 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e  results in an in
1e160 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64  compatible build
1e170 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69   of SQLite;  bui
1e180 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a  lds of SQLite.**
1e190 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65   that with diffe
1e1a0 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ring SQLITE_SHM_
1e1b0 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e  DIRECTORY settin
1e1c0 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  gs attempt to us
1e1d0 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61  e the.** same da
1e1e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
1e1f0 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61  he same time, da
1e200 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1e210 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  n will likely.**
1e220 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c   result. The SQL
1e230 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1e240 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  Y compile-time o
1e250 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ption is conside
1e260 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72  red.** "unsuppor
1e270 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20  ted" and may go 
1e280 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65  away in a future
1e290 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e   SQLite release.
1e2a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
1e2b0 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
1e2c0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
1e2d0 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
1e2e0 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
1e2f0 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
1e300 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
1e310 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
1e320 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
1e330 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
1e340 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
1e350 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
1e360 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
1e370 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  der cleared..**.
1e380 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  ** If the origin
1e390 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1e3a0 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e   (pDbFd) is usin
1e3b0 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c  g the "unix-excl
1e3c0 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65  " VFS.** that me
1e3d0 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c  ans that an excl
1e3e0 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65  usive lock is he
1e3f0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1e400 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  se file and.** t
1e410 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
1e420 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20  cesses are able 
1e430 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
1e440 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1e450 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c  In.** that case,
1e460 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c   we do not reall
1e470 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65  y need shared me
1e480 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64  mory.  No shared
1e490 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20   memory.** file 
1e4a0 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
1e4b0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
1e4c0 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64  ill be simulated
1e4d0 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72   with heap memor
1e4e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1e4f0 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
1e500 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
1e510 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
1e520 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
1e530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e540 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1e550 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
1e560 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1e570 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
1e580 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1e590 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1e5a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1e5d0 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
1e5e0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1e5f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
1e600 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
1e610 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  ar *zShmFilename
1e620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e630 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1e640 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a  e used for SHM *
1e650 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65  /.  int nShmFile
1e660 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1e670 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1e680 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20  he SHM filename 
1e690 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
1e6a0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
1e6b0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
1e6c0 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  xShm object. */.
1e6d0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
1e6e0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
1e6f0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
1e700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1e710 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
1e720 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
1e730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
1e740 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
1e750 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1e760 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
1e770 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
1e780 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
1e790 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
1e7a0 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
1e7b0 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
1e7c0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
1e7d0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
1e7e0 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
1e7f0 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
1e800 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
1e810 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
1e820 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
1e830 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
1e840 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e860 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
1e870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1e880 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  /..    /* Call f
1e890 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
1e8a0 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
1e8b0 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
1e8c0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
1e8d0 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
1e8e0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
1e8f0 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
1e900 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
1e910 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
1e920 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
1e930 69 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74  issions. The act
1e940 75 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ual permissions 
1e950 74 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61  the file is crea
1e960 74 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ted.    ** with 
1e970 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74  are subject to t
1e980 68 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b  he current umask
1e990 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
1e9a0 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
1e9b0 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61  (pDbFd->h, &sSta
1e9c0 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50  t) && pInode->bP
1e9d0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
1e9e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e9f0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1ea00 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1ea10 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1ea20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
1ea30 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
1ea40 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
1ea50 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
1ea60 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30  _DIRECTORY) + 30
1ea70 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
1ea80 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28  Filename = 5 + (
1ea90 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64  int)strlen(pDbFd
1eaa0 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  ->zPath);.#endif
1eab0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
1eac0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1ead0 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
1eae0 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ) + nShmFilename
1eaf0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   );.    if( pShm
1eb00 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
1eb10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1eb20 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1eb30 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1eb40 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53   }.    memset(pS
1eb50 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  hmNode, 0, sizeo
1eb60 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20  f(*pShmNode));. 
1eb70 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20     zShmFilename 
1eb80 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
1eb90 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
1eba0 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66  pShmNode[1];.#if
1ebb0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
1ebc0 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c  IRECTORY.    sql
1ebd0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53  ite3_snprintf(nS
1ebe0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d  hmFilename, zShm
1ebf0 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20  Filename, .     
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1ec20 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68  TORY "/sqlite-sh
1ec30 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20  m-%x-%x",.      
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ec50 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f  u32)sStat.st_ino
1ec60 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f  , (u32)sStat.st_
1ec70 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  dev);.#else.    
1ec80 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1ec90 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
1eca0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ShmFilename, "%s
1ecb0 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
1ecc0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
1ecd0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
1ece0 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46  Fd->zPath, zShmF
1ecf0 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
1ed00 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
1ed10 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
1ed20 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1ed30 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
1ed40 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
1ed50 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
1ed60 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
1ed70 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
1ed80 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1ed90 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
1eda0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1edb0 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
1edc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1edd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1ede0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1edf0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
1ee00 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
1ee10 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
1ee20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
1ee30 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
1ee40 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57  mFilename, O_RDW
1ee50 52 7c 4f 5f 43 52 45 41 54 2c 0a 20 20 20 20 20  R|O_CREAT,.     
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 20 20 20 20 20 28 73 53 74 61 74            (sStat
1ee80 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29  .st_mode & 0777)
1ee90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
1eea0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
1eeb0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1eec0 20 2a 7a 52 4f 3b 0a 20 20 20 20 20 20 20 20 7a   *zRO;.        z
1eed0 52 4f 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  RO = sqlite3_uri
1eee0 5f 70 61 72 61 6d 65 74 65 72 28 70 44 62 46 64  _parameter(pDbFd
1eef0 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e  ->zPath, "readon
1ef00 6c 79 5f 73 68 6d 22 29 3b 0a 20 20 20 20 20 20  ly_shm");.      
1ef10 20 20 69 66 28 20 7a 52 4f 20 26 26 20 73 71 6c    if( zRO && sql
1ef20 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
1ef30 52 4f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RO) ){.         
1ef40 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
1ef50 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46  obust_open(zShmF
1ef60 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  ilename, O_RDONL
1ef70 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 20 20 20 20 20 20 20 28 73 53 74 61 74 2e 73 74         (sStat.st
1efa0 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a  _mode & 0777));.
1efb0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
1efc0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d  de->isReadonly =
1efd0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
1efe0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
1eff0 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
1f000 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
1f010 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
1f020 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
1f030 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  en", zShmFilenam
1f040 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
1f050 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1f060 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f070 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43   }.  .      /* C
1f080 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1f090 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
1f0a0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
1f0b0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
1f0c0 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
1f0d0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1f0e0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1f0f0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1f100 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1f110 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
1f120 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1f130 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
1f140 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
1f150 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1f160 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
1f170 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
1f180 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
1f190 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
1f1a0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1f1b0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
1f1c0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
1f1d0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
1f1e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f1f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f210 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
1f220 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1f230 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  de, F_RDLCK, UNI
1f240 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
1f250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f260 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1f270 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
1f280 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
1f290 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
1f2a0 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
1f2b0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
1f2c0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
1f2d0 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
1f2e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
1f2f0 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
1f300 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
1f310 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
1f320 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
1f330 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e  ->pShm = p;.  un
1f340 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1f350 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
1f360 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
1f370 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
1f380 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
1f390 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
1f3a0 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75  e cover of the u
1f3b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
1f3c0 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1f3d0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1f3e0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1f3f0 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20  unixShm) object 
1f400 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
1f410 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
1f420 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
1f430 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
1f440 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
1f450 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
1f460 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
1f470 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
1f480 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
1f490 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
1f4a0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1f4b0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1f4c0 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
1f4d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1f4e0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1f4f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
1f500 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
1f510 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
1f520 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1f530 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f540 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1f550 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1f560 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1f570 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
1f580 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
1f590 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69  _open_err:.  uni
1f5a0 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
1f5b0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ;       /* This 
1f5c0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1f5d0 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1f5e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1f5f0 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  e(p);.  unixLeav
1f600 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1f610 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f620 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f630 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1f640 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
1f650 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
1f660 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
1f670 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
1f680 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1f690 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
1f6a0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1f6b0 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
1f6c0 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
1f6d0 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
1f6e0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1f6f0 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
1f700 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
1f710 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1f720 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
1f730 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f740 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
1f750 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
1f760 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1f770 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72   the bExtend par
1f780 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
1f790 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
1f7a0 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
1f7b0 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
1f7c0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
1f7d0 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
1f7e0 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
1f7f0 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
1f800 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
1f810 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
1f820 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1f830 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
1f840 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20   .** bExtend is 
1f850 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
1f860 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1f870 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1f880 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
1f890 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1f8a0 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1f8b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1f8c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1f8d0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1f8e0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1f8f0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1f900 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1f910 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1f920 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1f930 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1f940 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1f950 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
1f960 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
1f970 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1f980 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
1f990 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
1f9a0 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
1f9b0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1f9c0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1f9d0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70  c int unixShmMap
1f9e0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1f9f0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
1fa00 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
1fa10 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
1fa20 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
1fa30 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1fa40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1fa50 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
1fa60 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
1fa70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fa80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1fa90 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1faa0 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20  bExtend,        
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fac0 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
1fad0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
1fae0 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
1faf0 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
1fb00 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
1fb10 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
1fb20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1fb30 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
1fb40 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
1fb50 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
1fb60 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
1fb70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fb80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
1fb90 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1fba0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1fbb0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
1fbc0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
1fbd0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
1fbe0 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
1fbf0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1fc00 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
1fc10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1fc20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1fc30 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
1fc40 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
1fc50 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
1fc60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1fc70 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1fc80 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
1fc90 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
1fca0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
1fcb0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1fcc0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1fcd0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
1fce0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
1fcf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
1fd00 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
1fd10 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
1fd20 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
1fd30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
1fd40 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
1fd50 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
1fd60 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
1fd70 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1fd80 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
1fd90 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
1fda0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
1fdb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1fdc0 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
1fdd0 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
1fde0 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
1fdf0 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
1fe00 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
1fe10 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1fe20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
1fe30 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
1fe40 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
1fe50 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
1fe60 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1fe70 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
1fe80 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1fe90 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1fea0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1feb0 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
1fec0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1fed0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
1fee0 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
1fef0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ff00 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
1ff10 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
1ff20 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
1ff30 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
1ff40 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1ff50 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
1ff60 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
1ff70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1ff80 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
1ff90 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
1ffa0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ffb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
1ffc0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
1ffd0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1ffe0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
1fff0 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
20000 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
20010 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
20020 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
20030 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
20040 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
20050 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
20060 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
20070 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
20080 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
20090 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
200a0 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ned..        **.
200b0 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72          ** Alter
200c0 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78  natively, if bEx
200d0 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73  tend is true, us
200e0 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
200f0 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
20100 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
20110 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
20120 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20130 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
20140 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  d ) goto shmpage
20150 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66  _out;.        if
20160 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
20170 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
20180 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
20190 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
201a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
201b0 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72  RR_SHMSIZE, "ftr
201c0 75 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20  uncate",.       
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
201f0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
20200 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
20210 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
20220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20230 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
20240 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
20250 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
20260 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
20270 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
20280 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   apNew = (char *
20290 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
202a0 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
202b0 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28  ode->apRegion, (
202c0 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
202d0 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
202e0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
202f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20300 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20310 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
20320 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
20330 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
20340 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
20350 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f      while(pShmNo
20360 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
20370 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69  gion){.      voi
20380 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  d *pMem;.      i
20390 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
203a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 ){.        pMe
203b0 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65  m = mmap(0, szRe
203c0 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  gion,.          
203d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
203e0 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45  adonly ? PROT_RE
203f0 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50  AD : PROT_READ|P
20400 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
20410 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
20420 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ED, pShmNode->h,
20430 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
20440 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20 20  on*szRegion.    
20450 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
20460 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49  f( pMem==MAP_FAI
20470 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LED ){.         
20480 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
20490 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
204a0 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20  SHMMAP, "mmap", 
204b0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
204c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
204d0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
204e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
204f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20500 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
20510 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29  malloc(szRegion)
20520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
20530 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
20540 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
20550 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
20560 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
20570 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20580 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c      memset(pMem,
20590 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   0, szRegion);. 
205a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
205b0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
205c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
205d0 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20  n] = pMem;.     
205e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
205f0 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
20600 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
20610 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
20620 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
20630 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e  .    *pp = pShmN
20640 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52  ode->apRegion[iR
20650 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
20660 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
20670 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
20680 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20  ->isReadonly && 
20690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
206a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
206b0 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ONLY;.  sqlite3_
206c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
206d0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
206e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
206f0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
20700 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
20710 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
20720 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
20730 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
20740 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
20750 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
20760 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
20770 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
20780 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
20790 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
207a0 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
207b0 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
207c0 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
207d0 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
207e0 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
207f0 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
20800 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
20810 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
20820 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
20830 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
20840 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
20850 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
20860 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
20870 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
20880 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
20890 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
208a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
208b0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
208d0 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
208e0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
208f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
20900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20910 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20920 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
20930 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
20940 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
20950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
20960 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
20970 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
20980 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
20990 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
209a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
209b0 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
209c0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
209d0 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
209e0 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
209f0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
20a00 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
20a10 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
20a20 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
20a50 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
20a60 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
20a70 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
20a80 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
20a90 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
20aa0 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
20ab0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20ac0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
20ad0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
20ae0 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
20af0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
20b20 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
20b30 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
20b40 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
20b50 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
20b60 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
20b70 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
20b80 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
20b90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
20ba0 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
20bb0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
20bc0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
20bd0 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
20be0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
20bf0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
20c00 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
20c10 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
20c20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
20c30 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
20c40 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
20c50 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
20c60 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
20c70 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
20c80 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
20c90 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
20ca0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
20cb0 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
20cc0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
20cd0 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
20ce0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
20cf0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20d00 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
20d10 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
20d20 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
20d30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
20d40 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
20d50 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
20d60 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
20d70 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
20d80 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
20d90 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
20da0 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
20db0 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
20dc0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
20dd0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
20de0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
20df0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
20e00 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
20e10 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
20e20 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
20e30 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
20e40 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
20e50 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
20e60 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
20e70 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
20e80 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
20e90 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
20ea0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
20eb0 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
20ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
20ed0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
20ee0 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
20ef0 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
20f00 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
20f10 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
20f20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
20f30 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
20f40 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
20f50 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
20f60 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
20f70 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
20f80 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
20f90 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f  Node, F_UNLCK, o
20fa0 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
20fb0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
20fc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
20fd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
20fe0 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
20ff0 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
21000 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
21020 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
21030 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
21040 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
21050 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
21060 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
21070 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
21080 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
21090 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
210a0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
210b0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
210c0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
210d0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
210e0 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
210f0 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
21100 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
21110 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
21120 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
21130 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
21140 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
21150 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
21160 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
21170 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
21180 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
21190 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
211a0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
211b0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
211c0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
211d0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
211e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
211f0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
21200 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
21210 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
21220 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
21230 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
21240 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
21250 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
21260 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
21270 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
21280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21290 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
212a0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
212b0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
212c0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
212d0 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
212e0 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
212f0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
21300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
21310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
21320 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
21330 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
21340 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
21350 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21370 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
21380 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
21390 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
213a0 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
213b0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
213c0 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
213d0 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
213e0 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
213f0 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
21400 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
21410 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
21420 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
21430 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
21440 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
21450 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
21460 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
21470 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
21480 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
21490 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
214a0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
214b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
214c0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
214d0 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
214e0 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
214f0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
21500 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
21510 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
21520 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
21530 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
21540 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
21550 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21570 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
21580 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
21590 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
215a0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
215b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
215c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
215d0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
215e0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
215f0 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
21600 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
21610 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
21620 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
21630 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
21640 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
21650 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
21660 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
21670 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
21680 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
21690 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69      p->id, getpi
216a0 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  d(), p->sharedMa
216b0 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29  sk, p->exclMask)
216c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
216d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
216e0 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
216f0 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
21700 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
21710 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
21720 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
21730 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
21740 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
21750 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
21760 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
21770 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
21780 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
21790 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
217a0 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  ixShmBarrier(.  
217b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
217e0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
217f0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
21800 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
21810 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45  TER(fd);.  unixE
21820 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75  nterMutex();.  u
21830 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
21840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
21850 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
21860 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
21870 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
21880 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
21890 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
218a0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
218b0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
218c0 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
218d0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
218e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
218f0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
21900 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
21910 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
21920 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
21930 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
21940 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
21950 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
21960 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
21970 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
21980 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
21990 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
219a0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
219b0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
219c0 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219e0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
219f0 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
21a00 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
21a10 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
21a20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
21a30 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
21a40 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
21a50 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a70 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
21a80 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
21a90 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
21aa0 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
21ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21ac0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
21ad0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
21ae0 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
21af0 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
21b00 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
21b10 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
21b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
21b30 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
21b40 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
21b50 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
21b60 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
21b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
21b80 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
21b90 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
21ba0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
21bb0 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
21bc0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
21bd0 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
21be0 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
21bf0 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
21c00 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
21c10 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
21c20 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
21c30 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
21c40 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
21c50 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
21c60 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
21c70 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
21c80 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
21c90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
21ca0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
21cb0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
21cc0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
21cd0 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
21ce0 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
21cf0 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
21d00 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
21d10 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
21d20 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
21d30 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
21d40 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
21d50 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
21d60 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
21d70 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
21d80 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
21d90 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
21da0 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
21db0 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
21dc0 30 20 29 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e  0 ) unlink(pShmN
21dd0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
21de0 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67  .    unixShmPurg
21df0 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20  e(pDbFd);.  }.  
21e00 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
21e10 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
21e20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65  TE_OK;.}...#else
21e30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
21e40 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
21e50 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20  ine unixShmLock 
21e60 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
21e70 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  ixShmBarrier 0.#
21e80 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55   define unixShmU
21e90 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
21ea0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
21eb0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
21ec0 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
21ed0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
21ee0 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
21ef0 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
21f00 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
21f10 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
21f20 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
21f30 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
21f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f50 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
21f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21fa0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69  /../*.** This di
21fb0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
21fc0 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73  definitions of s
21fd0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
21fe0 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a  s objects that.*
21ff0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69  * implement vari
22000 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ous file locking
22010 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74   strategies.  It
22020 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64   also contains d
22030 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66  efinitions.** of
22040 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
22050 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66  ons.  A finder-f
22060 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
22070 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70  to locate the ap
22080 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c  propriate.** sql
22090 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
220a0 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72  object for a par
220b0 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
220c0 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70   file.  The pApp
220d0 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  Data.** field of
220e0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
220f0 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65   VFS objects are
22100 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
22110 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  be pointers to.*
22120 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69  * the correct fi
22130 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f  nder-function fo
22140 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a  r that VFS..**.*
22150 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75  * Most finder fu
22160 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61  nctions return a
22170 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
22180 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
22190 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
221a0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65  .  The only inte
221b0 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66  resting finder-f
221c0 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c  unction is autol
221d0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69  ockIoFinder, whi
221e0 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74  ch.** looks at t
221f0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79  he filesystem ty
22200 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20  pe and tries to 
22210 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c  guess the best l
22220 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65  ocking.** strate
22230 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a  gy from that..**
22240 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66  .** For finder-f
22250 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  untion F, two ob
22260 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
22270 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
22280 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
22290 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
222a0 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
222b0 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
222c0 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
222d0 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
222e0 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
222f0 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
22300 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
22310 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
22320 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
22330 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
22340 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
22350 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
22360 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
22370 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
22380 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
22390 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
223a0 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
223b0 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
223c0 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
223d0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
223e0 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
223f0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
22400 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
22410 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
22420 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
22430 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
22440 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
22450 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
22460 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
22470 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
22480 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
22490 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
224a0 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
224b0 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
224c0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
224d0 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
224e0 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
224f0 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
22500 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
22510 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
22520 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
22530 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48  ODS(FINDER, METH
22540 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f  OD, VERSION, CLO
22550 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
22560 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c  , CKLOCK)      \
22570 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
22580 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
22590 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
225c0 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
225e0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
22610 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22630 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22650 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
22660 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22680 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
226b0 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
226c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
226d0 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
22700 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
22710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
22720 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
22750 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
22760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
22770 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
227a0 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
227b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
227c0 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227e0 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
227f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22800 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
22810 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
22840 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
22850 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
22860 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
22890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
228a0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
228b0 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228d0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
228e0 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
228f0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
22900 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22920 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
22930 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
22940 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
22950 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22970 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
22980 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
22990 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
229a0 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229c0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70   \.   unixShmMap
229d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
229e0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
22a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22a30 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22a60 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
22a70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
22a80 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
22a90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22ab0 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20     unixShmUnmap 
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ad0 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
22b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
22b50 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
22b60 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46  e3_io_methods *F
22b70 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73  INDER##Impl(cons
22b80 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46  t char *z, unixF
22b90 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55  ile *p){   \.  U
22ba0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
22bb0 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  z); UNUSED_PARAM
22bc0 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20  ETER(p);        
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22be0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65            \.  re
22bf0 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20  turn &METHOD;   
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20           \.}    
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c80 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
22c90 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
22ca0 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e  o_methods *(*con
22cb0 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74  st FINDER)(const
22cc0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20   char*,unixFile 
22cd0 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46  *p)    \.    = F
22ce0 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a  INDER##Impl;../*
22cf0 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c  .** Here are all
22d00 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
22d10 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
22d20 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ts for each of t
22d30 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74  he.** locking st
22d40 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74  rategies.  Funct
22d50 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e  ions that return
22d60 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
22d70 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72  se methods.** ar
22d80 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a  e also created..
22d90 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  */.IOMETHODS(.  
22da0 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20  posixIoFinder,  
22db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
22dc0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
22dd0 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65  e */.  posixIoMe
22de0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
22df0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
22e00 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
22e10 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20  me */.  2,      
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
22e40 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ry is enabled */
22e50 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e70 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
22e80 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ea0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
22eb0 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20    unixUnlock,   
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22ed0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
22ee0 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
22ef0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20  rvedLock     /* 
22f00 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
22f10 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
22f20 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
22f30 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
22f40 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
22f50 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
22f60 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
22f70 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
22f80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
22f90 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
22fa0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22fc0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
22fd0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
22fe0 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
22ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
23000 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
23010 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
23020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
23030 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
23040 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
23050 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
23060 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23070 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
23080 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68  vedLock   /* xCh
23090 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
230a0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
230b0 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
230c0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
230d0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
230e0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
230f0 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
23100 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
23110 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23120 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
23130 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
23140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
23150 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
23160 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
23170 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
23180 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
23190 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
231a0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
231b0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
231c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
231d0 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
231e0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
231f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
23200 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
23210 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b  dLock  /* xCheck
23220 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
23230 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
23240 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
23250 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
23260 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
23270 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
23280 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
23290 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
232a0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
232b0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
232c0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
232d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
232e0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23300 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
23310 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
23320 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
23330 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
23340 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
23350 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
23360 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23370 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
23380 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
23390 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
233a0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
233b0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
233c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
233d0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
233e0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
233f0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
23400 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d  f OS_VXWORKS.IOM
23410 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46  ETHODS(.  semIoF
23420 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
23430 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
23440 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
23450 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20   semIoMethods,  
23460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
23470 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23480 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
23490 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
234a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
234b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
234c0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65  disabled */.  se
234d0 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  mClose,         
234e0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
234f0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  e method */.  se
23500 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
23510 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
23520 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
23530 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
23540 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
23550 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
23560 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
23570 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
23580 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
23590 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
235a0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
235b0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
235c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
235d0 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
235e0 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
235f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23600 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
23610 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
23620 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
23630 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
23640 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
23650 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
23680 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
23690 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  led */.  afpClos
236a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
236b0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
236c0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
236d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
236e0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
236f0 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
23700 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23710 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
23720 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
23730 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
23740 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
23750 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
23760 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  */.).#endif../*.
23770 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
23780 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61  king method is a
23790 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20   "super-method" 
237a0 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
237b0 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65  t it.** opens se
237c0 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73  condary file des
237d0 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65  criptors for the
237e0 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20   conch and lock 
237f0 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20  files and.** it 
23800 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d  uses proxy, dot-
23810 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66  file, AFP, and f
23820 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d  lock() locking m
23830 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a  ethods on those.
23840 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ** secondary fil
23850 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  es.  For this re
23860 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
23870 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
23880 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b  ts.** proxy lock
23890 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d  ing is located m
238a0 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e  uch further down
238b0 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42   in the file.  B
238c0 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f  ut we need.** to
238d0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65   go ahead and de
238e0 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33  fine the sqlite3
238f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20  _io_methods and 
23900 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a  finder function.
23910 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ** for proxy loc
23920 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77  king here.  So w
23930 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
23940 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  e the I/O method
23950 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
23960 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
23970 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23980 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74  CKING_STYLE.stat
23990 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73  ic int proxyClos
239a0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e(sqlite3_file*)
239b0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
239c0 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
239d0 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
239e0 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f  ic int proxyUnlo
239f0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
23a00 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
23a10 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
23a20 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
23a30 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a  3_file*, int*);.
23a40 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f  IOMETHODS(.  pro
23a50 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  xyIoFinder,     
23a60 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
23a70 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
23a80 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f  /.  proxyIoMetho
23a90 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
23aa0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23ab0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
23ac0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ae0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
23af0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
23b00 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20   proxyClose,    
23b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
23b20 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
23b30 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20   proxyLock,     
23b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
23b50 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23b60 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20  proxyUnlock,    
23b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23b80 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
23b90 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
23ba0 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
23bb0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23bc0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
23bd0 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b  dif../* nfs lock
23be0 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64  d on OSX 10.3+ d
23bf0 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69  oesn't clear wri
23c00 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20  te locks when a 
23c10 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
23c20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
23c30 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
23c40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
23c50 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
23c60 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64  ODS(.  nfsIoFind
23c70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
23c80 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
23c90 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
23ca0 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fsIoMethods,    
23cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
23cc0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23cd0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
23ce0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23d00 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
23d10 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e  disabled */.  un
23d20 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
23d30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23d40 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
23d50 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
23d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
23d70 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
23d80 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fsUnlock,       
23d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23da0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
23db0 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
23dc0 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
23dd0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23de0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
23df0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
23e00 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
23e10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23e20 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
23e30 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
23e40 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
23e50 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
23e60 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
23e70 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
23e80 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
23e90 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
23ea0 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
23eb0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
23ec0 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
23ed0 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
23ee0 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
23ef0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
23f00 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a  or MacOSX only..
23f10 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
23f20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23f30 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ds *autolockIoFi
23f40 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
23f50 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
23f60 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
23f70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23f80 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
23f90 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
23fa0 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  /* open file obj
23fb0 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61  ect for the data
23fc0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  base file */.){.
23fd0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
23fe0 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
23ff0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
24000 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20  zFilesystem;    
24010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
24020 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d  esystem type nam
24030 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73  e */.    const s
24040 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24050 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f  s *pMethods;   /
24060 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  * Appropriate lo
24070 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a  cking method */.
24080 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20    } aMap[] = {. 
24090 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26     { "hfs",    &
240a0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
240b0 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20  ,.    { "ufs",  
240c0 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
240d0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66  s },.    { "afpf
240e0 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
240f0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62  ds },.    { "smb
24100 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
24110 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65  ods },.    { "we
24120 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f  bdav", &nolockIo
24130 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
24140 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69   0, 0 }.  };.  i
24150 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
24160 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
24170 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
24180 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
24190 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
241a0 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
241b0 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
241c0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
241d0 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
241e0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
241f0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
24200 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
24210 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
24220 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
24230 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c    if( statfs(fil
24240 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  ePath, &fsInfo) 
24250 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28  != -1 ){.    if(
24260 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20   fsInfo.f_flags 
24270 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a  & MNT_RDONLY ){.
24280 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f        return &no
24290 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
242a0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
242b0 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  ; aMap[i].zFiles
242c0 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ystem; i++){.   
242d0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
242e0 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
242f0 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  e, aMap[i].zFile
24300 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20  system)==0 ){.  
24310 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61        return aMa
24320 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20  p[i].pMethods;. 
24330 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24340 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63  ..  /* Default c
24350 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d  ase. Handles, am
24360 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e  ongst others, "n
24370 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62  fs"..  ** Test b
24380 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75  yte-range lock u
24390 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66  sing fcntl(). If
243a0 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65   the call succee
243b0 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ds, .  ** assume
243c0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73   that the file-s
243d0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50  ystem supports P
243e0 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
243f0 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  . .  */.  lockIn
24400 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
24410 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
24420 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
24430 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
24440 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
24450 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
24460 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
24470 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
24480 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
24490 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74  1 ) {.    if( st
244a0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
244b0 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29  typename, "nfs")
244c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
244d0 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64  urn &nfsIoMethod
244e0 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  s;.    } else {.
244f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f        return &po
24500 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
24510 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
24520 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b   return &dotlock
24530 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
24540 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
24550 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
24560 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
24570 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
24580 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
24590 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
245a0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
245b0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
245c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
245d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
245e0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
245f0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  if OS_VXWORKS &&
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 56 58 57 6f 72 6b 73 20 6f 6e 6c 79  for VXWorks only
24700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
24710 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
24720 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
24730 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
24740 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
24750 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
24760 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
24770 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
24780 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
24790 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69    /* the open fi
247a0 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  le object */.){.
247b0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
247c0 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
247d0 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
247e0 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
247f0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
24800 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
24810 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
24820 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
24830 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
24840 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
24850 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
24860 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
24870 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20  }..  /* Test if 
24880 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f  fcntl() is suppo
24890 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53  rted and use POS
248a0 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a  IX style locks..
248b0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66    ** Otherwise f
248c0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
248d0 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
248e0 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c  method..  */.  l
248f0 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
24900 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
24910 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
24920 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
24930 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
24940 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
24950 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
24960 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
24970 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
24980 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
24990 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
249a0 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
249b0 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49      return &semI
249c0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
249d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
249e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
249f0 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
24a00 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
24a10 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
24a20 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
24a30 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
24a40 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
24a50 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  KS && SQLITE_ENA
24a60 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24a70 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61  E */../*.** An a
24a80 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72  bstract type for
24a90 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
24aa0 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  IO method finder
24ab0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79   function:.*/.ty
24ac0 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69  pedef const sqli
24ad0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
24ae0 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63  (*finder_type)(c
24af0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
24b00 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ile*);.../******
24b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b50 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
24b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b70 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
24b80 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
24b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ba0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
24bb0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
24bc0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
24bd0 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
24be0 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
24bf0 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
24c00 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
24c10 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
24c20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
24c30 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
24c40 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
24c50 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
24c60 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
24c70 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
24c80 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24c90 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
24ca0 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
24cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
24cc0 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
24cd0 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
24ce0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
24cf0 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20   dirfd,         
24d00 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
24d10 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
24d20 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
24d30 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
24d40 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
24d50 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
24d60 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
24d70 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
24d80 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
24d90 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
24da0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  ened */.  int no
24db0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
24dc0 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e    /* Omit lockin
24dd0 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  g if true */.  i
24de0 6e 74 20 69 73 44 65 6c 65 74 65 2c 20 20 20 20  nt isDelete,    
24df0 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
24e00 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
24e10 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 61  e */.  int isRea
24e20 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 2f  dOnly          /
24e30 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 66 69  * True if the fi
24e40 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
24e50 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20 63  d-only */.){.  c
24e60 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
24e70 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
24e80 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
24e90 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
24ea0 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
24eb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24ec0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
24ed0 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
24ee0 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74  );..  /* Paramet
24ef0 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f  er isDelete is o
24f00 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f  nly used on vxwo
24f10 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68 69  rks. Express thi
24f20 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20  s explicitly .  
24f30 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76 65  ** here to preve
24f40 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  nt compiler warn
24f50 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65  ings about unuse
24f60 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  d parameters..  
24f70 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
24f80 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b  METER(isDelete);
24f90 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74  ..  /* Usually t
24fa0 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d  he path zFilenam
24fb0 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
24fc0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
24fd0 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78  ame. The.  ** ex
24fe0 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20  ception is when 
24ff0 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78  opening the prox
25000 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69  y "conch" file i
25010 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20  n builds that.  
25020 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73  ** include the s
25030 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63  pecial Apple loc
25040 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a  king styles..  *
25050 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
25060 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
25070 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25080 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74  G_STYLE.  assert
25090 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
250a0 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
250b0 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73  '/' .    || pVfs
250c0 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69  ->pAppData==(voi
250d0 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
250e0 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20  nder );.#else.  
250f0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
25100 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
25110 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e  e[0]=='/' );.#en
25120 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
25130 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
25140 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
25150 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
25160 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66   h;.  pNew->dirf
25170 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 70 4e 65  d = dirfd;.  pNe
25180 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
25190 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d 63  name;.  if( memc
251a0 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
251b0 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d  unix-excl",10)==
251c0 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
251d0 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58 46  trlFlags = UNIXF
251e0 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c 73  ILE_EXCL;.  }els
251f0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  e{.    pNew->ctr
25200 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a  lFlags = 0;.  }.
25210 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c 79    if( isReadOnly
25220 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
25230 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
25240 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  ILE_RDONLY;.  }.
25250 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
25260 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
25270 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
25280 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
25290 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
252a0 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31  {.    noLock = 1
252b0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
252c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  E_NOMEM;.  }.#en
252d0 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  dif..  if( noLoc
252e0 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  k ){.    pLockin
252f0 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b  gStyle = &nolock
25300 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
25310 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67  se{.    pLocking
25320 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64  Style = (**(find
25330 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
25340 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
25350 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53  me, pNew);.#if S
25360 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
25370 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f  KING_STYLE.    /
25380 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d  * Cache zFilenam
25390 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e in the locking
253a0 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e   context (AFP an
253b0 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69  d dotlock overri
253c0 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  de) for.    ** p
253d0 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74  roxyLock activat
253e0 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ion is possible 
253f0 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73  (remote proxy is
25400 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d   based on db nam
25410 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e  e).    ** zFilen
25420 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  ame remains vali
25430 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20  d until file is 
25440 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f  closed, to suppo
25450 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  rt */.    pNew->
25460 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
25470 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d   (void*)zFilenam
25480 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  e;.#endif.  }.. 
25490 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
254a0 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65  le == &posixIoMe
254b0 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65  thods.#if define
254c0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
254d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
254e0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
254f0 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  || pLockingStyle
25500 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64   == &nfsIoMethod
25510 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  s.#endif.  ){.  
25520 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
25530 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
25540 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
25550 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
25560 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25580 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
25590 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e  ccured in findIn
255a0 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65  odeInfo(), close
255b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
255c0 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d  ptor.      ** im
255d0 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72  mediately, befor
255e0 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  e releasing the 
255f0 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65  mutex. findInode
25600 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a  Info() may fail.
25610 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20        ** in two 
25620 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20  scenarios:.     
25630 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28   **.      **   (
25640 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74  a) A call to fst
25650 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20  at() failed..   
25660 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61     **   (b) A ma
25670 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20  lloc failed..   
25680 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53     **.      ** S
25690 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20  cenario (b) may 
256a0 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68  only occur if th
256b0 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  e process is hol
256c0 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20  ding no other.  
256d0 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63      ** file desc
256e0 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  riptors open on 
256f0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49  the same file. I
25700 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68  f there were oth
25710 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  er file.      **
25720 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20   descriptors on 
25730 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20  this file, then 
25740 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20  no malloc would 
25750 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  be required by. 
25760 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64       ** findInod
25770 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73  eInfo(). If this
25780 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74   is the case, it
25790 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74   is quite safe t
257a0 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a  o close.      **
257b0 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69   handle h - as i
257c0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
257d0 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f  that no posix lo
257e0 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65  cks will be rele
257f0 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ased.      ** by
25800 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20   doing so..     
25810 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
25820 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75  scenario (a) cau
25830 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68  sed the error th
25840 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f  en things are no
25850 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20  t so safe. The. 
25860 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74       ** implicit
25870 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65   assumption here
25880 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61   is that if fsta
25890 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67  t() fails, thing
258a0 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a  s are in.      *
258b0 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65  * such bad shape
258c0 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61   that dropping a
258d0 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65   lock or two doe
258e0 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68  sn't matter much
258f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25900 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
25910 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
25920 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a  ;.      h = -1;.
25930 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
25940 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
25950 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
25960 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
25970 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
25980 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  PLE__).  else if
25990 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
259a0 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
259b0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c   ){.    /* AFP l
259c0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
259d0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
259e0 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
259f0 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
25a00 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
25a10 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  text..    */.   
25a20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
25a30 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e  xt *pCtx;.    pN
25a40 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
25a50 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69  xt = pCtx = sqli
25a60 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
25a70 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
25a80 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
25a90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25aa0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
25ab0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
25ac0 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
25ad0 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
25ae0 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
25af0 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
25b00 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
25b10 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
25b20 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
25b30 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
25b40 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
25b50 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
25b60 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
25b70 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
25b80 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
25b90 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
25ba0 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
25bb0 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e  ();.      unixEn
25bc0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
25bd0 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
25be0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
25bf0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  ->pInode);.     
25c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25c10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
25c20 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
25c30 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
25c40 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
25c50 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
25c60 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
25c70 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20     h = -1;.     
25c80 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61   }.      unixLea
25c90 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  veMutex();      
25ca0 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e    .    }.  }.#en
25cb0 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20  dif..  else if( 
25cc0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
25cd0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
25ce0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74  ds ){.    /* Dot
25cf0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  file locking use
25d00 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
25d10 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
25d20 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
25d30 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b    ** the dotlock
25d40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a  LockingContext .
25d50 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
25d60 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20  *zLockFile;.    
25d70 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
25d80 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28     nFilename = (
25d90 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
25da0 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a  name) + 6;.    z
25db0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
25dc0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
25dd0 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  c(nFilename);.  
25de0 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
25df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
25e00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
25e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25e20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
25e30 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
25e40 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
25e50 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
25e60 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
25e70 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
25e80 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
25e90 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
25ea0 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
25eb0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
25ec0 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
25ed0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
25ee0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
25ef0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
25f00 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
25f10 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
25f20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
25f30 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
25f40 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
25f50 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
25f60 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
25f70 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
25f80 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
25f90 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
25fa0 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
25fb0 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
25fc0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
25fd0 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
25fe0 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
25ff0 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
26000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
26010 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
26020 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
26030 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
26060 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
26070 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
26080 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
26090 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
260a0 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
260b0 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
260c0 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
260d0 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
260e0 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
260f0 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
26100 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
26110 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
26120 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
26130 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
26140 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
26150 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
26160 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  e->aSemName[0] =
26170 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
26180 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
26190 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
261a0 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d  endif.  .  pNew-
261b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  >lastErrno = 0;.
261c0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
261d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
261e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
261f0 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
26200 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
26210 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31  E__);.    h = -1
26220 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69  ;.    unlink(zFi
26230 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
26240 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
26250 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20   pNew->isDelete 
26260 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64  = isDelete;.#end
26270 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
26280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
26290 28 20 64 69 72 66 64 3e 3d 30 20 29 20 72 6f 62  ( dirfd>=0 ) rob
262a0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
262b0 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  dirfd, __LINE__)
262c0 3b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  ;.    if( h>=0 )
262d0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
262e0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
262f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
26300 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
26310 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
26320 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
26330 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26340 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
26350 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
26360 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
26370 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
26380 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
26390 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
263a0 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
263b0 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
263c0 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
263d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
263e0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
263f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
26400 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
26410 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
26420 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
26430 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
26440 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
26450 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
26460 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
26470 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
26480 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
26490 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
264a0 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
264b0 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
264c0 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
264d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
264e0 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
264f0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
26500 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
26510 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
26520 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
26530 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
26540 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
26550 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
26560 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
26570 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
26580 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69  me);.  for(ii=(i
26590 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  nt)strlen(zDirna
265a0 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69  me); ii>1 && zDi
265b0 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
265c0 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
265d0 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
265e0 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
265f0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
26600 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
26610 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
26620 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d  0);.    if( fd>=
26630 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43  0 ){.#ifdef FD_C
26640 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 6f 73 46  LOEXEC.      osF
26650 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
26660 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  , osFcntl(fd, F_
26670 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
26680 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
26690 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
266a0 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c  OPENDIR %-3d %s\
266b0 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65  n", fd, zDirname
266c0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
266d0 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74  *pFd = fd;.  ret
266e0 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54  urn (fd>=0?SQLIT
266f0 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f  E_OK:unixLogErro
26700 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
26710 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
26720 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f  zDirname));.}../
26730 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26740 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
26750 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
26760 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
26770 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
26780 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
26790 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
267a0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
267b0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
267c0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
267d0 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
267e0 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
267f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
26800 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
26810 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
26820 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
26830 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
26840 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
26850 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
26860 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
26870 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
26880 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
26890 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
268a0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
268b0 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
268c0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
268d0 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
268e0 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
268f0 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
26900 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
26910 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
26920 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
26930 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
26940 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
26950 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
26960 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
26970 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
26980 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26990 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
269a0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
269b0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
269c0 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
269d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
269e0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
269f0 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
26a00 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
26a10 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
26a20 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
26a30 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
26a40 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
26a50 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
26a60 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
26a70 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
26a80 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
26a90 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
26aa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
26ab0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
26ac0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
26ad0 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
26ae0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
26af0 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
26b00 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
26b10 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
26b20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
26b30 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
26b40 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
26b50 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
26b60 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
26b70 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
26b80 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
26b90 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
26ba0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
26bb0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
26bc0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
26bd0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
26be0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
26bf0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
26c00 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
26c10 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
26c20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
26c30 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
26c40 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
26c50 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
26c60 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
26c70 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
26c80 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
26c90 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
26ca0 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
26cb0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
26cc0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
26cd0 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
26ce0 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
26cf0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
26d00 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
26d10 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
26d20 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
26d30 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
26d40 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
26d50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26d60 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
26d70 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
26d80 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
26d90 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
26da0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
26db0 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
26dc0 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
26dd0 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
26de0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
26df0 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
26e00 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26e10 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
26e20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
26e30 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
26e40 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
26e50 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
26e60 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
26e70 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
26e80 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  0;.  }while( osA
26e90 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
26ea0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
26eb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
26ec0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
26ed0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
26ee0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
26ef0 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
26f00 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
26f10 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
26f20 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
26f30 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
26f40 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
26f50 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
26f60 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
26f70 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
26f80 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
26f90 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
26fa0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
26fb0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
26fc0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
26fd0 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
26fe0 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
26ff0 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
27000 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
27010 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
27020 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
27030 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
27040 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
27050 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
27060 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
27070 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
27080 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
27090 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
270a0 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
270b0 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
270c0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
270d0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
270e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
270f0 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
27100 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
27110 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
27120 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
27130 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
27140 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
27150 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
27160 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
27170 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
27180 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
27190 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
271a0 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
271b0 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
271c0 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
271d0 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
271e0 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
271f0 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
27200 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
27210 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
27220 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
27230 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
27240 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
27250 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
27260 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
27270 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
27280 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
27290 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
272a0 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
272b0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
272c0 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
272d0 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
272e0 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
272f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
27300 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
27310 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
27320 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
27330 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
27340 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
27350 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
27360 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
27370 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
27380 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
27390 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
273a0 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
273b0 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
273c0 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
273d0 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
273e0 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
273f0 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
27400 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
27410 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
27420 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
27430 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
27440 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
27450 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
27460 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
27470 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
27480 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
27490 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
274a0 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
274b0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
274c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
274d0 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
274e0 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
274f0 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
27500 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
27510 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
27520 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
27530 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
27540 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
27550 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
27560 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
27570 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
27580 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
27590 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
275a0 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
275b0 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
275c0 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
275d0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
275e0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
275f0 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
27600 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
27610 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
27620 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
27630 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
27640 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
27650 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
27660 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
27670 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
27680 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
27690 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
276a0 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
276b0 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
276c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
276d0 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
276e0 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a  .  if( 0==stat(z
276f0 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
27700 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
27710 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
27720 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
27730 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  );.    pInode = 
27740 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
27750 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
27760 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
27770 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
27780 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
27790 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
277a0 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53  ->fileId.ino!=sS
277b0 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20  tat.st_ino) ){. 
277c0 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70        pInode = p
277d0 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
277e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f    }.    if( pIno
277f0 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78  de ){.      Unix
27800 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20  UnusedFd **pp;. 
27810 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e       for(pp=&pIn
27820 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70  ode->pUnused; *p
27830 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67  p && (*pp)->flag
27840 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28  s!=flags; pp=&((
27850 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20  *pp)->pNext));. 
27860 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a       pUnused = *
27870 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  pp;.      if( pU
27880 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
27890 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
278a0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
278b0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
278c0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
278d0 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21  endif    /* if !
278e0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20  OS_VXWORKS */.  
278f0 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a  return pUnused;.
27900 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
27910 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
27920 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74   by unixOpen() t
27930 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
27940 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73  unix permissions
27950 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65  .** to create ne
27960 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66  w files with. If
27970 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
27980 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
27990 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
279a0 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74  and a value suit
279b0 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67  able for passing
279c0 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
279d0 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32  gument to open(2
279e0 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ) is.** written 
279f0 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e  to *pMode. If an
27a00 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
27a10 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
27a20 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
27a30 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
27a40 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69  alue of *pMode i
27a50 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a  s not modified..
27a60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
27a70 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
27a80 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
27a90 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  le, it is always
27aa0 20 63 72 65 61 74 65 64 20 77 69 74 68 0a 2a 2a   created with.**
27ab0 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72 6d 69   the octal permi
27ac0 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72 65 61  ssions 0600 (rea
27ad0 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20 6f 77  d/writable by ow
27ae0 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68  ner only). If th
27af0 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64  e file.** is a d
27b00 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73 74 65  atabase or maste
27b10 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
27b20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 77 69  it is created wi
27b30 74 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  th the permissio
27b40 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49  ns .** mask SQLI
27b50 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
27b60 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a  PERMISSIONS..**.
27b70 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74  ** Finally, if t
27b80 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
27b90 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72  ened is a WAL or
27ba0 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
27bb0 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   file, then .** 
27bc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75  this function qu
27bd0 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73  eries the file-s
27be0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65  ystem for the pe
27bf0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
27c00 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
27c10 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
27c20 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65   and sets *pMode
27c30 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20   to this value. 
27c40 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73  Whenever .** pos
27c50 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a  sible, WAL and j
27c60 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
27c70 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
27c80 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
27c90 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61  ons .** as the a
27ca0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
27cb0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
27cc0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  f the SQLITE_ENA
27cd0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70  BLE_8_3_NAMES op
27ce0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
27cf0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69   then the.** ori
27d00 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
27d10 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  s unavailable.  
27d20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73  But 8_3_NAMES is
27d30 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a   only used for.*
27d40 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d  * FAT filesystem
27d50 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e  s and permission
27d60 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20  s do not matter 
27d70 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75  there, so just u
27d80 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  se.** the defaul
27d90 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a  t permissions..*
27da0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
27db0 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
27dc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27dd0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
27de0 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69     /* Path of fi
27df0 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65  le (possibly) be
27e00 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20  ing created */. 
27e10 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
27e40 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74   as 4th argument
27e50 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   to xOpen() */. 
27e60 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20 20   mode_t *pMode  
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
27e90 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c  ions to open fil
27ea0 65 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20 69  e with */.){.  i
27eb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27ec0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
27ed0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
27ee0 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49  .  *pMode = SQLI
27ef0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
27f00 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 69  PERMISSIONS;.  i
27f10 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
27f20 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
27f30 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
27f40 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
27f50 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
27f60 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
27f70 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
27f80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27fb0 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
27fc0 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72  n zDb */.    str
27fd0 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
27fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
27ff0 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f  tput of stat() o
28000 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
28010 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68  */..    /* zPath
28020 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20   is a path to a 
28030 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  WAL or journal f
28040 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ile. The followi
28050 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73  ng block derives
28060 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68  .    ** the path
28070 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
28080 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
28090 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69   from zPath. Thi
280a0 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a  s block handles.
280b0 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
280c0 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76  wing naming conv
280d0 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a  entions:.    **.
280e0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
280f0 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a  to db>-journal".
28100 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
28110 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20  to db>-wal".    
28120 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
28130 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20  b>-journalNN".  
28140 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
28150 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20   db>-walNN".    
28160 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20  **.    ** where 
28170 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69 74 20  NN is a 4 digit 
28180 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20  decimal number. 
28190 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63  The NN naming sc
281a0 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a  hemes are .    *
281b0 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  * used by the te
281c0 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d  st_multiplex.c m
281d0 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  odule..    */.  
281e0 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53    nDb = sqlite3S
281f0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d  trlen30(zPath) -
28200 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20   1; .    while( 
28210 6e 44 62 3e 30 20 26 26 20 7a 50 61 74 68 5b 6e  nDb>0 && zPath[n
28220 44 62 5d 21 3d 27 2d 27 20 29 20 6e 44 62 2d 2d  Db]!='-' ) nDb--
28230 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30  ;.    if( nDb==0
28240 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28250 5f 4f 4b 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  _OK;.    memcpy(
28260 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29  zDb, zPath, nDb)
28270 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d  ;.    zDb[nDb] =
28280 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20   '\0';..    if( 
28290 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26 73 53  0==stat(zDb, &sS
282a0 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  tat) ){.      *p
282b0 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
282c0 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
282d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
282e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
282f0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
28300 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
28310 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
28320 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
28330 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
28340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
28360 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
28370 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
28380 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
28390 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
283a0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
283b0 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
283c0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
283d0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
283e0 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
283f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
28400 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
28410 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
28420 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
28430 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
28440 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
28450 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
28460 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
28470 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
28480 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
28490 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
284a0 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
284b0 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
284c0 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
284d0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
284e0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
284f0 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
28500 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
28510 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
28520 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
28530 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
28540 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
28550 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
28560 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
28570 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
28580 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
28590 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
285a0 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
285b0 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
285c0 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
285d0 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
285e0 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
285f0 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
28600 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
28610 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
28620 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
28630 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
28640 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
28650 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
28670 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
28680 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
28690 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
286a0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
286b0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
286c0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
286d0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
286e0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
286f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28700 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
28710 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
28720 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
28750 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
28760 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
28770 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
28780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
28790 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
287a0 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
287b0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
287c0 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
287d0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
287e0 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
287f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28800 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
28810 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
28820 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  ) */.  int dirfd
28830 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
28840 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
28850 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
28860 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  or */.  int open
28870 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
28880 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
28890 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
288a0 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  ) */.  int eType
288b0 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
288c0 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
288d0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
288e0 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
28910 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
28920 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
28930 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
28940 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
28950 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
28960 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
28970 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
28980 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
28990 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
289a0 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
289b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
289c0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
289d0 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
289e0 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
289f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
28a00 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
28a10 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
28a20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
28a30 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
28a40 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
28a50 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
28a60 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
28a70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
28a80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
28a90 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
28aa0 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
28ab0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
28ac0 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
28ad0 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
28ae0 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
28af0 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
28b00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
28b10 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
28b20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
28b30 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
28b40 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
28b50 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
28b60 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
28b70 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
28b80 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
28b90 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
28ba0 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
28bb0 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69  /.  int isOpenDi
28bc0 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65  rectory = (isCre
28bd0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
28be0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28bf0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
28c00 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
28c10 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
28c20 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
28c30 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
28c40 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
28c50 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
28c60 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
28c70 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
28c80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
28c90 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
28ca0 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
28cb0 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
28cc0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
28cd0 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
28ce0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
28cf0 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
28d00 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+1];.  const c
28d10 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
28d20 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
28d30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
28d40 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
28d50 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
28d60 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
28d70 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
28d80 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
28d90 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
28da0 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
28db0 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
28dc0 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
28dd0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
28de0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
28df0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
28e00 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
28e10 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
28e20 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
28e30 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
28e40 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
28e50 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
28e60 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
28e70 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
28e80 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
28e90 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
28ea0 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
28eb0 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
28ec0 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
28ed0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
28ee0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
28ef0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
28f00 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
28f10 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
28f20 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
28f30 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
28f40 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
28f50 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
28f60 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
28f70 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
28f80 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
28f90 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
28fa0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
28fb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
28fc0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
28fd0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
28fe0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
28ff0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
29000 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
29010 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
29020 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
29030 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
29040 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
29050 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
29060 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
29070 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
29080 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
29090 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
290a0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
290b0 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
290c0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
290d0 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
290e0 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
290f0 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
29100 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
29110 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29120 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
29130 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29140 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
29150 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
29160 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29170 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
29180 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
29190 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
291a0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
291b0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
291c0 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
291d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
291e0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
291f0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
29200 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
29210 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
29220 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
29230 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  .  );..  memset(
29240 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
29250 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
29260 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29270 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
29280 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
29290 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
292a0 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
292b0 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
292c0 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
292d0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
292e0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
292f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29300 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
29310 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
29320 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
29330 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
29340 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
29350 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29360 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29370 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
29380 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20  Unused;.  }else 
29390 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
293a0 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
293b0 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
293c0 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
293d0 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
293e0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
293f0 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
29400 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  penDirectory);. 
29410 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54     rc = unixGetT
29420 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
29430 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65  NAME+1, zTmpname
29440 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29470 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
29480 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
29490 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
294a0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c   value of the fl
294b0 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61  ags parameter pa
294c0 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75  ssed to POSIX fu
294d0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  nction.  ** open
294e0 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62  (). These must b
294f0 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65  e calculated eve
29500 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e  n if open() is n
29510 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20  ot called, as.  
29520 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73  ** they may be s
29530 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
29540 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
29550 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65   and used by the
29560 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69   .  ** 'conch fi
29570 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63  le' locking func
29580 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20  tions later on. 
29590 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64   */.  if( isRead
295a0 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67  only )  openFlag
295b0 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
295c0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
295d0 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
295e0 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73  O_RDWR;.  if( is
295f0 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e  Create )    open
29600 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54  Flags |= O_CREAT
29610 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  ;.  if( isExclus
29620 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ive ) openFlags 
29630 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
29640 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c  OLLOW);.  openFl
29650 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46  ags |= (O_LARGEF
29660 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a  ILE|O_BINARY);..
29670 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
29680 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
29690 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
296a0 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  /* Permissions t
296b0 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69  o create file wi
296c0 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  th */.    rc = f
296d0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
296e0 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
296f0 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20  &openMode);.    
29700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29710 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
29720 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29  t( !p->pUnused )
29730 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29740 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29750 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d  EN_WAL || eType=
29760 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
29770 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20  N_JOURNAL );.   
29780 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29790 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62    }.    fd = rob
297a0 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
297b0 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
297c0 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ode);.    OSTRAC
297d0 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64  E(("OPENX   %-3d
297e0 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20   %s 0%o\n", fd, 
297f0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
29800 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  ));.    if( fd<0
29810 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49   && errno!=EISDI
29820 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65  R && isReadWrite
29830 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
29840 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   ){.      /* Fai
29850 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  led to open the 
29860 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72  file for read/wr
29870 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20  ite access. Try 
29880 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  read-only. */.  
29890 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
298a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
298b0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
298c0 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
298d0 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f  openFlags &= ~(O
298e0 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a  _RDWR|O_CREAT);.
298f0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
29900 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
29910 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  NLY;.      openF
29920 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
29930 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e  ;.      isReadon
29940 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64  ly = 1;.      fd
29950 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
29960 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
29970 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
29980 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  }.    if( fd<0 )
29990 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
299a0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
299b0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
299c0 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a  "open", zName);.
299d0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
299e0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
299f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
29a00 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
29a10 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
29a20 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
29a30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
29a40 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
29a50 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
29a60 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
29a70 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
29a80 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
29a90 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
29aa0 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
29ab0 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73  th = zName;.#els
29ac0 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61  e.    unlink(zNa
29ad0 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  me);.#endif.  }.
29ae0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
29af0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29b00 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f    else{.    p->o
29b10 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
29b20 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  lags;.  }.#endif
29b30 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69  ..  if( isOpenDi
29b40 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72  rectory ){.    r
29b50 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  c = openDirector
29b60 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29  y(zPath, &dirfd)
29b70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29b80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29b90 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65 20 74   /* It is safe t
29ba0 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68  o close fd at th
29bb0 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73  is point, becaus
29bc0 65 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  e it is guarante
29bd0 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  ed not.      ** 
29be0 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20  to be open on a 
29bf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
29c00 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f  f it were open o
29c10 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
29c20 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77  e,.      ** it w
29c30 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
29c40 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69   to close as thi
29c50 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20  s would release 
29c60 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20  any locks held. 
29c70 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66       ** on the f
29c80 69 6c 65 20 62 79 20 74 68 69 73 20 70 72 6f 63  ile by this proc
29c90 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  ess.  */.      a
29ca0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
29cb0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
29cc0 42 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  B );.      robus
29cd0 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
29ce0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
29cf0 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
29d00 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ed;.    }.  }..#
29d10 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
29d20 0a 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  .  osFcntl(fd, F
29d30 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
29d40 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
29d50 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
29d60 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20  endif..  noLock 
29d70 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  = eType!=SQLITE_
29d80 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20  OPEN_MAIN_DB;.. 
29d90 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
29da0 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
29db0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29dc0 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74  G_STYLE.  struct
29dd0 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
29de0 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64    if( fstatfs(fd
29df0 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
29e00 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
29e10 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74  le*)pFile)->last
29e20 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
29e30 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
29e40 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
29e50 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
29e60 5f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  _);.    robust_c
29e70 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
29e80 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
29e90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
29ea0 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
29eb0 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
29ec0 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
29ed0 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
29ee0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
29ef0 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
29f00 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
29f10 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
29f20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
29f30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29f40 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20  CKING_STYLE.#if 
29f50 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
29f60 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73  OXY_LOCKING.  is
29f70 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23  AutoProxy = 1;.#
29f80 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41 75  endif.  if( isAu
29f90 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74  toProxy && (zPat
29fa0 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f  h!=NULL) && (!no
29fb0 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78  Lock) && pVfs->x
29fc0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  Open ){.    char
29fd0 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74   *envforce = get
29fe0 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43  env("SQLITE_FORC
29ff0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22  E_PROXY_LOCKING"
2a000 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72  );.    int usePr
2a010 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  oxy = 0;..    /*
2a020 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2a030 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d  OXY_LOCKING==1 m
2a040 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79  eans force alway
2a050 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d  s use proxy, 0 m
2a060 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76  eans .    ** nev
2a070 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55  er use proxy, NU
2a080 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f  LL means use pro
2a090 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c  xy for non-local
2a0a0 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f   files only.  */
2a0b0 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63  .    if( envforc
2a0c0 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e!=NULL ){.     
2a0d0 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69   useProxy = atoi
2a0e0 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20  (envforce)>0;.  
2a0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2a100 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2a110 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nfo;.      if( s
2a120 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
2a130 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2a140 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
2a150 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66  ory, the close(f
2a160 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f  d) call is sub-o
2a170 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66  ptimal. If the f
2a180 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20  ile opened.     
2a190 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73     ** with fd is
2a1a0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2a1b0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2a1c0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2a1d0 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
2a1e0 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  * on that file t
2a1f0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
2a200 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f  y holding adviso
2a210 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a  ry locks on it,.
2a220 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2a230 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73  the call to clos
2a240 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  e() will cancel 
2a250 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20  those locks. In 
2a260 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20  practice,.      
2a270 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d    ** we're assum
2a280 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28  ing that statfs(
2a290 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76  ) doesn't fail v
2a2a0 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65  ery often. At le
2a2b0 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ast.        ** n
2a2c0 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66  ot while other f
2a2d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2a2e0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
2a2f0 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20  me process on.  
2a300 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
2a310 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69  e file are worki
2a320 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng.  */.        
2a330 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  p->lastErrno = e
2a340 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
2a350 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ( dirfd>=0 ){.  
2a360 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2a370 6c 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20 5f  lose(p, dirfd, _
2a380 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2a390 20 20 7d 0a 20 20 20 20 20 20 20 20 72 6f 62 75    }.        robu
2a3a0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2a3b0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2a3c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2a3d0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
2a3e0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2a3f0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
2a400 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
2a410 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
2a420 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
2a430 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
2a440 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
2a450 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2a460 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
2a470 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
2a480 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  , noLock,.      
2a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4a0 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69 73      isDelete, is
2a4b0 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20  Readonly);.     
2a4c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a4d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2a4e0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
2a4f0 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
2a500 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
2a510 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
2a520 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2a540 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
2a550 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
2a560 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
2a570 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
2a580 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
2a590 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
2a5a0 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
2a5b0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
2a5c0 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
2a5d0 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
2a5e0 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
2a5f0 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
2a600 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
2a610 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
2a620 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
2a630 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
2a640 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2a650 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2a660 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
2a670 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2a680 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2a690 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
2a6a0 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
2a6b0 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
2a6c0 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
2a6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a6e0 20 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c         isDelete,
2a6f0 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70   isReadonly);.op
2a700 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  en_finished:.  i
2a710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a720 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a730 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29  free(p->pUnused)
2a740 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a750 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
2a760 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
2a770 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
2a780 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
2a790 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
2a7a0 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
2a7b0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
2a7c0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
2a7d0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
2a7e0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
2a7f0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
2a800 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
2a810 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
2a820 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
2a830 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2a840 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
2a850 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2a860 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
2a870 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
2a880 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
2a890 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
2a8a0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
2a8b0 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
2a8c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a8d0 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
2a8e0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2a8f0 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
2a900 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
2a910 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
2a920 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28  );.  if( unlink(
2a930 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20  zPath)==(-1) && 
2a940 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
2a950 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
2a960 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2a970 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
2a980 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
2a990 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2a9a0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
2a9b0 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63  NC.  if( dirSync
2a9c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
2a9d0 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72      rc = openDir
2a9e0 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
2a9f0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2aa00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
2aa10 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
2aa20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
2aa30 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
2aa40 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
2aa50 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
2aa60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
2aa70 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2aa80 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
2aa90 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74  C, "fsync", zPat
2aaa0 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
2aab0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
2aac0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2aad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2aae0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
2aaf0 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
2ab00 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72   existance of or
2ab10 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
2ab20 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
2ab30 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
2ab40 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
2ab50 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
2ab60 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
2ab70 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
2ab80 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
2ab90 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
2aba0 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
2abb0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
2abc0 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
2abd0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
2abe0 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
2abf0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
2ac00 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
2ac10 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
2ac20 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
2ac30 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
2ac40 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
2ac50 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
2ac60 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
2ac70 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
2ac80 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
2ac90 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
2aca0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
2acb0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2acc0 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2acd0 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
2ace0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
2acf0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2ad00 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
2ad10 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
2ad20 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
2ad30 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
2ad40 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
2ad50 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
2ad60 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
2ad70 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
2ad80 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
2ad90 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2ada0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2adb0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2adc0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
2add0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
2ade0 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
2adf0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2ae00 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  STS:.      amode
2ae10 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = F_OK;.      b
2ae20 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2ae30 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2ae40 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d  DWRITE:.      am
2ae50 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b  ode = W_OK|R_OK;
2ae60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ae70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
2ae80 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20  CESS_READ:.     
2ae90 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20   amode = R_OK;. 
2aea0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2aeb0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
2aec0 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
2aed0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
2aee0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
2aef0 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50  t = (osAccess(zP
2af00 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b  ath, amode)==0);
2af10 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51  .  if( flags==SQ
2af20 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2af30 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29  TS && *pResOut )
2af40 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
2af50 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30  t buf;.    if( 0
2af60 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20 26 62  ==stat(zPath, &b
2af70 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
2af80 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ze==0 ){.      *
2af90 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20  pResOut = 0;.   
2afa0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2afb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
2afc0 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
2afd0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
2afe0 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
2aff0 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65  me. The relative
2b000 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72   path.** is stor
2b010 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d  ed as a nul-term
2b020 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
2b030 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
2b040 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61  ted to by.** zPa
2b050 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20  th. .**.** zOut 
2b060 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
2b070 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73  er of at least s
2b080 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
2b090 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20  hname bytes .** 
2b0a0 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d  (in this case, M
2b0b0 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65  AX_PATHNAME byte
2b0c0 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74  s). The full-pat
2b0d0 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  h is written to.
2b0e0 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
2b0f0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2b100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2b110 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
2b120 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2b130 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
2b140 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2b150 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
2b160 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2b170 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2b180 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
2b190 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
2b1a0 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1c0 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
2b1d0 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
2b1e0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
2b1f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b200 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
2b210 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f  uffer */.){..  /
2b220 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
2b230 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
2b240 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
2b250 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
2b260 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
2b270 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
2b280 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
2b290 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
2b2a0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
2b2b0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
2b2c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
2b2d0 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
2b2e0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
2b2f0 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
2b300 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
2b310 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
2b320 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
2b330 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2b340 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
2b350 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
2b360 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
2b370 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
2b380 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b390 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f  Vfs);..  zOut[nO
2b3a0 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut-1] = '\0';.  
2b3b0 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
2b3c0 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
2b3d0 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
2b3e0 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
2b3f0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
2b400 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69   int nCwd;.    i
2b410 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
2b420 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
2b430 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
2b440 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2b450 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
2b460 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
2b470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
2b480 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2b490 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
2b4a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
2b4b0 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
2b4c0 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
2b4d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2b4e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
2b4f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b500 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
2b510 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
2b520 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
2b530 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
2b540 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
2b550 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
2b560 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
2b570 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
2b580 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
2b590 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
2b5a0 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
2b5b0 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
2b5c0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2b5d0 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
2b5e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
2b5f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b600 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2b610 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
2b620 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
2b630 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
2b640 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
2b650 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
2b660 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
2b670 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
2b680 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
2b690 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
2b6a0 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
2b6b0 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
2b6c0 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
2b6d0 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
2b6e0 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
2b6f0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
2b700 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
2b710 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
2b720 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
2b730 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
2b740 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
2b750 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
2b760 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
2b770 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
2b780 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
2b790 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
2b7a0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
2b7b0 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
2b7c0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2b7d0 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
2b7e0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2b7f0 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
2b800 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
2b810 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
2b820 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
2b830 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2b840 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
2b850 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
2b860 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2b870 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2b880 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
2b890 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2b8a0 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
2b8b0 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
2b8c0 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
2b8d0 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
2b8e0 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
2b8f0 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
2b900 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
2b910 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
2b920 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
2b930 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
2b940 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
2b950 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
2b960 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
2b970 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
2b980 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
2b990 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
2b9a0 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
2b9b0 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
2b9c0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
2b9d0 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
2b9e0 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
2b9f0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
2ba00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2ba10 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
2ba20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
2ba30 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
2ba40 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
2ba50 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2ba60 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
2ba70 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
2ba80 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
2ba90 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
2baa0 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
2bab0 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
2bac0 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
2bad0 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
2bae0 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
2baf0 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
2bb00 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
2bb10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2bb20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
2bb30 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
2bb40 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
2bb50 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
2bb60 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
2bb70 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
2bb80 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
2bb90 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
2bba0 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
2bbb0 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
2bbc0 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
2bbd0 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
2bbe0 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
2bbf0 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
2bc00 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
2bc10 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
2bc20 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
2bc30 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
2bc40 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2bc50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2bc60 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
2bc70 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
2bc80 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
2bc90 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
2bca0 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
2bcb0 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
2bcc0 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
2bcd0 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
2bce0 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
2bcf0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2bd00 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
2bd10 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
2bd20 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
2bd30 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
2bd40 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
2bd50 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
2bd60 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
2bd70 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
2bd80 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2bd90 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
2bda0 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
2bdb0 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2bdc0 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
2bdd0 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
2bde0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
2bdf0 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
2be00 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2be10 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
2be20 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2be30 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2be40 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
2be50 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2be60 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
2be70 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
2be80 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
2be90 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
2bea0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
2beb0 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
2bec0 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
2bed0 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
2bee0 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
2bef0 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
2bf00 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
2bf10 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
2bf20 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
2bf30 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
2bf40 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
2bf50 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
2bf60 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
2bf70 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
2bf80 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
2bf90 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
2bfa0 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
2bfb0 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
2bfc0 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
2bfd0 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
2bfe0 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
2bff0 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
2c000 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
2c010 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
2c020 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
2c030 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
2c040 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
2c050 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
2c060 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
2c070 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
2c080 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
2c090 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
2c0a0 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
2c0b0 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
2c0c0 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
2c0d0 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
2c0e0 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
2c0f0 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
2c100 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
2c110 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
2c120 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
2c130 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2c140 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
2c150 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 72  , fd;.    fd = r
2c160 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
2c170 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
2c180 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
2c190 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
2c1a0 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
2c1b0 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
2c1c0 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
2c1d0 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
2c1e0 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
2c1f0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
2c200 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
2c210 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
2c220 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
2c230 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
2c240 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f  eof(pid)<=(size_
2c250 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
2c260 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
2c270 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a   + sizeof(pid);.
2c280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c290 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65   do{ nBuf = osRe
2c2a0 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
2c2b0 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66  f); }while( nBuf
2c2c0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
2c2d0 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  TR );.      robu
2c2e0 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
2c2f0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
2c300 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2c310 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
2c320 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
2c330 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
2c340 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
2c350 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
2c360 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
2c370 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2c380 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
2c390 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
2c3a0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2c3b0 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
2c3c0 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
2c3d0 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
2c3e0 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
2c3f0 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
2c400 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
2c410 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
2c420 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
2c430 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2c440 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2c450 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
2c460 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
2c470 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
2c480 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
2c490 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
2c4a0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
2c4b0 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
2c4c0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
2c4d0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
2c4e0 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
2c4f0 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
2c500 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
2c510 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
2c520 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
2c530 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
2c540 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
2c550 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2c560 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2c570 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
2c580 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
2c590 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
2c5a0 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
2c5b0 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
2c5c0 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
2c5d0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2c5e0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
2c5f0 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
2c600 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
2c610 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
2c620 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
2c630 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
2c640 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2c650 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c660 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
2c670 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
2c680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2c690 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
2c6a0 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
2c6b0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
2c6c0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
2c6d0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
2c6e0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2c6f0 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
2c700 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
2c710 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
2c720 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
2c730 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
2c740 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2c750 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
2c760 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
2c770 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
2c780 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
2c790 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
2c7a0 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
2c7b0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
2c7c0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
2c7d0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
2c7e0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
2c7f0 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
2c800 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2c810 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2c820 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
2c830 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
2c840 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
2c850 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
2c860 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
2c870 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
2c880 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
2c890 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
2c8a0 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
2c8b0 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
2c8c0 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
2c8d0 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
2c8e0 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
2c8f0 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
2c900 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
2c910 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2c920 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2c930 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2c940 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2c950 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
2c960 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
2c970 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2c980 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
2c990 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20  iNow){.  static 
2c9a0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2c9b0 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
2c9c0 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
2c9d0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
2c9e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
2c9f0 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74  GETTOD).  time_t
2ca00 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
2ca10 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c    *piNow = ((sql
2ca20 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30  ite3_int64)t)*10
2ca30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  00 + unixEpoch;.
2ca40 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  #elif OS_VXWORKS
2ca50 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
2ca60 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b  ec sNow;.  clock
2ca70 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52  _gettime(CLOCK_R
2ca80 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b  EALTIME, &sNow);
2ca90 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78  .  *piNow = unix
2caa0 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
2cab0 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
2cac0 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
2cad0 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a  v_nsec/1000000;.
2cae0 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
2caf0 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67  imeval sNow;.  g
2cb00 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
2cb10 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  w, 0);.  *piNow 
2cb20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
2cb30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
2cb40 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
2cb50 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30  sNow.tv_usec/100
2cb60 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  0;.#endif..#ifde
2cb70 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2cb80 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
2cb90 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
2cba0 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
2cbb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
2cbc0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2cbd0 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
2cbe0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
2cbf0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2cc00 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2cc10 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
2cc20 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2cc30 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
2cc40 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
2cc50 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
2cc60 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2cc70 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2cc80 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
2cc90 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
2cca0 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
2ccb0 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
2ccc0 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
2ccd0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2cce0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
2ccf0 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
2cd00 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64  _vfs *NotUsed, d
2cd10 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
2cd20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
2cd30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2cd40 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2cd50 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
2cd60 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
2cd70 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
2cd80 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
2cd90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61  0;.}../*.** We a
2cda0 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61 73  dded the xGetLas
2cdb0 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20  tError() method 
2cdc0 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69  with the intenti
2cdd0 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a  on of providing.
2cde0 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65  ** better low-le
2cdf0 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67  vel error messag
2ce00 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  es when operatin
2ce10 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d  g-system problem
2ce20 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72  s come up.** dur
2ce30 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61  ing SQLite opera
2ce40 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61  tion.  But so fa
2ce50 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20  r, none of that 
2ce60 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65  has been impleme
2ce70 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  nted.** in the c
2ce80 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f  ore.  So this ro
2ce90 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
2cea0 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c  alled.  For now,
2ceb0 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a   it is merely.**
2cec0 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e   a place-holder.
2ced0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2cee0 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  nixGetLastError(
2cef0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2cf00 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
2cf10 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65  d2, char *NotUse
2cf20 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d3){.  UNUSED_PA
2cf30 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2cf40 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2cf50 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a  ETER(NotUsed2);.
2cf60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2cf70 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20  ER(NotUsed3);.  
2cf80 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
2cf90 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2cfa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
2cfb0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2cfc0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2cfd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cfe0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2cff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2d030 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2d040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d080 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2d090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
2d0a0 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
2d0b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2d0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d0d0 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
2d0e0 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
2d0f0 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
2d100 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
2d110 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
2d120 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
2d130 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
2d140 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
2d150 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
2d160 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
2d170 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
2d180 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
2d190 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
2d1a0 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
2d1b0 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
2d1c0 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
2d1d0 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
2d1e0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
2d1f0 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
2d200 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
2d210 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
2d220 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
2d230 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
2d240 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
2d250 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
2d260 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
2d270 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
2d280 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
2d290 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
2d2a0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2d2b0 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
2d2c0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
2d2d0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
2d2e0 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
2d2f0 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
2d300 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
2d310 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2d320 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
2d330 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
2d340 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
2d350 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
2d360 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
2d370 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
2d380 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
2d390 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
2d3a0 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
2d3b0 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
2d3c0 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
2d3d0 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
2d3e0 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
2d3f0 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
2d400 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
2d410 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
2d420 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
2d430 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
2d440 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
2d450 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
2d460 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2d470 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
2d480 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
2d490 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
2d4a0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
2d4b0 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
2d4c0 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
2d4d0 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
2d4e0 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
2d4f0 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
2d500 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
2d510 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
2d520 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
2d530 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2d540 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
2d550 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
2d560 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
2d570 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
2d580 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2d590 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
2d5a0 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
2d5b0 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20 20    0x40000000..  
2d5c0 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52   ..**      RESER
2d5d0 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30  VED_BYTE       0
2d5e0 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20  x40000001.**    
2d5f0 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20    SHARED_RANGE  
2d600 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32        0x40000002
2d610 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a   -> 0x40000200.*
2d620 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
2d630 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  well on the loca
2d640 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62  l file system, b
2d650 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c  ut shows a nearl
2d660 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f  y 100x.** slowdo
2d670 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f  wn in read perfo
2d680 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65  rmance on AFP be
2d690 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c  cause the AFP cl
2d6a0 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a  ient disables.**
2d6b0 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20   the read cache 
2d6c0 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20  when byte-range 
2d6d0 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e  locks are presen
2d6e0 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65  t.  Enabling the
2d6f0 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65   read.** cache e
2d700 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63  xposes a cache c
2d710 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d  oherency problem
2d720 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
2d730 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20   on all OS X.** 
2d740 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72  supported networ
2d750 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20  k file systems. 
2d760 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74   NFS and AFP bot
2d770 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a  h observe the.**
2d780 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73   close-to-open s
2d790 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73  emantics for ens
2d7a0 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65  uring cache cohe
2d7b0 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f  rency.** [http:/
2d7c0 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65  /nfs.sourceforge
2d7d0 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77  .net/#faq_a8], w
2d7e0 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66  hich does not ef
2d7f0 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64  fectively.** add
2d800 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65  ress the require
2d810 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72  ments for concur
2d820 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63  rent database ac
2d830 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2d840 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20  .** readers and 
2d850 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70  writers.** [http
2d860 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f  ://www.nabble.co
2d870 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d  m/SQLite-on-NFS-
2d880 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d  cache-coherency-
2d890 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d  td15655701.html]
2d8a0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65  ..**.** To addre
2d8b0 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ss the performan
2d8c0 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68  ce and cache coh
2d8d0 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70  erency issues, p
2d8e0 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
2d8f0 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65  g.** changes the
2d900 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63   way database ac
2d910 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c  cess is controll
2d920 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61  ed by limiting a
2d930 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69  ccess to a.** si
2d940 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74  ngle host at a t
2d950 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66  ime and moving f
2d960 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66  ile locks off of
2d970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d980 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61  le.** and onto a
2d990 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74   proxy file on t
2d9a0 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2d9b0 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  stem.  .**.**.**
2d9c0 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63   Using proxy loc
2d9d0 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
2d9e0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20  -------.**.** C 
2d9f0 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  APIs.**.**  sqli
2da00 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2da10 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
2da20 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2da30 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
2da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da50 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
2da60 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
2da70 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2da80 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
2da90 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
2daa0 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79  OXYFILE, &<proxy
2dab0 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a  _path>);.**.**.*
2dac0 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a  * SQL pragmas.**
2dad0 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2dae0 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2daf0 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61  y_file=<proxy_pa
2db00 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20  th> | :auto:.** 
2db10 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
2db20 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
2db30 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79  le.**.** Specify
2db40 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61  ing ":auto:" mea
2db50 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ns that if there
2db60 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   is a conch file
2db70 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
2db80 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69  .** host ID in i
2db90 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74  t, the proxy pat
2dba0 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
2dbb0 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
2dbc0 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61  , otherwise.** a
2dbd0 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65   proxy path base
2dbe0 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20  d on the user's 
2dbf0 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61  temp dir.** (via
2dc00 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52   confstr(_CS_DAR
2dc10 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
2dc20 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20  R,...)) will be 
2dc30 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
2dc40 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c  actual proxy fil
2dc50 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61  e name is genera
2dc60 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d  ted from the nam
2dc70 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68  e and path of th
2dc80 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
2dc90 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
2dca0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f  :.**.**       Fo
2dcb0 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20  r database path 
2dcc0 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64  "/Users/me/foo.d
2dcd0 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  b" .**       The
2dce0 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
2dcf0 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c  be "<tmpdir>/sql
2dd00 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73  iteplocks/_Users
2dd10 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a  _me_foo.db:auto:
2dd20 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20  ").**.** Once a 
2dd30 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f  lock proxy is co
2dd40 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64  nfigured for a d
2dd50 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2dd60 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a  on, it can not.*
2dd70 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f  * be removed, ho
2dd80 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20  wever it may be 
2dd90 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69  switched to a di
2dda0 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61  fferent proxy pa
2ddb0 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62  th via.** the ab
2ddc0 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69  ove APIs (assumi
2ddd0 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  ng the conch fil
2dde0 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68  e is not being h
2ddf0 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a  eld by another.*
2de00 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  * connection or 
2de10 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a  process). .**.**
2de20 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f  .** How proxy lo
2de30 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d  cking works.** -
2de40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de50 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f  ------.**.** Pro
2de60 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
2de70 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79  relies primarily
2de80 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70   on two new supp
2de90 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a  orting files: .*
2dea0 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20  *.**   *  conch 
2deb0 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63  file to limit ac
2dec0 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
2ded0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73  base file to a s
2dee0 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20  ingle host.**   
2def0 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a     at a time.**.
2df00 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69  **   *  proxy fi
2df10 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70  le to act as a p
2df20 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76  roxy for the adv
2df30 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d  isory locks norm
2df40 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b  ally.**      tak
2df50 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
2df60 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  se.**.** The con
2df70 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65  ch file - to use
2df80 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73   a proxy file, s
2df90 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74  qlite must first
2dfa0 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68   "hold the conch
2dfb0 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61  ".** by taking a
2dfc0 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73  n sqlite-style s
2dfd0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
2dfe0 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65  e conch file, re
2dff0 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  ading the.** con
2e000 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72  tents and compar
2e010 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75  ing the host's u
2e020 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73  nique host ID (s
2e030 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f  ee below) and lo
2e040 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68  ck.** proxy path
2e050 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c   against the val
2e060 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
2e070 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f  e conch.  The co
2e080 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73  nch file is.** s
2e090 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d  tored in the sam
2e0a0 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
2e0b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e0c0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61   and the file na
2e0d0 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e  me.** is pattern
2e0e0 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ed after the dat
2e0f0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2e100 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61  as ".<databasena
2e110 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49  me>-conch"..** I
2e120 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2e130 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2e140 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74   or it's content
2e150 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
2e160 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e  he.** host ID an
2e170 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c  d/or proxy path,
2e180 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
2e190 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61  s escalated to a
2e1a0 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c  n exclusive.** l
2e1b0 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63  ock and the conc
2e1c0 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  h file contents 
2e1d0 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
2e1e0 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
2e1f0 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e  proxy.** path an
2e200 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f  d the lock is do
2e210 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68  wngraded to a sh
2e220 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e  ared lock again.
2e230 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a    If the conch.*
2e240 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  * is held by ano
2e250 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69  ther process (wi
2e260 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  th a shared lock
2e270 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ), the exclusive
2e280 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61   lock.** will fa
2e290 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  il and SQLITE_BU
2e2a0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
2e2b0 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
2e2c0 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d  file - a single-
2e2d0 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66  byte file used f
2e2e0 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20  or all advisory 
2e2f0 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f  file locks.** no
2e300 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20  rmally taken on 
2e310 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e320 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  e.   This allows
2e330 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e   for safe sharin
2e340 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  g.** of the data
2e350 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75  base file for mu
2e360 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
2e370 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68  nd writers on th
2e380 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28  e same.** host (
2e390 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65  the conch ensure
2e3a0 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20  s that they all 
2e3b0 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  use the same loc
2e3c0 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a  al lock file)..*
2e3d0 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20  *.** Requesting 
2e3e0 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64  the lock proxy d
2e3f0 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74  oes not immediat
2e400 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e  ely take the con
2e410 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c  ch, it is.** onl
2e420 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  y taken when the
2e430 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74   first request t
2e440 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20  o lock database 
2e450 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a  file is made.  .
2e460 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  ** This matches 
2e470 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
2e480 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c   the traditional
2e490 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   locking behavio
2e4a0 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e  r, where.** open
2e4b0 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing a connection
2e4c0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
2e4d0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b  ile does not tak
2e4e0 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a  e a lock on it..
2e4f0 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f  ** The shared lo
2e500 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66  ck and an open f
2e510 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2e520 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e  re maintained un
2e530 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e  til .** the conn
2e540 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
2e550 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64  tabase is closed
2e560 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  . .**.** The pro
2e570 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  xy file and the 
2e580 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65  lock file are ne
2e590 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74  ver deleted so t
2e5a0 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a  hey only need.**
2e5b0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74   to be created t
2e5c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
2e5d0 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a  ey are used..**.
2e5e0 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
2e5f0 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d   options.** ----
2e600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e610 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  -.**.**  SQLITE_
2e620 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2e630 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  KING.**.**      
2e640 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   Database files 
2e650 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d  accessed on non-
2e660 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2e670 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  ms are.**       
2e680 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
2e690 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f  nfigured for pro
2e6a0 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b  xy locking, lock
2e6b0 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20   files are.**   
2e6c0 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61      named automa
2e6d0 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68  tically using th
2e6e0 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a  e same logic as.
2e6f0 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  **       PRAGMA 
2e700 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2e710 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a  ":auto:".**    .
2e720 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  **  SQLITE_PROXY
2e730 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20  _DEBUG.**.**    
2e740 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c     Enables the l
2e750 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20  ogging of error 
2e760 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20  messages during 
2e770 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20  host id file.** 
2e780 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20        retrieval 
2e790 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a  and creation.**.
2e7a0 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  **  LOCKPROXYDIR
2e7b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
2e7c0 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
2e7d0 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65  lt directory use
2e7e0 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79  d for lock proxy
2e7f0 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20   files that.**  
2e800 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61       are named a
2e810 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61  utomatically via
2e820 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65   the ":auto:" se
2e830 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  tting.**.**  SQL
2e840 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
2e850 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
2e860 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72  .**.**       Per
2e870 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20  missions to use 
2e880 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
2e890 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74  directory for st
2e8a0 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  oring the.**    
2e8b0 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69     lock proxy fi
2e8c0 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77  les, only used w
2e8d0 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  hen LOCKPROXYDIR
2e8e0 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20   is not set..** 
2e8f0 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73     .**    .** As
2e900 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
2e910 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  , when compiled 
2e920 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46  with SQLITE_PREF
2e930 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2e940 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  ,.** setting the
2e950 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
2e960 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52  iable SQLITE_FOR
2e970 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2e980 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f   to 1 will.** fo
2e990 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  rce proxy lockin
2e9a0 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  g to be used for
2e9b0 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
2e9c0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64  file opened, and
2e9d0 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65   0.** will force
2e9e0 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79   automatic proxy
2e9f0 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64   locking to be d
2ea00 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20  isabled for all 
2ea10 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2ea20 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c  s (explicity cal
2ea30 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ling the SQLITE_
2ea40 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
2ea50 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73  E pragma or.** s
2ea60 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72  qlite_file_contr
2ea70 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66  ol API is not af
2ea80 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45  fected by SQLITE
2ea90 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2eaa0 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  KING)..*/../*.**
2eab0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2eac0 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
2ead0 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23   on MacOSX .*/.#
2eae0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2eaf0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2eb00 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2eb10 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TYLE../*.** The 
2eb20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2eb30 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68  ext has the path
2eb40 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74   and file struct
2eb50 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d  ures for the rem
2eb60 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61  ote .** and loca
2eb70 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e  l proxy files in
2eb80 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73   it.*/.typedef s
2eb90 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2eba0 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c  ngContext proxyL
2ebb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
2ebc0 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2ebd0 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e  ngContext {.  un
2ebe0 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2ebf0 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  e;         /* Op
2ec00 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  en conch file */
2ec10 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69  .  char *conchFi
2ec20 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  lePath;         
2ec30 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2ec40 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75  onch file */.  u
2ec50 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
2ec60 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  xy;         /* O
2ec70 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  pen proxy lock f
2ec80 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
2ec90 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20  ockProxyPath;   
2eca0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2ecb0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2ecc0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2ecd0 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
2ece0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2ecf0 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
2ed00 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65  */.  int conchHe
2ed10 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2ed20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f    /* 1 if the co
2ed30 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20  nch is held, -1 
2ed40 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  if lockless */. 
2ed50 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e   void *oldLockin
2ed60 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
2ed70 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   Original lockin
2ed80 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74  gcontext to rest
2ed90 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  ore on close */.
2eda0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
2edb0 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64  hods const *pOld
2edc0 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f  Method;     /* O
2edd0 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68  riginal I/O meth
2ede0 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f  ods for close */
2edf0 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  .};../* .** The 
2ee00 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
2ee10 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74  path for the dat
2ee20 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20  abase at dbPath 
2ee30 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2ee40 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68  lPath, .** which
2ee50 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76   must point to v
2ee60 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d  alid, writable m
2ee70 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75  emory large enou
2ee80 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20  gh for a maxLen 
2ee90 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70  length.** file p
2eea0 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ath. .*/.static 
2eeb0 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b  int proxyGetLock
2eec0 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
2eed0 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c  *dbPath, char *l
2eee0 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78  Path, size_t max
2eef0 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Len){.  int len;
2ef00 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20  .  int dbLen;.  
2ef10 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c  int i;..#ifdef L
2ef20 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65  OCKPROXYDIR.  le
2ef30 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
2ef40 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c  h, LOCKPROXYDIR,
2ef50 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a   maxLen);.#else.
2ef60 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57  # ifdef _CS_DARW
2ef70 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
2ef80 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f  .  {.    if( !co
2ef90 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
2efa0 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20  _USER_TEMP_DIR, 
2efb0 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29  lPath, maxLen) )
2efc0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
2efd0 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66  ("GETLOCKPATH  f
2efe0 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25  ailed %s errno=%
2eff0 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  d pid=%d\n",.   
2f000 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74              lPat
2f010 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64  h, errno, getpid
2f020 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ()));.      retu
2f030 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2f040 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LOCK;.    }.    
2f050 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
2f060 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63  ath, "sqliteploc
2f070 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20  ks", maxLen);   
2f080 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c   .  }.# else.  l
2f090 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
2f0a0 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78  th, "/tmp/", max
2f0b0 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65  Len);.# endif.#e
2f0c0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74  ndif..  if( lPat
2f0d0 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b  h[len-1]!='/' ){
2f0e0 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
2f0f0 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d  at(lPath, "/", m
2f100 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20  axLen);.  }.  . 
2f110 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68   /* transform th
2f120 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75  e db path to a u
2f130 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65  nique cache name
2f140 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69   */.  dbLen = (i
2f150 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
2f160 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69  );.  for( i=0; i
2f170 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e  <dbLen && (i+len
2f180 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b  +7)<(int)maxLen;
2f190 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
2f1a0 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20  c = dbPath[i];. 
2f1b0 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20     lPath[i+len] 
2f1c0 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63  = (c=='/')?'_':c
2f1d0 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b  ;.  }.  lPath[i+
2f1e0 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72  len]='\0';.  str
2f1f0 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75  lcat(lPath, ":au
2f200 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  to:", maxLen);. 
2f210 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
2f220 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
2f230 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
2f240 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74  d\n", lPath, get
2f250 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72  pid()));.  retur
2f260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f270 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
2f280 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
2f290 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
2f2a0 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
2f2b0 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
2f2c0 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
2f2d0 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
2f2e0 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
2f2f0 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
2f300 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
2f310 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
2f320 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
2f330 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
2f340 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
2f350 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
2f360 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
2f370 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
2f380 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
2f390 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
2f3a0 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
2f3b0 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
2f3c0 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
2f3d0 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
2f3e0 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
2f3f0 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
2f400 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
2f410 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
2f420 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
2f430 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
2f440 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
2f450 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
2f460 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
2f470 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
2f480 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
2f490 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
2f4a0 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
2f4b0 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
2f4c0 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
2f4d0 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
2f4e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b  ;.        if( mk
2f4f0 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
2f500 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
2f510 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
2f520 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
2f530 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
2f540 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
2f550 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
2f560 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
2f570 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
2f580 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
2f590 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
2f5a0 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
2f5b0 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2f5c0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
2f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5e0 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
2f5f0 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
2f600 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
2f610 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
2f620 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
2f630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f640 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b  }.      start=i+
2f650 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66  1;.    }.    buf
2f660 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69  [i] = lockPath[i
2f670 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  ];.  }.  OSTRACE
2f680 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
2f690 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
2f6a0 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
2f6b0 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
2f6c0 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
2f6d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2f6e0 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
2f6f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
2f700 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
2f710 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
2f720 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
2f730 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
2f740 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
2f750 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
2f760 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
2f770 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
2f780 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
2f790 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
2f7a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
2f7b0 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
2f7c0 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
2f7d0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2f7e0 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
2f7f0 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
2f800 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
2f810 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
2f820 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
2f830 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
2f840 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
2f850 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
2f860 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
2f870 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
2f880 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
2f890 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
2f8a0 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
2f8b0 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
2f8c0 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
2f8d0 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
2f8e0 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
2f8f0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
2f900 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
2f910 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2f920 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2f930 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
2f940 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
2f950 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
2f960 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
2f970 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
2f980 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
2f990 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
2f9a0 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
2f9b0 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
2f9c0 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
2f9d0 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
2f9e0 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
2f9f0 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
2fa00 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
2fa10 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
2fa20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
2fa30 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
2fa40 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
2fa50 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
2fa60 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
2fa70 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
2fa80 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
2fa90 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
2faa0 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
2fab0 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
2fac0 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
2fad0 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
2fae0 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
2faf0 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
2fb00 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2fb10 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
2fb20 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
2fb30 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2fb40 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2fb50 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2fb60 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2fb70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fb80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2fb90 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2fba0 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
2fbb0 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
2fbc0 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
2fbd0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2fbe0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
2fbf0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
2fc00 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
2fc10 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
2fc20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
2fc30 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
2fc40 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
2fc50 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
2fc60 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72  {.        fd = r
2fc70 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
2fc80 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
2fc90 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2fca0 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2fcb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2fcc0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2fcd0 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
2fce0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d  RDONLY;.    fd =
2fcf0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
2fd00 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2fd10 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2fd20 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2fd30 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
2fd40 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  no;.  }.  if( fd
2fd50 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  <0 ){.    if( is
2fd60 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
2fd70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fd80 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
2fd90 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20  switch (terrno) 
2fda0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43  {.      case EAC
2fdb0 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74  CES:.        ret
2fdc0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2fdd0 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a  .      case EIO:
2fde0 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e   .        return
2fdf0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2fe00 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75  CK; /* even thou
2fe10 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e  gh it is the con
2fe20 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61  ch */.      defa
2fe30 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74  ult:.        ret
2fe40 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
2fe50 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
2fe60 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20    }.  .  pNew = 
2fe70 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69  (unixFile *)sqli
2fe80 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2fe90 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
2fea0 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
2feb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2fec0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OMEM;.    goto e
2fed0 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b  nd_create_proxy;
2fee0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
2fef0 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  ew, 0, sizeof(un
2ff00 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77  ixFile));.  pNew
2ff10 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
2ff20 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65  enFlags;.  memse
2ff30 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20  t(&dummyVfs, 0, 
2ff40 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29  sizeof(dummyVfs)
2ff50 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41  );.  dummyVfs.pA
2ff60 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  ppData = (void*)
2ff70 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  &autolockIoFinde
2ff80 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e  r;.  dummyVfs.zN
2ff90 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20  ame = "dummy";. 
2ffa0 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66   pUnused->fd = f
2ffb0 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c  d;.  pUnused->fl
2ffc0 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
2ffd0 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64  .  pNew->pUnused
2ffe0 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20   = pUnused;.  . 
2fff0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
30000 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20  File(&dummyVfs, 
30010 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69  fd, dirfd, (sqli
30020 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
30030 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  path, 0, 0, 0);.
30040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30050 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
30060 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
30070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30080 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
30090 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
300a0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
300b0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
300c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
300d0 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
300e0 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
300f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
30100 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
30110 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
30120 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
30130 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
30140 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
30150 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
30160 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
30170 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
30180 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
30190 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
301a0 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
301b0 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61  gth */../* Not a
301c0 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
301d0 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
301e0 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
301f0 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
30200 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
30210 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
30220 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
30230 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  ;../* get the ho
30240 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
30250 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
30260 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
30270 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
30280 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
30290 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
302a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
302b0 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
302c0 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
302d0 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
302e0 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
302f0 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
30300 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
30310 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
30320 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
30330 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  N);.#if defined(
30340 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49  __MAX_OS_X_VERSI
30350 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29  ON_MIN_REQUIRED)
30360 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
30370 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56   && __MAC_OS_X_V
30380 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
30390 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20  RED<1050.  {.   
303a0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
303b0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
303c0 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
303d0 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
303e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68   */.    if( geth
303f0 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c  ostuuid(pHostID,
30400 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20   &timeout) ){.  
30410 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
30420 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rno;.      if( p
30430 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
30440 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
30450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
30460 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
30470 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
30480 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
30490 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
304a0 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
304b0 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
304c0 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
304d0 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
304e0 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
304f0 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
30500 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
30510 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
30520 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
30530 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
30540 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
30550 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
30560 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
30570 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
30580 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
30590 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
305a0 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
305b0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
305c0 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
305d0 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
305e0 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
305f0 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
30600 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
30610 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
30620 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
30630 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
30640 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
30650 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
30660 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
30670 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
30680 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
30690 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
306a0 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
306b0 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
306c0 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
306d0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
306e0 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
306f0 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
30700 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
30710 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
30720 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
30730 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
30740 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
30750 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
30760 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
30770 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
30780 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
30790 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
307a0 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
307b0 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
307c0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
307d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
307e0 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
307f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
30800 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
30810 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
30820 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
30830 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
30840 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
30850 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
30860 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
30870 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
30880 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
30890 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
308a0 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
308b0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
308c0 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
308d0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
308e0 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
308f0 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
30900 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
30910 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
30920 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
30930 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
30940 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
30950 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
30960 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
30970 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
30980 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
30990 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
309a0 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
309b0 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
309c0 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
309d0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
309e0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
309f0 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
30a00 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
30a10 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
30a20 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
30a30 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
30a40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30a50 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
30a60 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
30a70 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
30a80 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
30a90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
30aa0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
30ab0 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
30ac0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
30ad0 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
30ae0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
30af0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
30b00 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
30b10 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
30b20 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
30b30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30b40 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
30b50 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
30b60 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
30b70 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
30b80 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
30b90 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
30ba0 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
30bb0 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
30bc0 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
30bd0 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
30be0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
30bf0 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20 20 20  O_EXCL),.       
30c00 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
30c10 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
30c20 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
30c30 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
30c40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30c50 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
30c60 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65   errmsg, "create
30c70 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
30c80 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
30c90 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
30ca0 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74   }.  if( osPwrit
30cb0 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
30cc0 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65  en, 0) != (ssize
30cd0 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  _t)readLen ){.  
30ce0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30cf0 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
30d00 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74  ), errmsg, "writ
30d10 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
30d20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
30d30 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
30d40 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
30d50 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
30d60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
30d70 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
30d80 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
30d90 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
30da0 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
30db0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
30dc0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
30dd0 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
30de0 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
30df0 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
30e00 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73   cPath);.  robus
30e10 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63  t_close(pFile, c
30e20 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  onchFile->h, __L
30e30 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46  INE__);.  conchF
30e40 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
30e50 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
30e60 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
30e70 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
30e80 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
30e90 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
30ea0 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  0 ){.      unlin
30eb0 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20  k(tPath);.      
30ec0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
30ed0 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  le, fd, __LINE__
30ee0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
30ef0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
30f00 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74  iled to break st
30f10 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20  ale lock on %s, 
30f20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72  %s\n", cPath, er
30f30 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
30f40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
30f50 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ke the requested
30f60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
30f70 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61  ch file and brea
30f80 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69  k a stale lock i
30f90 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69  f the .** host i
30fa0 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  d matches..*/.st
30fb0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f  atic int proxyCo
30fc0 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
30fd0 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
30fe0 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f  myHostID, int lo
30ff0 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79  ckType){.  proxy
31000 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
31010 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
31020 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31030 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31040 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
31050 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
31060 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
31070 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31080 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65  _OK;.  int nTrie
31090 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  s = 0;.  struct 
310a0 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f  timespec conchMo
310b0 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b  dTime;.  .  do {
310c0 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
310d0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
310e0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
310f0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
31100 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72  ckType);.    nTr
31110 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ies ++;.    if( 
31120 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
31130 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
31140 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
31150 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
31160 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
31170 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
31180 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
31190 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
311a0 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
311b0 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
311c0 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
311d0 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
311e0 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
311f0 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
31200 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
31210 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
31220 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
31230 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
31240 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
31250 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
31260 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
31270 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
31280 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e   if( osFstat(con
31290 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
312a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
312b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
312c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
312d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
312e0 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  R_LOCK;.      }.
312f0 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
31300 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20   nTries==1 ){.  
31310 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
31320 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  me = buf.st_mtim
31330 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75  espec;.        u
31340 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f  sleep(500000); /
31350 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61  * wait 0.5 sec a
31360 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
31370 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20  again*/.        
31380 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
31390 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
313a0 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20  t( nTries>1 );. 
313b0 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f       if( conchMo
313c0 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20  dTime.tv_sec != 
313d0 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
313e0 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20  .tv_sec || .    
313f0 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
31400 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66  e.tv_nsec != buf
31410 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
31420 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20  _nsec ){.       
31430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
31440 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  USY;.      }.   
31450 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
31460 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20  ries==2 ){  .   
31470 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50       char tBuf[P
31480 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
31490 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ];.        int l
314a0 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
314b0 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c  chFile->h, tBuf,
314c0 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
314d0 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  EN, 0);.        
314e0 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
314f0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
31500 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
31510 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
31520 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
31530 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
31540 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
31550 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
31560 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
31570 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
31580 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
31590 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
315a0 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
315b0 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
315c0 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
315d0 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
315e0 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
315f0 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
31600 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
31610 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
31620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31630 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
31640 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
31650 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
31660 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
31670 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
31680 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
31690 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
316a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
316b0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
316c0 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
316d0 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
316e0 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
316f0 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
31700 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
31710 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
31720 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
31730 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
31740 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
31750 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
31760 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
31770 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
31780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31790 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
317a0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
317b0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
317c0 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
317d0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
317e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
317f0 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
31800 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20  _LOCK);         
31810 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
31820 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
31830 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
31840 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
31850 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
31860 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
31870 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
31880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31890 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
318a0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
318b0 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20  && nTries<3 );. 
318c0 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
318d0 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
318e0 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
318f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
31900 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
31910 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
31920 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
31930 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
31940 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
31950 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
31960 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
31970 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
31980 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
31990 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
319a0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
319b0 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
319c0 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
319d0 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
319e0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
319f0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
31a00 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
31a10 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
31a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
31a30 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
31a40 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
31a50 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31a60 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
31a70 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31a80 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
31a90 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
31aa0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
31ab0 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
31ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31ad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
31ae0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
31af0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
31b00 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
31b10 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
31b20 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
31b30 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
31b40 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
31b50 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
31b60 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
31b70 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
31b80 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
31b90 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
31ba0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
31bb0 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
31bc0 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
31bd0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
31be0 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
31bf0 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
31c00 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
31c10 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
31c20 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
31c30 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
31c40 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
31c50 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
31c60 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
31c70 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
31c80 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
31c90 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
31ca0 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
31cb0 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20  etpid()));..    
31cc0 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
31cd0 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
31ce0 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
31cf0 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
31d00 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
31d10 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
31d20 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
31d30 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
31d40 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
31d50 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
31d60 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
31d70 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
31d80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31da0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
31db0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
31dc0 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
31dd0 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
31de0 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
31df0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
31e00 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
31e10 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
31e20 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
31e30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
31e40 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
31e50 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
31e60 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
31e70 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
31e80 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
31e90 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
31ea0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
31eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
31ec0 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
31ed0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
31ee0 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
31ef0 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
31f00 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
31f10 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
31f20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
31f30 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
31f40 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
31f50 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
31f60 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
31f70 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
31f80 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
31f90 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
31fa0 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
31fb0 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
31fc0 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
31fd0 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
31fe0 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
31ff0 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
32000 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
32010 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
32020 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
32030 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
32040 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
32050 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
32060 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
32070 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
32080 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
32090 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
320a0 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
320b0 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
320c0 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
320d0 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
320e0 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
320f0 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
32100 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
32110 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
32120 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
32130 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
32140 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
32150 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
32160 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
32170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32180 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
32190 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
321a0 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
321b0 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
321c0 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
321d0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
321e0 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
321f0 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
32200 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
32210 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
32220 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
32230 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
32240 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
32250 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
32260 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
32270 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
32280 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
32290 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
322a0 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
322b0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
322c0 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
322d0 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
322e0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
322f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
32300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
32310 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
32320 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
32330 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
32340 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
32350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32360 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
32370 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
32380 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
32390 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
323a0 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
323b0 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
323c0 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
323d0 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
323e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
323f0 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
32400 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32410 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
32420 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
32430 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
32440 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
32450 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
32460 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
32470 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
32480 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
32490 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
324a0 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
324b0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
324c0 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
324d0 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
324e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324f0 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
32500 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
32510 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
32520 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
32530 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
32540 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
32550 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
32560 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
32570 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32580 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
32590 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
325a0 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
325b0 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
325c0 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20  n't take it */. 
325d0 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46       if( (conchF
325e0 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
325f0 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20  _RDWR) == 0 ){. 
32600 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32610 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
32620 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
32630 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
32640 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74     .      /* eit
32650 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69  her the conch di
32660 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65  dn't match or we
32670 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
32680 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20  a new one */.   
32690 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
326a0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
326b0 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c         proxyGetL
326c0 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
326d0 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
326e0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
326f0 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
32700 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
32710 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
32720 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
32730 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69  ck path _only_ i
32740 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
32750 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  aken */.      }.
32760 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
32770 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
32780 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
32790 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
327a0 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
327b0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20  .      ** has a 
327c0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65  shared lock alre
327d0 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73  ady), if the hos
327e0 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73  t id matches, us
327f0 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20  e the big.      
32800 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20  ** stick..      
32810 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73  */.      futimes
32820 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e  (conchFile->h, N
32830 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
32840 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21  hostIdMatch && !
32850 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
32860 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68         if( conch
32870 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
32880 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
32890 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
328a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
328b0 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
328c0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
328d0 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
328e0 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
328f0 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70         ** same p
32900 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
32910 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
32920 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   lock. */.      
32930 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32940 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
32950 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20  else {          
32960 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32970 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
32980 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
32990 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
329a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
329b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
329c0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
329d0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
329e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
329f0 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
32a00 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
32a10 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
32a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32a30 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42       char writeB
32a40 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43  uffer[PROXY_MAXC
32a50 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
32a60 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20    int writeSize 
32a70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 0;.        .  
32a80 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65        writeBuffe
32a90 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f  r[0] = (char)PRO
32aa0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b  XY_CONCHVERSION;
32ab0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
32ac0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
32ad0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
32ae0 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
32af0 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
32b00 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
32b10 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c  kProxyPath!=NULL
32b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
32b30 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
32b40 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
32b50 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EX], pCtx->lockP
32b60 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
32b70 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
32b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32b90 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
32ba0 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
32bb0 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50  NDEX], tempLockP
32bc0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
32bd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32be0 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20      writeSize = 
32bf0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
32c00 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42  + strlen(&writeB
32c10 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
32c20 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20  INDEX]);.       
32c30 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
32c40 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
32c50 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
32c60 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
32c70 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
32c80 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
32c90 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
32ca0 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
32cb0 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
32cc0 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
32cd0 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
32ce0 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
32cf0 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
32d00 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
32d10 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
32d20 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
32d30 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
32d40 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
32d50 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
32d60 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
32d70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
32d80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
32d90 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
32da0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
32db0 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
32dc0 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61  int err = osFsta
32dd0 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
32de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32df0 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20   err==0 ){.     
32e00 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d         mode_t cm
32e10 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64  ode = buf.st_mod
32e20 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55  e&(S_IRUSR|S_IWU
32e30 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49  SR | S_IRGRP|S_I
32e40 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20  WGRP |.         
32e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
32e70 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b  _IROTH|S_IWOTH);
32e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32e90 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
32ea0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52   database file R
32eb0 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  /W permissions, 
32ec0 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a  ignore failure *
32ed0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
32ee0 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20  _PROXY_DEBUG.   
32ef0 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f           osFchmo
32f00 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
32f10 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20  cmode);.#else.  
32f20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20            do{.  
32f30 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32f40 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46   osFchmod(conchF
32f50 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
32f60 20 20 20 20 20 20 20 20 20 20 20 20 7d 77 68 69              }whi
32f70 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20  le( rc==(-1) && 
32f80 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
32f90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32fa0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
32fb0 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
32fc0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
32fd0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
32fe0 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
32ff0 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
33000 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
33010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
33020 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  ode, code, strer
33030 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20  ror(code));.    
33040 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
33050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
33060 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33070 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44  fchmod %o SUCCED
33080 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20  ED\n",cmode);.  
33090 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
330a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
330b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
330c0 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
330d0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
330e0 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
330f0 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
33100 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
33110 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c              err,
33120 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
33130 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20  code));.#endif. 
33140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33150 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33160 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
33170 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
33180 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
33190 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
331a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20  LOCK);.      .  
331b0 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a    end_takeconch:
331c0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
331d0 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
331e0 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
331f0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ->h));.      if(
33200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33210 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  & pFile->openFla
33220 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  gs ){.        if
33230 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
33240 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62 75 73  .          robus
33250 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
33260 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
33270 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _);.        }.  
33280 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
33290 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   -1;.        int
332a0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
332b0 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
332c0 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
332d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
332e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
332f0 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
33300 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
33310 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
33320 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64  SPROXY: OPEN  %d
33330 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20  \n", fd));.     
33340 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
33350 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
33360 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20  >h = fd;.       
33370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33380 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54    rc=SQLITE_CANT
33390 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51  OPEN_BKPT; /* SQ
333a0 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79  LITE_BUSY? proxy
333b0 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64  TakeConch called
333c0 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69  .           duri
333d0 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  ng locking */.  
333e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
333f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33400 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78  LITE_OK && !pCtx
33410 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ->lockProxy ){. 
33420 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74         char *pat
33430 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h = tempLockPath
33440 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   ? tempLockPath 
33450 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
33460 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72  yPath;.        r
33470 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
33480 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70  nixFile(path, &p
33490 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20  Ctx->lockProxy, 
334a0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
334b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
334c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
334d0 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50  M && tryOldLockP
334e0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
334f0 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20   /* we couldn't 
33500 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79  create the proxy
33510 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20   lock file with 
33520 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c  the old lock fil
33530 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
33540 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69    ** so try agai
33550 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e  n via auto-namin
33560 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  g .           */
33570 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65  .          force
33580 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  NewLockPath = 1;
33590 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c  .          tryOl
335a0 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
335b0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
335c0 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f  e; /* go back to
335d0 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65   the do {} while
335e0 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72   start point, tr
335f0 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  y again */.     
33600 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33630 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
33640 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69  a copy of path i
33650 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74  f we extracted t
33660 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
33670 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f    ** from the co
33680 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20  nch file or the 
33690 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74  path was allocat
336a0 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a  ed on the stack.
336b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
336c0 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b      if( tempLock
336d0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
336e0 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
336f0 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
33700 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c  bStrDup(0, tempL
33710 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ockPath);.      
33720 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
33730 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
33740 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
33750 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
33760 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33770 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33780 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
337a0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
337b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 1;.        .  
337c0 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
337d0 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
337e0 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
337f0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ods ){.         
33800 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
33810 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20  xt *afpCtx;.    
33820 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28        afpCtx = (
33830 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
33840 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
33850 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
33860 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ext;.          a
33870 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20  fpCtx->dbPath = 
33880 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33890 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ath;.        }. 
338a0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
338b0 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
338c0 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
338d0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
338e0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
338f0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
33900 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41      OSTRACE(("TA
33910 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  KECONCH  %d %s\n
33920 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
33930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f  rc==SQLITE_OK?"o
33950 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20  k":"failed"));. 
33960 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33970 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b      } while (1);
33980 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e   /* in case we n
33990 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68 65  eed to retry the
339a0 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c   :auto: lock fil
339b0 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e - .           
339c0 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
339d0 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65 72  ld never get her
339e0 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68 65  e except via the
339f0 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c   'continue' call
33a00 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  . */.  }.}../*.*
33a10 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
33a20 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
33a30 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
33a40 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
33a50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
33a60 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
33a70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
33a80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33a90 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
33aa0 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
33ab0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
33ac0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33ad0 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
33ae0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
33af0 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
33b00 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
33b10 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
33b20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
33b30 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
33b40 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
33b50 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33b60 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
33b70 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
33b80 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
33b90 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
33ba0 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f  RACE(("RELEASECO
33bb0 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
33bc0 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
33bd0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
33be0 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
33bf0 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
33c00 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
33c10 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
33c20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
33c30 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63  );.  if( pCtx->c
33c40 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
33c50 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
33c60 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
33c70 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
33c80 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
33c90 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74  LOCK);.  }.  pCt
33ca0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
33cb0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
33cc0 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25  LEASECONCH  %d %
33cd0 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
33ce0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
33cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
33d00 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
33d10 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
33d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
33d30 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
33d40 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d  tabase file, com
33d50 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  pute the name of
33d60 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e   its conch file.
33d70 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f  .** Store the co
33d80 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nch filename in 
33d90 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
33da0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
33db0 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  loc()..** Make *
33dc0 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74  pConchPath point
33dd0 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65   to the new name
33de0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
33df0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
33e00 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
33e10 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f  M if unable to o
33e20 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  btain memory..**
33e30 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
33e40 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
33e50 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
33e60 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
33e70 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73  mory.** space is
33e80 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
33e90 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68  d..**.** *pConch
33ea0 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e  Path is set to N
33eb0 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  ULL if a memory 
33ec0 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
33ed0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
33ee0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
33ef0 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
33f00 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
33f10 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29  ar **pConchPath)
33f20 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
33f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
33f50 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d  r */.  int len =
33f60 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
33f70 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20  ath); /* Length 
33f80 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
33f90 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f  name - dbPath */
33fa0 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61  .  char *conchPa
33fb0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
33fc0 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68   /* buffer in wh
33fd0 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
33fe0 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a   conch name */..
33ff0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
34000 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ace for the conc
34010 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  h filename and i
34020 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61  nitialize the na
34030 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e  me to.  ** the n
34040 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ame of the origi
34050 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
34060 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63  e. */  .  *pConc
34070 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74  hPath = conchPat
34080 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  h = (char *)sqli
34090 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b  te3_malloc(len +
340a0 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68   8);.  if( conch
340b0 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Path==0 ){.    r
340c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
340d0 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  EM;.  }.  memcpy
340e0 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61  (conchPath, dbPa
340f0 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20  th, len+1);.  . 
34100 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61   /* now insert a
34110 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20   "." before the 
34120 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72  last / character
34130 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65   */.  for( i=(le
34140 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20  n-1); i>=0; i-- 
34150 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68  ){.    if( conch
34160 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[i]=='/' ){.
34170 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
34180 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
34190 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  }.  conchPath[i]
341a0 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20  ='.';.  while ( 
341b0 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e  i<len ){.    con
341c0 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61  chPath[i+1]=dbPa
341d0 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a  th[i];.    i++;.
341e0 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64    }..  /* append
341f0 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75   the "-conch" su
34200 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65  ffix to the file
34210 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f   */.  memcpy(&co
34220 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d  nchPath[i+1], "-
34230 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73  conch", 7);.  as
34240 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
34250 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20  n(conchPath) == 
34260 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75  len+7 );..  retu
34270 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
34280 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c  ../* Takes a ful
34290 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72  ly configured pr
342a0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  oxy locking-styl
342b0 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  e unix file and 
342c0 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20  switches.** the 
342d0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
342e0 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20  path .*/.static 
342f0 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  int switchLockPr
34300 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65  oxyPath(unixFile
34310 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
34320 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
34330 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34340 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
34350 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
34360 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34370 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a  ontext;.  char *
34380 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  oldPath = pCtx->
34390 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
343a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
343b0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c  _OK;..  if( pFil
343c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
343d0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
343e0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
343f0 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74  .  }  ..  /* not
34400 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68  hing to do if th
34410 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20  e path is NULL, 
34420 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65  :auto: or matche
34430 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 70  s the existing p
34440 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61  ath */.  if( !pa
34450 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27  th || path[0]=='
34460 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70  \0' || !strcmp(p
34470 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c  ath, ":auto:") |
34480 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26  |.    (oldPath &
34490 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61  & !strncmp(oldPa
344a0 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54  th, path, MAXPAT
344b0 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65  HLEN)) ){.    re
344c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
344d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
344e0 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
344f0 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
34500 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f  xy;.    pCtx->lo
34510 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20  ckProxy=NULL;.  
34520 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
34530 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c  d = 0;.    if( l
34540 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29  ockProxy!=NULL )
34550 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50  {.      rc=lockP
34560 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
34570 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
34580 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  ile *)lockProxy)
34590 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
345a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
345b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
345c0 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d  ockProxy);.    }
345d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
345e0 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20  e(oldPath);.    
345f0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
34600 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
34610 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a  trDup(0, path);.
34620 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
34630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69  rc;.}../*.** pFi
34640 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68 61  le is a file tha
34650 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
34660 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70  d by a prior xOp
34670 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68  en call.  dbPath
34680 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
34690 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
346a0 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61  MAXPATHLEN+1 cha
346b0 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e  racters in size.
346c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
346d0 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c  ine find the fil
346e0 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64  ename associated
346f0 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20   with pFile and 
34700 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74  writes it.** int
34710 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74   dbPath..*/.stat
34720 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44  ic int proxyGetD
34730 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
34740 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
34750 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b  , char *dbPath){
34760 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
34770 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46  PPLE__).  if( pF
34780 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
34790 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
347a0 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c  .    /* afp styl
347b0 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72 65  e keeps a refere
347c0 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70 61  nce to the db pa
347d0 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61  th in the filePa
347e0 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a  th field .    **
347f0 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20 2a   of the struct *
34800 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  /.    assert( (i
34810 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  nt)strlen((char*
34820 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34830 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
34840 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
34850 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70  py(dbPath, ((afp
34860 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34870 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34880 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c  ontext)->dbPath,
34890 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
348a0 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
348b0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
348c0 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  od == &dotlockIo
348d0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
348e0 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65  * dot lock style
348f0 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e   uses the lockin
34900 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
34910 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a  re the dot lock.
34920 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68      ** file path
34930 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20   */.    int len 
34940 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
34950 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34960 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e  ontext) - strlen
34970 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29  (DOTLOCK_SUFFIX)
34980 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50  ;.    memcpy(dbP
34990 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
349a0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
349b0 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20  xt, len + 1);.  
349c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c  }else{.    /* al
349d0 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75  l other styles u
349e0 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  se the locking c
349f0 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
34a00 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68  the db file path
34a10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34a20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
34a30 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34a40 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
34a50 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
34a60 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
34a70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34a80 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45  ntext, MAXPATHLE
34a90 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
34aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
34ab0 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c  *.** Takes an al
34ac0 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20  ready filled in 
34ad0 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c  unix file and al
34ae0 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66  ters it so all f
34af0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20  ile locking .** 
34b00 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65  will be performe
34b10 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  d on the local p
34b20 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20  roxy lock file. 
34b30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
34b40 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65  ields.** are pre
34b50 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f  served in the lo
34b60 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f  cking context so
34b70 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
34b80 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a  e restored and .
34b90 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75  ** the unix stru
34ba0 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63  cture properly c
34bb0 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f  leaned up at clo
34bc0 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c  se time:.**  ->l
34bd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a  ockingContext.**
34be0 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73    ->pMethod.*/.s
34bf0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
34c00 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
34c10 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
34c20 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
34c30 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
34c40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34c50 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68  x;.  char dbPath
34c60 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20  [MAXPATHLEN+1]; 
34c70 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
34c80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34c90 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
34ca0 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69  ckPath=NULL;.  i
34cb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34cc0 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c  K;.  .  if( pFil
34cd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
34ce0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
34cf0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34d00 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44  .  }.  proxyGetD
34d10 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
34d20 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b  (pFile, dbPath);
34d30 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
34d40 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
34d50 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
34d60 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20  :auto:") ){.    
34d70 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
34d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b   }else{.    lock
34d90 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74  Path=(char *)pat
34da0 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52  h;.  }.  .  OSTR
34db0 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
34dc0 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
34dd0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
34de0 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63  .           (loc
34df0 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68  kPath ? lockPath
34e00 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
34e10 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74  tpid()));..  pCt
34e20 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
34e30 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
34e40 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
34e50 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
34e60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
34e70 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
34e80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
34e90 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
34ea0 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
34eb0 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
34ec0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
34ed0 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
34ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34ef0 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
34f00 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
34f10 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
34f20 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20  Ctx->conchFile, 
34f30 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
34f40 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
34f50 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e  && ((pFile->open
34f60 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
34f70 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
34f80 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20  if (a) the open 
34f90 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f  flags are not O_
34fa0 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f  RDWR, (b) the co
34fb0 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c  nch isn't there,
34fc0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63   and.      ** (c
34fd0 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  ) the file syste
34fe0 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  m is read-only, 
34ff0 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c  then enable no-l
35000 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20  ocking access.. 
35010 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e       ** Ugh, sin
35020 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30  ce O_RDONLY==0x0
35030 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20  000 we test for 
35040 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e  !O_RDWR since un
35050 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20  ixOpen asserts. 
35060 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65       ** that ope
35070 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65  nFlags will have
35080 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52   only one of O_R
35090 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e  DONLY or O_RDWR.
350a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
350b0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
350c0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
350d0 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66  ct stat conchInf
350e0 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c  o;.      int goL
350f0 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20  ockless = 0;..  
35100 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 70      if( osStat(p
35110 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
35120 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20  th, &conchInfo) 
35130 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
35140 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
35150 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  o;.        if( (
35160 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20  err==ENOENT) && 
35170 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20  (statfs(dbPath, 
35180 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20  &fsInfo) != -1) 
35190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c  ){.          goL
351a0 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66  ockless = (fsInf
351b0 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44  o.f_flags&MNT_RD
351c0 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f  ONLY) == MNT_RDO
351d0 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NLY;.        }. 
351e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
351f0 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20   goLockless ){. 
35200 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
35210 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20  chHeld = -1; /* 
35220 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f  read only FS/ lo
35230 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
35240 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
35250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35260 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d    }  .  if( rc==
35270 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
35280 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74  kPath ){.    pCt
35290 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
352a0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
352b0 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b  up(0, lockPath);
352c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
352d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
352e0 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
352f0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
35300 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20  0, dbPath);.    
35310 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68  if( pCtx->dbPath
35320 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
35330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
35340 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
35350 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35360 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d   ){.    /* all m
35370 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
35380 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63  ed, proxys are c
35390 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67  reated and assig
353a0 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69  ned, .    ** swi
353b0 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
353c0 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
353d0 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e  hod then return.
353e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78  .    */.    pCtx
353f0 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
35400 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
35410 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
35420 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
35430 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
35440 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
35450 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
35460 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
35470 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78  >pMethod = &prox
35480 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  yIoMethods;.  }e
35490 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74  lse{.    if( pCt
354a0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20  x->conchFile ){ 
354b0 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  .      pCtx->con
354c0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
354d0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
354e0 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f  _file *)pCtx->co
354f0 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
35500 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
35510 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
35520 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
35530 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
35540 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
35550 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
35560 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
35570 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69  Path); .    sqli
35580 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
35590 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
355a0 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25  TRANSPROXY  %d %
355b0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  s\n", pFile->h,.
355c0 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
355d0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
355e0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
355f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35600 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
35610 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69  ine handles sqli
35620 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
35630 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72  () calls that ar
35640 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  e specific.** to
35650 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
35660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
35670 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
35680 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
35690 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
356a0 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
356b0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
356c0 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
356d0 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
356e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
356f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
35700 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  ;.      if( pFil
35710 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
35720 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b  roxyIoMethods ){
35730 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f  .        proxyLo
35740 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
35750 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
35760 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
35770 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
35780 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54  ;.        proxyT
35790 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
357a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
357b0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
357c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28   ){.          *(
357d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
357e0 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  rg = pCtx->lockP
357f0 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
35800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35810 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
35820 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f  **)pArg = ":auto
35830 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20  : (not held)";. 
35840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35850 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
35860 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
35870 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pArg = NULL;.   
35880 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
35890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
358a0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
358b0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
358c0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
358d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
358e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
358f0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
35900 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
35910 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  nt isProxyStyle 
35920 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  = (pFile->pMetho
35930 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
35940 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  hods);.      if(
35950 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28   pArg==NULL || (
35960 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
35970 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
35980 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
35990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
359a0 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
359b0 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75  locking - not su
359c0 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20  pported */.     
359d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
359e0 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f  _ERROR /*SQLITE_
359f0 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45  PROTOCOL? SQLITE
35a00 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20  _MISUSE?*/;.    
35a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35a20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
35a30 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
35a40 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e   already off - N
35a50 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOP */.         
35a60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35a70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78  const char *prox
35aa0 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  yPath = (const c
35ab0 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  har *)pArg;.    
35ac0 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
35ad0 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
35ae0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
35af0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20  ntext *pCtx = . 
35b00 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78             (prox
35b10 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
35b20 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
35b30 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
35b40 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41    if( !strcmp(pA
35b50 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20  rg, ":auto:") . 
35b60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43            || (pC
35b70 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35b80 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  h &&.           
35b90 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74      !strncmp(pCt
35ba0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35bb0 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  , proxyPath, MAX
35bc0 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20  PATHLEN)).      
35bd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
35be0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
35bf0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  K;.          }el
35c00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
35c10 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50  rc = switchLockP
35c20 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20  roxyPath(pFile, 
35c30 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
35c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35c60 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78   /* turn on prox
35c70 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  y file locking *
35c80 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
35c90 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
35ca0 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70  nixFile(pFile, p
35cb0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
35cc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35cd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
35ce0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
35cf0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
35d00 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61   0 );  /* The ca
35d10 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20  ll assures that 
35d20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64  only valid opcod
35d30 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20  es are sent */. 
35d40 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
35d50 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75  REACHED*/.  retu
35d60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
35d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e  .}../*.** Within
35d80 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28   this division (
35d90 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  the proxying loc
35da0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
35db0 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75  ion) the procedu
35dc0 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69  res.** above thi
35dd0 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20  s point are all 
35de0 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20  utilities.  The 
35df0 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74  lock-related met
35e00 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  hods of the.** p
35e10 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c  roxy-locking sql
35e20 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f  ite3_io_method o
35e30 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f  bject follow..*/
35e40 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
35e50 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
35e60 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
35e70 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
35e80 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
35e90 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
35ea0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
35eb0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
35ec0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
35ed0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
35ee0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
35ef0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
35f00 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
35f10 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
35f20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
35f30 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
35f40 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
35f50 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
35f60 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
35f70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35f80 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
35f90 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
35fa0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
35fb0 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t) {.  unixFile 
35fc0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
35fd0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
35fe0 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
35ff0 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
36000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36010 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
36020 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
36030 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
36040 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
36050 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
36060 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
36070 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
36080 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
36090 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
360a0 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72  oxy;.      retur
360b0 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  n proxy->pMethod
360c0 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  ->xCheckReserved
360d0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
360e0 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f  le*)proxy, pResO
360f0 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  ut);.    }else{ 
36100 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
36110 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
36120 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b        pResOut=0;
36130 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
36140 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36150 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
36160 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
36170 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
36180 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
36190 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
361a0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
361b0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
361c0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
361d0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
361e0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
361f0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
36200 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
36210 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
36220 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
36230 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
36240 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
36250 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
36260 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
36270 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
36280 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
36290 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
362a0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
362b0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
362c0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
362d0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
362e0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
362f0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
36300 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
36310 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
36320 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
36330 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
36340 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
36350 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
36360 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
36370 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
36380 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
36390 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
363a0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
363b0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
363c0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
363d0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
363e0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
363f0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
36400 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36410 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
36420 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
36430 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
36440 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
36450 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
36460 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
36470 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
36480 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
36490 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
364a0 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
364b0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
364c0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
364d0 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
364e0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
364f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36500 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
36510 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36520 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36530 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
36540 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
36550 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
36560 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
36570 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
36580 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
36590 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20  Proxy;.      rc 
365a0 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
365b0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
365c0 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46  _file*)proxy, eF
365d0 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
365e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
365f0 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c   = proxy->eFileL
36600 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
36610 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65        /* conchHe
36620 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
36630 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ss */.    }.  }.
36640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36650 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
36660 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
36670 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
36680 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
36690 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
366a0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
366b0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
366c0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
366d0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
366e0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
366f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
36700 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
36710 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
36720 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
36730 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
36740 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
36750 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36760 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
36770 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
36780 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
36790 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
367a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
367b0 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
367c0 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
367d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
367e0 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
367f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
36800 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36810 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36820 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36830 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
36840 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
36850 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
36860 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
36870 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
36880 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
36890 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
368a0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
368b0 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  y, eFileLock);. 
368c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
368d0 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65  eLock = proxy->e
368e0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65  FileLock;.    }e
368f0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
36900 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
36910 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
36920 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
36940 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65   a file that use
36950 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a  s proxy locks..*
36960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36970 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
36980 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
36990 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
369a0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
369b0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
369c0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
369d0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
369e0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
369f0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
36a00 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
36a10 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
36a20 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
36a30 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69  roxy;.    unixFi
36a40 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
36a50 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
36a60 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
36a70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
36a80 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20    if( lockProxy 
36a90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
36aa0 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
36ab0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
36ac0 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
36ad0 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  xy, NO_LOCK);.  
36ae0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36af0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
36b00 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
36b10 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
36b20 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
36b30 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
36b40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36b50 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
36b60 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
36b70 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f  ;.      pCtx->lo
36b80 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20  ckProxy = 0;.   
36b90 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68   }.    if( conch
36ba0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  File ){.      if
36bb0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
36bc0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
36bd0 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  = proxyReleaseCo
36be0 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
36bf0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36c00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
36c10 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
36c20 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36c30 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
36c40 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b  ile*)conchFile);
36c50 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36c60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36c70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
36c80 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
36c90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
36ca0 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  e(0, pCtx->lockP
36cb0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
36cc0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36cd0 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
36ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
36cf0 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50  ree(0, pCtx->dbP
36d00 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73  ath);.    /* res
36d10 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61  tore the origina
36d20 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  l locking contex
36d30 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
36d40 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20  en close it */. 
36d50 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
36d60 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d  gContext = pCtx-
36d70 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
36d80 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  xt;.    pFile->p
36d90 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70  Method = pCtx->p
36da0 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73  OldMethod;.    s
36db0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36dc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46  );.    return pF
36dd0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
36de0 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  lose(id);.  }.  
36df0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36e00 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.}....#endif /*
36e10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
36e20 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
36e30 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
36e40 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
36e50 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74  proxy locking st
36e60 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  yle is intended 
36e70 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50  for use with AFP
36e80 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
36e90 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69   And since AFP i
36ea0 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
36eb0 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20   on MacOSX, the 
36ec0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
36ed0 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63   also.** restric
36ee0 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a  ted to MacOSX..*
36ef0 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  * .**.**********
36f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
36f10 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
36f20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
36f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f40 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
36f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36f90 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ****/../*.** Ini
36fa0 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
36fb0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
36fc0 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
36fd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
36fe0 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70  ters all VFS imp
36ff0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
37000 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61   unix-like opera
37010 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
37020 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20    This routine, 
37030 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  and the sqlite3_
37040 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  os_end() routine
37050 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a   that follows,.*
37060 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  * should be the 
37070 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e  only routines in
37080 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20   this file that 
37090 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d  are visible from
370a0 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e   other.** files.
370b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
370c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
370d0 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ce during SQLite
370e0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
370f0 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67  and by a.** sing
37100 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20  le thread.  The 
37110 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
37120 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  n and mutex subs
37130 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a  ystems have not.
37140 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62  ** necessarily b
37150 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
37160 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
37170 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64  e is called, and
37180 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75   so they.** shou
37190 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a  ld not be used..
371a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
371b0 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20  s_init(void){ . 
371c0 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f   /* .  ** The fo
371d0 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65  llowing macro de
371e0 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  fines an initial
371f0 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69  izer for an sqli
37200 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
37210 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    ** The name of
37220 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45   the VFS is NAME
37230 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20  .  The pAppData 
37240 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
37250 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74  a pointer.  ** t
37260 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66  o the "finder" f
37270 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44  unction.  (pAppD
37280 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ata is a pointer
37290 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65   to a pointer be
372a0 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79  cause.  ** silly
372b0 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69   C90 rules prohi
372c0 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d  bit a void* from
372d0 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61   being cast to a
372e0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
372f0 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65  r.  ** and so we
37300 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f   have to go thro
37310 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64  ugh the intermed
37320 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  iate pointer to 
37330 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
37340 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
37350 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  ng with -pedanti
37360 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e  c-errors on GCC.
37370 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
37380 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72  FINDER parameter
37390 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
373a0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
373b0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
373c0 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e  .  ** finder-fun
373d0 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64  ction.  The find
373e0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er-function retu
373f0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
37400 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
37410 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
37420 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
37430 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c  ts the desired l
37440 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61  ocking.  ** beha
37450 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20  viors.  See the 
37460 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74  division above t
37470 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
37480 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20   IOMETHODS.  ** 
37490 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69  macro for additi
374a0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  on information o
374b0 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  n finder-functio
374c0 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ns..  **.  ** Mo
374d0 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c  st finders simpl
374e0 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  y return a point
374f0 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
37500 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
37510 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42  .  ** object.  B
37520 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b  ut the "autolock
37530 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61  IoFinder" availa
37540 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f  ble on MacOSX do
37550 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a  es a little.  **
37560 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b   more than that;
37570 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65   it looks at the
37580 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
37590 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20   that hosts the 
375a0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
375b0 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ile and tries to
375c0 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69   choose an locki
375d0 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70  ng method approp
375e0 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74  riate for.  ** t
375f0 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74  hat filesystem t
37600 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66  ime..  */.  #def
37610 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e  ine UNIXVFS(VFSN
37620 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20  AME, FINDER) {  
37630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37640 20 20 20 20 20 20 5c 0a 20 20 20 20 33 2c 20 20        \.    3,  
37650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37660 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
37670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37680 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
37690 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
376a0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
376b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376c0 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
376d0 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
376e0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37700 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
37710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
37720 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
37730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37740 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20      VFSNAME,    
37750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
37760 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
37770 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37780 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52    (void*)&FINDER
37790 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ,       /* pAppD
377a0 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
377b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
377c0 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
377d0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
377e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
377f0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
37800 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
37810 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
37820 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37830 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37840 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
37850 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
37860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37870 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
37880 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
37890 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
378a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
378b0 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
378c0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
378d0 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
378e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378f0 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
37900 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
37910 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
37920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37930 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
37940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
37950 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
37960 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37970 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
37980 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
37990 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
379a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
379b0 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
379c0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
379d0 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
379e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
379f0 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
37a00 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
37a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
37a30 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
37a40 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
37a50 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37a60 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
37a70 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
37a80 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
37a90 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37aa0 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
37ab0 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
37ac0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
37ad0 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  64 */           
37ae0 5c 0a 20 20 20 20 75 6e 69 78 53 65 74 53 79 73  \.    unixSetSys
37af0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
37b00 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
37b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
37b20 20 20 20 20 75 6e 69 78 47 65 74 53 79 73 74 65      unixGetSyste
37b30 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
37b40 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20  tSystemCall */  
37b50 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
37b60 20 20 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d    unixNextSystem
37b70 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
37b80 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20  SystemCall */   
37b90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
37ba0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
37bb0 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
37bc0 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
37bd0 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
37be0 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
37bf0 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
37c00 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
37c10 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
37c20 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
37c30 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
37c40 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
37c50 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
37c60 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
37c70 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
37c80 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
37c90 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
37ca0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
37cb0 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
37cc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
37cd0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
37ce0 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20   && (OS_VXWORKS 
37cf0 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
37d00 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56  LE__)).    UNIXV
37d10 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
37d20 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
37d30 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
37d40 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
37d50 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
37d60 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
37d70 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
37d80 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
37d90 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
37da0 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37db0 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
37dc0 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
37dd0 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37de0 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20 20 20 70  nix-excl",     p
37df0 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
37e00 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
37e10 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
37e20 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
37e30 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
37e40 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
37e50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
37e60 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
37e70 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
37e80 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
37e90 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
37ea0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
37eb0 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
37ec0 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
37ed0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
37ee0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
37ef0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
37f00 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
37f10 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
37f20 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61  nix-afp",      a
37f30 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fpIoFinder ),.  
37f40 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
37f50 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f  nfs",      nfsIo
37f60 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
37f70 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
37f80 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
37f90 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
37fa0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
37fb0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
37fc0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
37fd0 2f 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  /..  /* Double-c
37fe0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
37ff0 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
38000 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
38010 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
38020 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
38030 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
38040 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
38050 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
38060 61 6c 6c 29 3d 3d 31 36 20 29 3b 0a 0a 20 20 2f  all)==16 );..  /
38070 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56  * Register all V
38080 46 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20  FSes defined in 
38090 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79  the aVfs[] array
380a0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
380b0 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73  <(sizeof(aVfs)/s
380c0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
380d0 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  s)); i++){.    s
380e0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
380f0 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d  ter(&aVfs[i], i=
38100 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  =0);.  }.  retur
38110 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
38120 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
38130 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
38140 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
38150 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61  **.** Some opera
38160 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67  ting systems mig
38170 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f  ht need to do so
38180 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68  me cleanup in th
38190 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74  is routine,.** t
381a0 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69  o release dynami
381b0 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
381c0 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f  objects.  But no
381d0 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68  t on unix..** Th
381e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
381f0 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a  no-op for unix..
38200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
38210 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
38220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
38230 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a  ; .}. .#endif /*
38240 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
38250 2a 2f 0a                                         */.