/ Hex Artifact Content
Login

Artifact 81341980c52a44106b10c1e28a0d5c5247476452:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
12c0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
12d0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
12e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
12f0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1300: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1320: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1330: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1340: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1350: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1360: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1370: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1380: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1390: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
13a0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
13b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
13c0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
13d0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
13e0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
13f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1400: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1410: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1420: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1450: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1460: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1470: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1480: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1490: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
14a0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14b0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14c0: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
14d0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14e0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14f0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1500: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1510: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1520: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1530: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1540: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1550: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1560: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1570: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1580: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1590: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15a0: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
15b0: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
15c0: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
15d0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
15e0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
15f0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1600: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1610: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
1620: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1630: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1640: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1650: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1670: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1680: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1690: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
16a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16b0: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
16c0: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
16d0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
16e0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
16f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1700: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
1710: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
1720: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1730: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1740: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1750: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1760: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1770: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1780: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1790: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
17a0: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
17b0: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
17c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
17d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
17e0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
17f0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1800: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1810: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1820: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1830: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1840: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1850: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1860: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1870: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1880: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1890: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
18a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
18d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
18e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1900: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1910: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1920: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1930: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1950: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1960: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1970: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1980: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1990: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
19a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
19b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
19c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
19d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
19e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1a00: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1a10: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1a20: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1a30: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1a40: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1a50: 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49  entry */.  unixI
1a60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a80: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1a90: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ae0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1af0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b10: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b20: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b40: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b50: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b60: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b70: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1b80: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bb0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1bc0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bd0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1be0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1bf0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c00: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c10: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c20: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c50: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c70: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c90: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1ca0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cd0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1ce0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1cf0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d20: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d30: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1d90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1da0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1dd0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1de0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e40: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e70: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e80: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1e90: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ea0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1eb0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ec0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ed0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ee0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1ef0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f00: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f10: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f20: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f30: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f50: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f60: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f70: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f80: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1f90: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fa0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fb0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fc0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fd0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1fe0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1ff0: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2000: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2010: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2020: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2030: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2040: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2050: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2060: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2070: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2080: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20a0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20b0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20c0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20d0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20e0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
20f0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2100: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2110: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2120: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2130: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2140: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2160: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2170: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2180: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2190: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21a0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21c0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21d0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21e0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
21f0: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2200: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2210: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2220: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2230: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2240: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2250: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2260: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2270: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2280: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2290: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22a0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
22b0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
22c0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
22d0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
22e0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
22f0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2300: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2310: 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   mode */.#define
2320: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2330: 43 20 20 20 20 20 30 78 30 38 20 20 20 20 20 2f  C     0x08     /
2340: 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63  * Directory sync
2350: 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a   needed */../*.*
2360: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
2370: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
2380: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
2390: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
23a0: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
23b0: 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75  ** Define variou
23c0: 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72  s macros that ar
23d0: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73  e missing from s
23e0: 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ome systems..*/.
23f0: 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  #ifndef O_LARGEF
2400: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
2410: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
2420: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2430: 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e  DISABLE_LFS.# un
2440: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
2450: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
2460: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2470: 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  fndef O_NOFOLLOW
2480: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f  .# define O_NOFO
2490: 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69  LLOW 0.#endif.#i
24a0: 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23  fndef O_BINARY.#
24b0: 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59   define O_BINARY
24c0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
24d0: 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61   The threadid ma
24e0: 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20  cro resolves to 
24f0: 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72  the thread-id or
2500: 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72   to 0.  Used for
2510: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
2520: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
2530: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
2540: 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65  READSAFE.#define
2550: 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61   threadid pthrea
2560: 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23  d_self().#else.#
2570: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
2580: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2590: 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73  Different Unix s
25a0: 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f  ystems declare o
25b0: 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65  pen() in differe
25c0: 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75  nt ways.  Same u
25d0: 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74  se.** open(const
25e0: 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f   char*,int,mode_
25f0: 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20  t).  Others use 
2600: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
2610: 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68  ,int,...)..** Th
2620: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  e difference is 
2630: 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75  important when u
2640: 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  sing a pointer t
2650: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  o the function..
2660: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74  **.** The safest
2670: 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74   way to deal wit
2680: 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  h the problem is
2690: 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74   to always use t
26a0: 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77  his wrapper.** w
26b0: 68 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20  hich always has 
26c0: 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65  the same well-de
26d0: 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e  fined interface.
26e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26f0: 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63  osixOpen(const c
2700: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
2710: 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29  flags, int mode)
2720: 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28  {.  return open(
2730: 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f  zFile, flags, mo
2740: 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  de);.}../* Forwa
2750: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
2760: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
2770: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
2780: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a  har*, int*);../*
2790: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
27a0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
27b0: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
27c0: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
27d0: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
27e0: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
27f0: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
2800: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
2810: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
2820: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
2830: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
2840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
2850: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
2860: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
2870: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
2880: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
2890: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
28a0: 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c  ruct unix_syscal
28b0: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
28c0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
28d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
28e0: 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f  he sytem call */
28f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2900: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
2910: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
2920: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
2930: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
2940: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
2950: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
2960: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
2970: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b  yscall[] = {.  {
2980: 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20   "open",        
2990: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
29a0: 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c  l_ptr)posixOpen,
29b0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
29c0: 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e  osOpen      ((in
29d0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
29e0: 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61  ,int,int))aSysca
29f0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
2a00: 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20  .  { "close",   
2a10: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2a20: 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c  scall_ptr)close,
2a30: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2a40: 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20  ine osClose     
2a50: 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53  ((int(*)(int))aS
2a60: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
2a70: 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73  nt)..  { "access
2a80: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2a90: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63  3_syscall_ptr)ac
2aa0: 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a  cess,     0  },.
2ab0: 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73  #define osAccess
2ac0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
2ad0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53  st char*,int))aS
2ae0: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
2af0: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64  nt)..  { "getcwd
2b00: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2b10: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
2b20: 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  tcwd,     0  },.
2b30: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64  #define osGetcwd
2b40: 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63      ((char*(*)(c
2b50: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
2b60: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
2b70: 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20  t)..  { "stat", 
2b80: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2b90: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61  _syscall_ptr)sta
2ba0: 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  t,       0  },.#
2bb0: 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20  define osStat   
2bc0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2bd0: 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73  t char*,struct s
2be0: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34  tat*))aSyscall[4
2bf0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a  ].pCurrent)../*.
2c00: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
2c10: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
2c20: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
2c30: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
2c40: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
2c50: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
2c60: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
2c70: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
2c80: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
2c90: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
2ca0: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2cb0: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
2cc0: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
2cd0: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
2ce0: 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64   is DOS - what d
2cf0: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
2d00: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
2d10: 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20  __.  { "fstat", 
2d20: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
2d30: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2d40: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28  #define osFstat(
2d50: 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73  a,b,c)    0.#els
2d60: 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61  e     .  { "fsta
2d70: 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  t",        (sqli
2d80: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2d90: 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d  fstat,      0  }
2da0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
2db0: 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  t     ((int(*)(i
2dc0: 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  nt,struct stat*)
2dd0: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
2de0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20  rrent).#endif.. 
2df0: 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20   { "ftruncate", 
2e00: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2e10: 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74  all_ptr)ftruncat
2e20: 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  e,  0  },.#defin
2e30: 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28  e osFtruncate ((
2e40: 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74  int(*)(int,off_t
2e50: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
2e60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
2e70: 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71  ntl",        (sq
2e80: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2e90: 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20  r)fcntl,      0 
2ea0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
2eb0: 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ntl     ((int(*)
2ec0: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
2ed0: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
2ee0: 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c  nt)..  { "read",
2ef0: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2f00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65  3_syscall_ptr)re
2f10: 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  ad,       0  },.
2f20: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20  #define osRead  
2f30: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
2f40: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
2f50: 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  t))aSyscall[8].p
2f60: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2f70: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
2f80: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
2f90: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2fa0: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
2fb0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2fc0: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20  call_ptr)pread, 
2fd0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
2fe0: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
2ff0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3000: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3010: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3020: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
3030: 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ad     ((ssize_t
3040: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
3050: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
3060: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
3070: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3080: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
3090: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
30a0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
30b0: 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20  _ptr)pread64,   
30c0: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
30d0: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
30e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
30f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3100: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
3110: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34  define osPread64
3120: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3130: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3140: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
3150: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
3160: 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20    { "write",    
3170: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3180: 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20  call_ptr)write, 
3190: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
31a0: 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28  ne osWrite     (
31b0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
31c0: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
31d0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d  _t))aSyscall[11]
31e0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
31f0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3200: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
3210: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3220: 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  E.  { "pwrite", 
3230: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3240: 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74  yscall_ptr)pwrit
3250: 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  e,     0  },.#el
3260: 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  se.  { "pwrite",
3270: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3280: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3290: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
32a0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
32b0: 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65  write    ((ssize
32c0: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
32d0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
32e0: 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20  _t))\.          
32f0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
3300: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
3310: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
3320: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
3330: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
3340: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3350: 70 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20  ptr)pwrite64,   
3360: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3370: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
3380: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3390: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
33a0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
33b0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34  efine osPwrite64
33c0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
33d0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
33e0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e     aSyscall[13].
3410: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
3420: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3430: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3440: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
3450: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3460: 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20  ptr)fchmod,     
3470: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3480: 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20  "fchmod",       
3490: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
34a0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
34b0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
34c0: 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20  efine osFchmod  
34d0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d    ((int(*)(int,m
34e0: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
34f0: 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  14].pCurrent)..#
3500: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
3510: 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
3520: 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
3530: 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61  ALLOCATE.  { "fa
3540: 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71  llocate",    (sq
3550: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3560: 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  r)posix_fallocat
3570: 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  e,  0 },.#else. 
3580: 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20   { "fallocate", 
3590: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
35a0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
35b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
35c0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
35d0: 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28  Fallocate ((int(
35e0: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66  *)(int,off_t,off
35f0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d  _t))aSyscall[15]
3600: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3610: 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20  "unlink",       
3620: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3630: 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20  _ptr)unlink,    
3640: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
3650: 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20  ine osUnlink    
3660: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
3670: 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  har*))aSyscall[1
3680: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3690: 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  { "openDirectory
36a0: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
36b0: 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44  yscall_ptr)openD
36c0: 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30  irectory,      0
36d0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
36e0: 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e  enDirectory ((in
36f0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3700: 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  ,int*))aSyscall[
3710: 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  17].pCurrent)..}
3720: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
3730: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
3740: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
3750: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
3760: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
3770: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
3780: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
3790: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
37a0: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
37b0: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
37c0: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
37d0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
37e0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
37f0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
3800: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
3810: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
3820: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
3830: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
3840: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
3850: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
3860: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
3870: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
3880: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
3890: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
38a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
38b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
38c0: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
38d0: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
38e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
38f0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
3900: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
3910: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
3920: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
3930: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
3940: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3950: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
3960: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
3970: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
3980: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
3990: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
39a0: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
39b0: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
39c0: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
39d0: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
39e0: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
39f0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
3a00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3a10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
3a20: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
3a30: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
3a40: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
3a50: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
3a60: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
3a70: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
3a80: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
3a90: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
3aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
3ac0: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
3ad0: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
3ae0: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
3af0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
3b00: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
3b10: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
3b20: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
3b30: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
3b40: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
3b50: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
3b60: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
3b70: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
3b80: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
3b90: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
3ba0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
3bb0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
3bc0: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
3bd0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
3be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
3bf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3c00: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
3c10: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
3c20: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
3c30: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
3c40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3c50: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
3c60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3c80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
3c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3ca0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
3cb0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
3cc0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
3cd0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
3ce0: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
3cf0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
3d00: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
3d10: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
3d20: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
3d30: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
3d40: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
3d50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
3d60: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
3d70: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
3d80: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
3d90: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
3da0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
3db0: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
3dc0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
3dd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
3de0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
3df0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
3e00: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
3e10: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
3e20: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
3e30: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
3e40: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
3e50: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
3e60: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
3e70: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
3e80: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
3e90: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
3ea0: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
3eb0: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
3ec0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
3ed0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
3ee0: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
3ef0: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
3f00: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
3f10: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
3f20: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
3f30: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
3f40: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
3f50: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
3f60: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
3f70: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
3f80: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
3f90: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
3fa0: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
3fb0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
3fc0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
3fd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3fe0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
3ff0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
4000: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4010: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4020: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
4030: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4040: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
4050: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
4060: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
4070: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4080: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
4090: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
40a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
40b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  ;.}../*.** Retry
40c0: 20 6f 70 65 6e 28 29 20 63 61 6c 6c 73 20 74 68   open() calls th
40d0: 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45  at fail due to E
40e0: 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69  INTR.*/.static i
40f0: 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63  nt robust_open(c
4100: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
4110: 74 20 66 2c 20 69 6e 74 20 6d 29 7b 0a 20 20 69  t f, int m){.  i
4120: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
4130: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b  = osOpen(z,f,m);
4140: 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
4150: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
4160: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4170: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
4180: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
4190: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
41a0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
41b0: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
41c0: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
41d0: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e  o protect the un
41e0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a  ixInodeInfo and.
41f0: 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ** vxworksFileId
4200: 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
4210: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
4220: 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
4230: 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75  .** shared by mu
4240: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
4250: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75  **.** Function u
4260: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
4270: 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
4280: 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
4290: 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
42a0: 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
42b0: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
42c0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
42d0: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
42e0: 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
42f0: 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
4300: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
4310: 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
4320: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
4330: 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  );.**   unixEnte
4340: 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74  rLeave().*/.stat
4350: 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65  ic void unixEnte
4360: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
4370: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
4380: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
4390: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
43a0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
43b0: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
43c0: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
43d0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
43e0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
43f0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
4400: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
4410: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
4420: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4430: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75  BUG.static int u
4440: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  nixMutexHeld(voi
4450: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
4460: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4470: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
4480: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
4490: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
44a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64  .}.#endif...#ifd
44b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
44c0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
44d0: 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69  ction for printi
44e0: 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66  ng out trace inf
44f0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65  ormation from de
4500: 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72  bugging.** binar
4510: 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e  ies. This return
4520: 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  s the string rep
4530: 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  resetation of th
4540: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
4550: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
4560: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4570: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
4580: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
4590: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
45a0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
45b0: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
45c0: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
45d0: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
45e0: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
45f0: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
4600: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
4610: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
4620: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
4630: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
4640: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
4650: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
4660: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
4670: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
4680: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
4690: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
46a0: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
46b0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
46c0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
46d0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
46e0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
46f0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4700: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
4710: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
4720: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
4730: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
4740: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
4750: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
4760: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
4770: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
4780: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
4790: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
47a0: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
47b0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
47c0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
47d0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
47e0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
47f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
4800: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
4810: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
4820: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
4830: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
4840: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
4850: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
4860: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
4870: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
4880: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
4890: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
48a0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
48b0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
48c0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
48d0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
48e0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
48f0: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
4900: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
4910: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
4920: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
4930: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
4940: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
4950: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
4960: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
4970: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
4980: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
4990: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
49a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
49b0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
49c0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
49d0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
49e0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
49f0: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
4a00: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
4a10: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4a20: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
4a30: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
4a40: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
4a50: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
4a60: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
4a70: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
4a80: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
4a90: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
4aa0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
4ab0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
4ac0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
4ad0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
4ae0: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
4af0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
4b00: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
4b10: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
4b20: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
4b30: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4b40: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
4b50: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
4b60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4b70: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
4b80: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4b90: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
4ba0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
4bb0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
4bc0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
4bd0: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
4be0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
4bf0: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
4c00: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4c10: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
4c20: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
4c30: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
4c40: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
4c50: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
4c60: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
4c70: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
4c80: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
4c90: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
4ca0: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
4cb0: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
4cc0: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
4cd0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
4ce0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
4cf0: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
4d00: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
4d10: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
4d20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
4d30: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
4d40: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
4d50: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
4d60: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
4d70: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
4d80: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
4d90: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
4da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4db0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4dc0: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
4dd0: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
4de0: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
4df0: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
4e00: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
4e10: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
4e20: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
4e30: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
4e40: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
4e50: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
4e60: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
4e70: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
4e80: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
4e90: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
4ea0: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
4eb0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
4ec0: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
4ed0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
4ee0: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
4ef0: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
4f00: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
4f10: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
4f20: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
4f30: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
4f40: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
4f50: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
4f60: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
4f70: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
4f80: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
4f90: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
4fa0: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
4fb0: 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28  rr) {.  switch (
4fc0: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69  posixError) {.#i
4fd0: 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  f 0.  /* At one 
4fe0: 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20  point this code 
4ff0: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65  was not commente
5000: 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79  d out. In theory
5010: 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  , this branch.  
5020: 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ** should never 
5030: 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20  be hit, as this 
5040: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
5050: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
5060: 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  fter.  ** a lock
5070: 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63  ing-related func
5080: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c  tion (i.e. fcntl
5090: 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64  ()) has returned
50a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20   non-zero with. 
50b0: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
50c0: 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69   errno as the fi
50d0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69  rst argument. Si
50e0: 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c  nce a system cal
50f0: 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20  l has failed,.  
5100: 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20  ** errno should 
5110: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a  be non-zero..  *
5120: 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74  *.  ** Despite t
5130: 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65  his, if errno re
5140: 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65  ally is zero, we
5150: 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e   still don't wan
5160: 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  t to return.  **
5170: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
5180: 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c  system call fail
5190: 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53  ed, and *some* S
51a0: 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75  QLite error shou
51b0: 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61  ld be.  ** propa
51c0: 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68  gated back to th
51d0: 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e  e caller. Commen
51e0: 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68  ting this branch
51f0: 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f   out means errno
5200: 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ==0.  ** will be
5210: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
5220: 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20  "default:" case 
5230: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  below..  */.  ca
5240: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
5250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
5260: 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41  dif..  case EAGA
5270: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
5280: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
5290: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
52a0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
52b0: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
52c0: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
52d0: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
52e0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
52f0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
5300: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
5310: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
5320: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
5330: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
5340: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
5350: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
5360: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
5370: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
5380: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
5390: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
53a0: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
53b0: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
53c0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
53d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
53e0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
53f0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
5400: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  _UNLOCK) || ..(s
5410: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
5420: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
5430: 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f  K) ||..(sqliteIO
5440: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
5450: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
5460: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
5470: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5480: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
5490: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
54a0: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
54b0: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
54c0: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
54d0: 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69   .  /* EDEADLK i
54e0: 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
54f0: 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e  if a call to fcn
5500: 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20  tl(F_SETLKW) is 
5510: 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74  made. And.  ** t
5520: 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72  his module never
5530: 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61   makes such a ca
5540: 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65  ll. And the code
5550: 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c   in SQLite itsel
5560: 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20  f .  ** asserts 
5570: 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52  that SQLITE_IOER
5580: 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76  R_BLOCKED is nev
5590: 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72  er returned. For
55a0: 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20   these reasons. 
55b0: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73   ** this case is
55c0: 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
55d0: 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74  out. If the syst
55e0: 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e  em does set errn
55f0: 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20  o to EDEADLK,.  
5600: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53  ** the default S
5610: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
5620: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74  code will be ret
5630: 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a  urned. */.#if 0.
5640: 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a    case EDEADLK:.
5650: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5660: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b  E_IOERR_BLOCKED;
5670: 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
5680: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
5690: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
56a0: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
56b0: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
56c0: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
56d0: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
56e0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
56f0: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
5700: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
5710: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
5720: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
5730: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
5740: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
5750: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
5760: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
5770: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
5780: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
5790: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
57a0: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
57b0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
57c0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
57d0: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
57e0: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
57f0: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
5800: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
5810: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
5820: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
5830: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66  case ENOENT:.#if
5840: 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20  def ESTALE      
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5860: 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20  * ESTALE is not 
5870: 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72  defined on Inter
5880: 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ix systems */.  
5890: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e  case ESTALE:.#en
58a0: 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  dif.  case ENOSY
58b0: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
58c0: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
58d0: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
58e0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
58f0: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
5900: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
5910: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
5920: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a  rr;.  }.}..../**
5930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
5980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
5990: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
59a0: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
59b0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
59d0: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
59e0: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
59f0: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
5a00: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
5a10: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
5a20: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
5a30: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
5a40: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
5a50: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
5a60: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
5a70: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
5a80: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
5a90: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
5aa0: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
5ab0: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
5ac0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
5ad0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
5ae0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
5af0: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
5b00: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
5b10: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
5b20: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
5b30: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
5b40: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
5b50: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
5b60: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
5b70: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
5b80: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5b90: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
5ba0: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
5bb0: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
5bc0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
5bd0: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
5be0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
5bf0: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
5c00: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
5c10: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
5c20: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
5c30: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
5c40: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
5c50: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
5c60: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
5c70: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
5c80: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
5c90: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
5ca0: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
5cb0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
5cc0: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
5cd0: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
5ce0: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
5cf0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d10: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
5d20: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
5d30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
5d60: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
5d70: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
5d80: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
5d90: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
5da0: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
5db0: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
5dc0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
5dd0: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
5de0: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
5df0: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
5e00: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
5e10: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
5e20: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
5e30: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
5e40: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
5e50: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
5e60: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
5e70: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
5e80: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
5e90: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
5ea0: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
5eb0: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
5ec0: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
5ed0: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
5ee0: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
5ef0: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
5f00: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
5f10: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
5f20: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
5f30: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
5f40: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
5f50: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
5f60: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
5f70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
5f80: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
5f90: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
5fa0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5fb0: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
5fc0: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
5fd0: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
5fe0: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
5ff0: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
6000: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
6010: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
6020: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
6030: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
6040: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
6050: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
6060: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
6070: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
6080: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
6090: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
60a0: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
60b0: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
60c0: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
60d0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
60e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
60f0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
6100: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
6110: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
6120: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6130: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
6140: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
6150: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
6160: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
6170: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
6180: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
61a0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
61b0: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
61c0: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
61d0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
61e0: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
61f0: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
6200: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
6210: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
6220: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
6230: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
6240: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
6250: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
6260: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
6270: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
6280: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
6290: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
62a0: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
62b0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
62c0: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
62d0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
62e0: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
62f0: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
6300: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
6310: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6320: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
6330: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6340: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
6350: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6360: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
6370: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
6380: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
6390: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
63a0: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
63b0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
63c0: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
63d0: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
63e0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
63f0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6400: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
6410: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
6420: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
6430: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
6440: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6460: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
6470: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
6480: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
6490: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
64a0: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
64b0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
64c0: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
64d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
64e0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
64f0: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
6500: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
6510: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
6520: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
6530: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
6540: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
6550: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
6560: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
6570: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
6580: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
6590: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
65a0: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
65b0: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
65c0: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
65d0: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
65e0: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
65f0: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
6600: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
6610: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
6620: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6630: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
6640: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
6650: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
6660: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
6670: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
6680: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
6690: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
66a0: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
66b0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
66c0: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
66d0: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
66e0: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
66f0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
6700: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6710: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
6720: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
6730: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
6740: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
6750: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
6760: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
6770: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
6780: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
6790: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
67a0: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
67b0: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
67c0: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
67d0: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
67e0: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
67f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
6800: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
6810: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
6820: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
6830: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
6840: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6850: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
6860: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
6870: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
6880: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6890: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
68a0: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
68b0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
68c0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
68d0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
68e0: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
68f0: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
6900: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
6910: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
6920: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
6930: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
6940: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
6950: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
6960: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
6970: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
6980: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
6990: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
69a0: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
69b0: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
69c0: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
69d0: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
69e0: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
69f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
6a00: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
6a10: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
6a20: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
6a30: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
6a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
6a50: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
6a60: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
6a70: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
6b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b40: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
6b50: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
6b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
6b80: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
6b90: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
6ba0: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
6bb0: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
6bc0: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
6bd0: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
6be0: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
6bf0: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
6c00: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
6c10: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
6c20: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
6c30: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
6c40: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
6c50: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
6c60: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
6c70: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
6c80: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
6c90: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
6ca0: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
6cb0: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
6cc0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
6cd0: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
6ce0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
6cf0: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
6d00: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
6d10: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
6d20: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
6d30: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
6d40: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
6d50: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
6d60: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
6d70: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
6d80: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
6d90: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
6da0: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
6db0: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
6dc0: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
6dd0: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
6de0: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
6df0: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
6e00: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
6e10: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
6e20: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
6e30: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
6e40: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
6e50: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
6e60: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
6e70: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
6e80: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
6e90: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
6ea0: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
6eb0: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
6ec0: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
6ed0: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
6ee0: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
6ef0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
6f00: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
6f10: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
6f20: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
6f30: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
6f40: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
6f50: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
6f60: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
6f70: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
6f80: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
6f90: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
6fa0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
6fb0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
6fc0: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
6fd0: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
6fe0: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
6ff0: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
7000: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
7010: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
7020: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
7030: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
7040: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
7050: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
7060: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
7070: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
7080: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
7090: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
70a0: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
70b0: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
70c0: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
70d0: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
70e0: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
70f0: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
7100: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
7110: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
7120: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
7130: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
7140: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
7150: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
7160: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
7170: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
7180: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
7190: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
71a0: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
71b0: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
71c0: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
71d0: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
71e0: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
71f0: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
7200: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
7210: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
7220: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
7230: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
7240: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
7250: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
7260: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
7270: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
7280: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
7290: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
72a0: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
72b0: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
72c0: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
72d0: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
72e0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
72f0: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
7300: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
7310: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
7320: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
7330: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
7340: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
7350: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
7360: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
7370: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
7380: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
7390: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
73a0: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
73b0: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
73c0: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
73d0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
73e0: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
73f0: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
7400: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
7410: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
7420: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
7430: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
7440: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7450: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
7460: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
7470: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
7480: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
7490: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
74a0: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
74b0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
74c0: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
74d0: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
74e0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
74f0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
7500: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
7510: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
7520: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
7530: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
7540: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
7550: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
7560: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
7570: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
7580: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
7590: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
75a0: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
75b0: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
75c0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
75d0: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
75e0: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
75f0: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
7600: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
7610: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
7620: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
7630: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
7640: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
7650: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
7660: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
7670: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
7680: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
7690: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
76a0: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
76b0: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
76c0: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
76d0: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
76e0: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
76f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
7700: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
7710: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
7720: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
7730: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
7740: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
7750: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
7760: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
7770: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
7780: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
7790: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
77a0: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
77b0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
77c0: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
77d0: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
77e0: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
77f0: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
7800: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
7810: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
7820: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
7830: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
7840: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
7850: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
7860: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
7870: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
7880: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
7890: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
78a0: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
78b0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
78c0: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
78d0: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
78e0: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
78f0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
7900: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
7910: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
7920: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
7930: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
7940: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
7950: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
7960: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
7970: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
7980: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
7990: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
79a0: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
79b0: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
79c0: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
79d0: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
79e0: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
79f0: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
7a00: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
7a10: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
7a20: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
7a30: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
7a40: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
7a50: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
7a60: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
7a70: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
7a80: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
7a90: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
7aa0: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
7ab0: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
7ac0: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
7ad0: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
7ae0: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
7af0: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
7b00: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
7b10: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
7b20: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
7b30: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
7b40: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
7b50: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
7b60: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
7b70: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
7b80: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
7b90: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
7ba0: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
7bb0: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
7bc0: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
7bd0: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
7be0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
7bf0: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
7c00: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
7c10: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
7c20: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
7c30: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
7c40: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
7c50: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
7c60: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
7c70: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
7c80: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
7c90: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
7ca0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
7cb0: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
7cc0: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
7cd0: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
7ce0: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
7cf0: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
7d00: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
7d10: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
7d20: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
7d30: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
7d40: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
7d50: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
7d60: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
7d70: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
7d80: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
7d90: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
7da0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
7db0: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
7dc0: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
7dd0: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
7de0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
7df0: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
7e00: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
7e10: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
7e20: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
7e30: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
7e40: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
7e50: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
7e60: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
7e70: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
7e80: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
7e90: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
7ea0: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
7ed0: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
7ee0: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
7ef0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
7f00: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
7f10: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
7f20: 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74  */.#else.  ino_t
7f30: 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20   ino;           
7f40: 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20         /* Inode 
7f50: 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66  number */.#endif
7f60: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
7f70: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
7f80: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
7f90: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  e is allocated f
7fa0: 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20  or each open.** 
7fb0: 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c  inode.  Or, on L
7fc0: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65  inuxThreads, the
7fd0: 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  re is one of the
7fe0: 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  se structures fo
7ff0: 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20  r.** each inode 
8000: 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74  opened by each t
8010: 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  hread..**.** A s
8020: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
8030: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
8040: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
8050: 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  so each unixFile
8060: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f  .** structure co
8070: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
8080: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
8090: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61  of this object a
80a0: 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63  nd this.** objec
80b0: 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20  t keeps a count 
80c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
80d0: 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69   unixFile pointi
80e0: 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72  ng to it..*/.str
80f0: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
8100: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
8110: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
8120: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
8130: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
8140: 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   nShared;       
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8160: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
8170: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
8180: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65   unsigned char e
8190: 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  FileLock;       
81a0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
81b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
81c0: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
81d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50  unsigned char bP
81e0: 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20  rocessLock;     
81f0: 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20  /* An exclusive 
8200: 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20  process lock is 
8210: 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  held */.  int nR
8220: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
8230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8240: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
8250: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
8260: 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  e */.  unixShmNo
8270: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
8280: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
8290: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
82a0: 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f  ed with this ino
82b0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63  de */.  int nLoc
82c0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
82d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
82e0: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
82f0: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20   file locks */. 
8300: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
8310: 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20  Unused;         
8320: 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20   /* Unused file 
8330: 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63  descriptors to c
8340: 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  lose */.  unixIn
8350: 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20  odeInfo *pNext; 
8360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
8370: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  t of all unixIno
8380: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  deInfo objects *
8390: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
83a0: 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20  o *pPrev;       
83b0: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
83c0: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
83d0: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
83e0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
83f0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
8400: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
8410: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
8420: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
8430: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ck */.#endif.#if
8440: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
8450: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8470: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
8480: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
8490: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
84a0: 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e  THNAME+2];  /* N
84b0: 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61  ame of that sema
84c0: 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  phore */.#endif.
84d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  };../*.** A list
84e0: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  s of all unixIno
84f0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a  deInfo objects..
8500: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e  */.static unixIn
8510: 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69  odeInfo *inodeLi
8520: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a  st = 0;../*.**.*
8530: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8540: 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78  - unixLogError_x
8550: 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  (), is only ever
8560: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
8570: 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67  macro.** unixLog
8580: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Error()..**.** I
8590: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  t is invoked aft
85a0: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
85b0: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
85c0: 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68  tion and errno h
85d0: 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20  as been.** set. 
85e0: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
85f0: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
8600: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
8610: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
8620: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61  ue of.** errno a
8630: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
8640: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
8650: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
8660: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
8670: 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  r.** strerror_r(
8680: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  )..**.** The fir
8690: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
86a0: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
86b0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
86c0: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
86d0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
86e0: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
86f0: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
8700: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
8710: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
8720: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
8730: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
8740: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
8750: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
8760: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28  that.** failed (
8770: 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22  e.g. "unlink", "
8780: 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74  open") and the t
8790: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
87a0: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
87b0: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
87c0: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
87d0: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
87e0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
87f0: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
8800: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8810: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
8820: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
8850: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
8860: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
8870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8880: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
8890: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
88a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
88b0: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
88c0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
88d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
88e0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
88f0: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
8900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8910: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
8920: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
8930: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
8940: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8960: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
8970: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
8980: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
8990: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
89c0: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
89d0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
89e0: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
89f0: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
8a00: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
8a10: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
8a20: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
8a30: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
8a40: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
8a50: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
8a60: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
8a70: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
8a80: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
8a90: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
8aa0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8ab0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
8ac0: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
8ad0: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
8ae0: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
8af0: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
8b00: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
8b10: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
8b20: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
8b30: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
8b40: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
8b50: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
8b60: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
8b70: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
8b80: 73 20 74 68 65 20 74 68 65 20 47 4e 55 20 76 65  s the the GNU ve
8b90: 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f  rsion of strerro
8ba0: 72 5f 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a  r_r() that .  **
8bb0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
8bc0: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
8bd0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
8be0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
8bf0: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
8c00: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
8c10: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
8c20: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
8c30: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
8c40: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
8c50: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
8c60: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
8c70: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
8c80: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
8c90: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
8ca0: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
8cb0: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
8cc0: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
8cd0: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
8ce0: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
8cf0: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
8d00: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
8d10: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
8d20: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
8d30: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
8d40: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
8d50: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
8d60: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
8d70: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
8d80: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
8d90: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
8da0: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
8db0: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
8dc0: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
8dd0: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
8de0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
8df0: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
8e00: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
8e10: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
8e20: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
8e30: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
8e40: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
8e50: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
8e60: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
8e70: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
8e80: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
8e90: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
8ea0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
8eb0: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
8ec0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
8ed0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
8ee0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
8ef0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
8f00: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
8f10: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
8f20: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
8f30: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
8f40: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
8f50: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
8f60: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
8f70: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
8f80: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
8f90: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
8fa0: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
8fb0: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
8fc0: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
8fd0: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
8fe0: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
8ff0: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
9000: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
9010: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
9020: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
9030: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
9040: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
9050: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
9060: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
9070: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
9080: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
9090: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
90a0: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
90b0: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
90c0: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
90d0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
90e0: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
90f0: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
9100: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
9110: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
9120: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
9130: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
9140: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
9150: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
9160: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
9170: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
9180: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
9190: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
91a0: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
91b0: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
91c0: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
91d0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
91e0: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
91f0: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
9200: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
9210: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
9220: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
9230: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
9260: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
9270: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
9280: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
9290: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
92a0: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
92b0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
92c0: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
92d0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
92e0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
92f0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
9300: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9310: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
9320: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
9330: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
9340: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
9350: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
9360: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
9370: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
9380: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
9390: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
93a0: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
93b0: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
93c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
93d0: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
93e0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
93f0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
9400: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
9410: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
9420: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
9430: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
9440: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
9450: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
9460: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
9470: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
9480: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
9490: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
94a0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
94b0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
94c0: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
94d0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
94e0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
94f0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9500: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
9510: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
9520: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
9530: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
9540: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
9550: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
9560: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
9570: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
9580: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
9590: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
95a0: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
95b0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
95c0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
95d0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
95e0: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
95f0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
9600: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
9610: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
9620: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
9630: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9640: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
9650: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
9660: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
9670: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
9680: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
9690: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
96a0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
96b0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
96c0: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
96d0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
96e0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
96f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
9700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
9710: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
9720: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9730: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
9740: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
9750: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9760: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
9770: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
9780: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
9790: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
97a0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
97b0: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
97c0: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75  value might be u
97d0: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
97e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
97f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
9800: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
9810: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
9820: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
9830: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
9840: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
9850: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
9860: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
9870: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
9880: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9890: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
98a0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
98b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
98c0: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
98d0: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
98e0: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
98f0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9900: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
9910: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
9920: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
9930: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
9940: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
9970: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9980: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99a0: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
99b0: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
99c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
99d0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
99e0: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
99f0: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
9a00: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
9a10: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
9a20: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
9a30: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
9a40: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
9a50: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
9a60: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
9a70: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
9a80: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
9a90: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
9aa0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
9ab0: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
9ac0: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
9ad0: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
9ae0: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
9af0: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
9b00: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
9b10: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
9b20: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
9b30: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
9b40: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
9b50: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
9b60: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9b70: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
9b80: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
9b90: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
9ba0: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
9bb0: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
9bc0: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
9bd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9be0: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
9bf0: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
9c00: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
9c10: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
9c20: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
9c30: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
9c40: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
9c50: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
9c60: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
9c70: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
9c80: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
9c90: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
9ca0: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
9cb0: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
9cc0: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
9cd0: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
9ce0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
9cf0: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
9d00: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
9d10: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
9d20: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
9d30: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
9d40: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
9d50: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
9d60: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
9d70: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
9d80: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
9d90: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
9da0: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
9db0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
9dc0: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
9dd0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
9de0: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
9df0: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
9e00: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
9e10: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
9e20: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
9e30: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
9e40: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
9e50: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
9e60: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
9e70: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
9e80: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
9e90: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
9ea0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
9eb0: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
9ec0: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
9ed0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
9ee0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
9ef0: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
9f00: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
9f10: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
9f20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9f30: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
9f40: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
9f50: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
9f60: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
9f70: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9f80: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
9f90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9fa0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
9fb0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
9fc0: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
9fd0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
9fe0: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
9ff0: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
a000: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
a010: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
a020: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
a030: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74   fileId.ino = st
a040: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
a050: 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ndif.  pInode = 
a060: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  inodeList;.  whi
a070: 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65  le( pInode && me
a080: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
a090: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73  Inode->fileId, s
a0a0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29  izeof(fileId)) )
a0b0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70  {.    pInode = p
a0c0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a0d0: 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d  }.  if( pInode==
a0e0: 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  0 ){.    pInode 
a0f0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
a100: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
a110: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
a120: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
a130: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a140: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
a150: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
a160: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
a170: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
a180: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
a190: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
a1a0: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
a1b0: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
a1c0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
a1d0: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
a1e0: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
a1f0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
a200: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
a210: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
a220: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
a230: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
a240: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
a250: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
a260: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
a270: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a280: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
a290: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
a2a0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
a2b0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
a2c0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
a2d0: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
a2e0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
a2f0: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
a300: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
a310: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
a320: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
a330: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
a340: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
a350: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
a360: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
a370: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
a380: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
a390: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
a3a0: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
a3b0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
a3c0: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
a3d0: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
a3e0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
a3f0: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
a400: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a410: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
a420: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
a430: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
a440: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
a450: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
a460: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
a470: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
a480: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
a490: 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45  pFile );.  unixE
a4a0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
a4b0: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
a4c0: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
a4d0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
a4e0: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  /..  /* Check if
a4f0: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
a500: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
a510: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
a520: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
a530: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
a540: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
a550: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
a560: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
a570: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
a580: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
a590: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ds it..  */.#ifn
a5a0: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
a5b0: 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26  if( !reserved &&
a5c0: 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d   !pFile->pInode-
a5d0: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b  >bProcessLock ){
a5e0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
a5f0: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b  k lock;.    lock
a600: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
a610: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
a620: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
a630: 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  D_BYTE;.    lock
a640: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20  .l_len = 1;.    
a650: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a660: 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f  WRLCK;.    if( o
a670: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
a680: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
a690: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
a6a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
a6b0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
a6c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
a6d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
a6e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
a6f0: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
a700: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
a710: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
a720: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
a730: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
a740: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
a750: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
a760: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
a770: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
a780: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
a790: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
a7a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a7b0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
a7c0: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
a7d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
a7e0: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
a7f0: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
a800: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
a810: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
a820: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
a830: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
a840: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
a850: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
a860: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
a870: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
a880: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
a890: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
a8a0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
a8b0: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
a8c0: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
a8d0: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
a8e0: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
a8f0: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
a900: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
a910: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
a920: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
a930: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
a940: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
a950: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
a960: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
a970: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
a980: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
a990: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
a9a0: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
a9b0: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
a9c0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
a9d0: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
a9e0: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
a9f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
aa00: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
aa10: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
aa20: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
aa30: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
aa40: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
aa50: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
aa60: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
aa70: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
aa80: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
aa90: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
aaa0: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
aab0: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
aac0: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
aad0: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
aae0: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
aaf0: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
ab00: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
ab10: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
ab20: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
ab30: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
ab40: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
ab50: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
ab60: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
ab70: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
ab80: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
ab90: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
aba0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
abb0: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
abc0: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
abd0: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
abe0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
abf0: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
ac00: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
ac10: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
ac20: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
ac30: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
ac40: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
ac50: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
ac60: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
ac70: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
ac80: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
ac90: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
aca0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
acb0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
acc0: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
acd0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ace0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
acf0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
ad00: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
ad10: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
ad20: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
ad30: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
ad40: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
ad50: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
ad60: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
ad70: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
ad80: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
ad90: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
ada0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
adb0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
adc0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
add0: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
ade0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
adf0: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
ae00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ae10: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
ae20: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
ae30: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
ae40: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
ae50: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
ae60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
ae70: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
ae80: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
ae90: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
aea0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
aeb0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
aec0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
aed0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
aee0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
aef0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
af00: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
af10: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
af20: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
af30: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
af40: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
af50: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
af60: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
af70: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
af80: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
af90: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
afa0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
afb0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
afc0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
afd0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
afe0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
aff0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
b000: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
b010: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
b020: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
b030: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
b040: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
b050: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
b060: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
b070: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
b080: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
b090: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
b0a0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
b0b0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
b0c0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
b0d0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
b0e0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
b0f0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
b100: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
b110: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
b120: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
b130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b140: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
b150: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
b160: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
b170: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
b180: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
b190: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b1a0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
b1b0: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
b1c0: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
b1d0: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
b1e0: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
b1f0: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
b200: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
b210: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
b220: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
b230: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
b240: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
b250: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
b260: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
b270: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
b280: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
b290: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
b2a0: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
b2b0: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
b2c0: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
b2d0: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
b2e0: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
b2f0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
b300: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
b310: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
b320: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
b330: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
b340: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
b350: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
b360: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
b370: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
b380: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
b390: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
b3a0: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
b3b0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
b3c0: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
b3d0: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
b3e0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
b3f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
b400: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
b410: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
b420: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
b430: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
b440: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
b450: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
b460: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
b470: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
b480: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
b490: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
b4a0: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
b4b0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
b4c0: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
b4d0: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
b4e0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
b4f0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b500: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
b510: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
b520: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
b530: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
b540: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
b550: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
b560: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
b570: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
b580: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
b590: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
b5a0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
b5b0: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
b5c0: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
b5d0: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
b5e0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
b5f0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
b600: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
b610: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
b620: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
b630: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
b640: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
b650: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
b660: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
b670: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
b680: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
b690: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
b6a0: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
b6b0: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
b6c0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
b6d0: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
b6e0: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
b6f0: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
b700: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
b710: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
b720: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
b730: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
b740: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
b750: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
b760: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
b770: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
b780: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
b790: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
b7a0: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
b7b0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
b7c0: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
b7d0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b7e0: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
b7f0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
b800: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
b810: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
b820: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
b830: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
b840: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
b850: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
b860: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
b870: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
b880: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
b890: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
b8a0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
b8b0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
b8c0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
b8d0: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
b8e0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
b8f0: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
b900: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
b910: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
b920: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
b930: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
b940: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
b950: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
b960: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
b970: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
b980: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
b990: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
b9a0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
b9b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
b9c0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b9d0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
b9e0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b9f0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
ba00: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
ba10: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
ba20: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
ba30: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
ba40: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
ba50: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
ba60: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
ba70: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
ba80: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
ba90: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
baa0: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
bab0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
bac0: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
bad0: 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
bae0: 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
baf0: 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
bb00: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
bb10: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
bb20: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
bb30: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
bb40: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
bb50: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
bb60: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
bb70: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
bb80: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
bb90: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
bba0: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
bbb0: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
bbc0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
bbd0: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
bbe0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
bbf0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
bc00: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
bc10: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
bc20: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
bc30: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
bc40: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
bc50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc60: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
bc70: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
bc80: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
bc90: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
bca0: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
bcb0: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
bcc0: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
bcd0: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
bce0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
bcf0: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
bd00: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
bd10: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
bd20: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
bd30: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
bd40: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
bd50: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
bd60: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
bd70: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
bd80: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
bd90: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
bda0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
bdb0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
bdc0: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
bdd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
bde0: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
bdf0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
be00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
be10: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
be20: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
be30: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
be40: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
be50: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
be60: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
be70: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
be80: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
be90: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
bea0: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
beb0: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
bec0: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
bed0: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
bee0: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
bef0: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
bf00: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
bf10: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
bf20: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
bf30: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
bf40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
bf50: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
bf60: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
bf70: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
bf80: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
bf90: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
bfa0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
bfb0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
bfc0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
bfd0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
bfe0: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
bff0: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
c000: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
c010: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
c020: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
c030: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
c040: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
c050: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
c060: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c070: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
c080: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
c090: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
c0a0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c0b0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
c0c0: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
c0d0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
c0e0: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
c0f0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
c100: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
c110: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
c120: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
c130: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
c140: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
c150: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
c160: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
c170: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
c180: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
c190: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
c1a0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
c1b0: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
c1c0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
c1d0: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
c1e0: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
c1f0: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
c200: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
c210: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
c220: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
c230: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
c240: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
c250: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
c260: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
c270: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
c280: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
c290: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
c2a0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
c2b0: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
c2c0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
c2d0: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
c2e0: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
c2f0: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
c300: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
c310: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
c320: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
c330: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
c340: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
c350: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
c360: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
c370: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
c380: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
c390: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
c3a0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
c3b0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c3c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
c3d0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
c3e0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
c3f0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
c400: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
c410: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
c420: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
c430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
c440: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
c450: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
c460: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
c470: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
c480: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
c490: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
c4a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
c4b0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
c4c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c4d0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
c4e0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
c4f0: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
c500: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
c510: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
c520: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
c530: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
c540: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
c550: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
c560: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c570: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
c580: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c590: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
c5a0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
c5b0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
c5c0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
c5d0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
c5e0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
c5f0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
c600: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
c610: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
c620: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
c630: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
c640: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
c650: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
c660: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
c670: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
c680: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
c690: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
c6a0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
c6b0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
c6c0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
c6d0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
c6e0: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
c6f0: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
c700: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
c710: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c720: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
c730: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
c740: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
c750: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
c760: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
c770: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c780: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
c790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c7a0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
c7b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c7c0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c7d0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
c7e0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
c7f0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
c800: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
c810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
c820: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
c830: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
c840: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
c850: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
c860: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
c870: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
c880: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
c890: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
c8a0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
c8b0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
c8c0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
c8d0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
c8e0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
c8f0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
c900: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
c910: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
c920: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
c930: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
c940: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
c950: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
c960: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
c970: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
c980: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
c990: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
c9a0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
c9b0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c9c0: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
c9d0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
c9e0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
c9f0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
ca00: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
ca10: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
ca20: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
ca30: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
ca40: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
ca50: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
ca60: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
ca70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
ca80: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
ca90: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
caa0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
cab0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
cac0: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
cad0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
cae0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
caf0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
cb00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cb10: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
cb20: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
cb30: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
cb40: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cb50: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
cb60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cb70: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
cb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cb90: 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44  }.  ..#ifndef ND
cba0: 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70  EBUG.  /* Set up
cbb0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
cbc0: 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20  -counter change 
cbd0: 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77  checking flags w
cbe0: 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74  hen.  ** transit
cbf0: 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48  ioning from a SH
cc00: 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56  ARED to a RESERV
cc10: 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68  ED lock.  The ch
cc20: 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53  ange.  ** from S
cc30: 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
cc40: 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69  D marks the begi
cc50: 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61  nning of a norma
cc60: 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65  l.  ** write ope
cc70: 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f  ration (not a ho
cc80: 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t journal rollba
cc90: 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ck)..  */.  if( 
cca0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
ccb0: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
ccc0: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
ccd0: 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63  K.   && eFileLoc
cce0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
ccf0: 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  .  ){.    pFile-
cd00: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
cd10: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   0;.    pFile->d
cd20: 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
cd30: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
cd40: 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23  Write = 1;.  }.#
cd50: 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63  endif...  if( rc
cd60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
cd70: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
cd80: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
cd90: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
cda0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
cdb0: 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
cdc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
cdd0: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
cde0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
cdf0: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
ce00: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
ce10: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
ce20: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
ce30: 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
ce40: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
ce50: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
ce60: 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
ce70: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
ce80: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
ce90: 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
cea0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
ceb0: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
cec0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ced0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
cee0: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
cef0: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
cf00: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
cf10: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
cf20: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
cf30: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
cf40: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
cf50: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
cf60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
cf70: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
cf80: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
cf90: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55  d *p = pFile->pU
cfa0: 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78  nused;.  p->pNex
cfb0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
cfc0: 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
cfd0: 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
cfe0: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
cff0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  File->pUnused = 
d000: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  0;.}../*.** Lowe
d010: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
d020: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
d030: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
d040: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
d050: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
d060: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
d070: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
d080: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
d090: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
d0a0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
d0b0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
d0c0: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
d0d0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
d0e0: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
d0f0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d100: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64  ..** .** If hand
d110: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74  leNFSUnlock is t
d120: 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77  rue, then on dow
d130: 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c  ngrading an EXCL
d140: 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48  USIVE_LOCK to SH
d150: 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65  ARED.** the byte
d160: 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65   range is divide
d170: 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61  d into 2 parts a
d180: 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72  nd the first par
d190: 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68  t is unlocked th
d1a0: 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72  en.** set to a r
d1b0: 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ead lock, then t
d1c0: 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73  he other part is
d1d0: 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64   simply unlocked
d1e0: 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a  .  This works .*
d1f0: 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69  * around a bug i
d200: 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20  n BSD NFS lockd 
d210: 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61  (also seen on Ma
d220: 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74  cOSX 10.3+) that
d230: 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65   fails to .** re
d240: 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c  move the write l
d250: 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20  ock on a region 
d260: 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
d270: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   is set..*/.stat
d280: 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f  ic int posixUnlo
d290: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
d2a0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
d2b0: 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46  ck, int handleNF
d2c0: 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78  SUnlock){.  unix
d2d0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d2e0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
d2f0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
d300: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
d310: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
d320: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d330: 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73  .  int h;..  ass
d340: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
d350: 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
d360: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
d370: 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
d380: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
d390: 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
d3a0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
d3b0: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
d3c0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
d3d0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
d3e0: 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74  hared,.      get
d3f0: 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
d400: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
d410: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
d420: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d430: 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
d440: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d450: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
d460: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
d470: 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  .  h = pFile->h;
d480: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
d490: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
d4a0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
d4b0: 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
d4c0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d4d0: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
d4e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
d4f0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
d500: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d510: 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65   );.    Simulate
d520: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
d530: 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
d540: 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
d550: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
d560: 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23  rorBenign(0);..#
d570: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
d580: 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
d590: 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
d5a0: 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
d5b0: 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
d5c0: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
d5d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
d5e0: 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
d5f0: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
d600: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
d610: 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
d620: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
d630: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
d640: 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
d650: 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
d660: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
d670: 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
d680: 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
d690: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
d6a0: 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
d6b0: 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
d6c0: 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
d6d0: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
d6e0: 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
d6f0: 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
d700: 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
d710: 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
d720: 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
d730: 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
d740: 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
d750: 2f 0a 23 69 66 20 30 0a 20 20 20 20 61 73 73 65  /.#if 0.    asse
d760: 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
d770: 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
d780: 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
d790: 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
d7a0: 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72      || pFile->tr
d7b0: 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29  ansCntrChng==1 )
d7c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 46 69  ;.#endif.    pFi
d7d0: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
d7e0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
d7f0: 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
d800: 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
d810: 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
d820: 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
d830: 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
d840: 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
d850: 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
d860: 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
d870: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
d880: 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
d890: 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
d8a0: 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
d8b0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
d8c0: 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
d8d0: 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
d8e0: 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
d8f0: 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
d900: 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
d910: 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
d920: 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
d930: 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
d940: 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
d950: 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
d960: 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
d970: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
d980: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
d990: 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  {..#if !defined(
d9a0: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
d9b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
d9c0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
d9d0: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
d9e0: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
d9f0: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
da00: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
da10: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
da20: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
da30: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
da40: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
da50: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
da60: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
da70: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
da80: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
da90: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
daa0: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
dab0: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
dac0: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
dad0: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
dae0: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
daf0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
db00: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
db10: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
db20: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
db30: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
db40: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
db50: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
db60: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
db70: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
db80: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
db90: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
dba0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
dbb0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
dbc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
dbd0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  OCK;.          i
dbe0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
dbf0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
dc00: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dc10: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
dc20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dc30: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
dc40: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
dc50: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
dc60: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
dc70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
dc80: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
dc90: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
dca0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
dcb0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
dcc0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
dcd0: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
dce0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
dcf0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
dd00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
dd10: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
dd20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
dd30: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
dd40: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
dd50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
dd60: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
dd70: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
dd80: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
dd90: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dda0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
ddb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ddc0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
ddd0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
dde0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
ddf0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
de00: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
de10: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
de20: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
de30: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
de40: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
de50: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
de60: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
de70: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
de80: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
de90: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
dea0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
deb0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
dec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
ded0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
dee0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
def0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
df00: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
df10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
df20: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
df30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
df40: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
df50: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
df60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
df70: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
df80: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
df90: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
dfa0: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
dfb0: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
dfc0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
dfd0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
dfe0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
dff0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
e000: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e010: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
e020: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
e030: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
e040: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
e050: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
e060: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
e070: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
e080: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
e090: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
e0a0: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
e0b0: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
e0c0: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
e0d0: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
e0e0: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
e0f0: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
e100: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
e110: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
e120: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
e130: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
e140: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
e150: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
e160: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
e170: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
e180: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
e190: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
e1a0: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
e1b0: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
e1c0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
e1d0: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
e1e0: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
e1f0: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
e200: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
e210: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e220: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
e230: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e240: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
e250: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
e260: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
e270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e280: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
e290: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
e2a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e2b0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e2c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e2d0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
e2e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e2f0: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
e300: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
e310: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
e320: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e330: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e340: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
e350: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
e360: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
e370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
e380: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
e390: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  _UNLOCK;.      p
e3a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e3b0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67  = errno;.      g
e3c0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
e3d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e3e0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
e3f0: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
e400: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
e410: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
e420: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
e430: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
e440: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
e450: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
e460: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
e470: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
e480: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
e490: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
e4a0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
e4b0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
e4c0: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
e4d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
e4e0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
e4f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
e500: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
e510: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e520: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
e530: 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  L;.      Simulat
e540: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
e550: 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
e560: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
e570: 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
e580: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
e590: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  );.      if( uni
e5a0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
e5b0: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
e5c0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
e5d0: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
e5e0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
e5f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e600: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e610: 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  ;..pFile->lastEr
e620: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e630: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
e640: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
e650: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
e660: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
e670: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
e680: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
e690: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
e6a0: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
e6b0: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
e6c0: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
e6d0: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
e6e0: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
e6f0: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
e700: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
e710: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
e720: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
e730: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
e740: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
e750: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
e760: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
e770: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
e780: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
e790: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
e7a0: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
e7b0: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
e7c0: 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63  .  }...end_unloc
e7d0: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
e7e0: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
e7f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
e800: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e810: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
e820: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e830: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
e840: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
e850: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
e860: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
e870: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
e880: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
e890: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
e8a0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
e8b0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
e8c0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
e8d0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
e8e0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
e8f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
e900: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
e910: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
e920: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
e930: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
e940: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e950: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
e960: 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
e970: 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
e980: 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Lock, 0);.}../*.
e990: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e9a0: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
e9b0: 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
e9c0: 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
e9d0: 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
e9e0: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
e9f0: 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
ea00: 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
ea10: 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
ea20: 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
ea30: 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
ea40: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
ea50: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
ea60: 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
ea70: 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
ea80: 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
ea90: 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
eaa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
eab0: 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
eac0: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
ead0: 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
eae0: 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
eaf0: 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
eb00: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
eb10: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
eb20: 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
eb30: 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
eb40: 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
eb50: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
eb60: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
eb70: 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
eb80: 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
eb90: 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
eba0: 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
ebb0: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
ebc0: 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
ebd0: 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
ebe0: 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
ebf0: 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20  pFile->isDelete 
ec00: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
ec10: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
ec20: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
ec30: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
ec40: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
ec50: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
ec60: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
ec70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
ec80: 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
ec90: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
eca0: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
ecb0: 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
ecc0: 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
ecd0: 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
ece0: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
ecf0: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
ed00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ed10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ed20: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
ed30: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
ed40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
ed50: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
ed60: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
ed70: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
ed80: 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e  xFile *)id;.  un
ed90: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
eda0: 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
edb0: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
edc0: 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
edd0: 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
ede0: 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
edf0: 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
ee00: 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ose.  ** routine
ee10: 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f   (e.g. nolockClo
ee20: 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63  se()) would be c
ee30: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  alled instead.. 
ee40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
ee50: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
ee60: 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
ee70: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
ee80: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ock==0 );.  if( 
ee90: 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49  ALWAYS(pFile->pI
eea0: 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e  node) && pFile->
eeb0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
eec0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
eed0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
eee0: 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
eef0: 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
ef00: 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
ef10: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
ef20: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
ef30: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
ef40: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
ef50: 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
ef60: 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
ef70: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
ef80: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
ef90: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
efa0: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
efb0: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
efc0: 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
efd0: 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
efe0: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
eff0: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
f000: 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ile);.  rc = clo
f010: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
f020: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
f030: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
f040: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
f050: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
f060: 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
f070: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
f080: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
f090: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
f0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0e0: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
f160: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f180: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
f190: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
f1a0: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
f1b0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
f1c0: 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
f1d0: 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
f1e0: 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
f1f0: 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
f200: 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
f210: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
f220: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
f230: 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
f240: 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
f250: 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
f260: 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
f270: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
f280: 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
f290: 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
f2a0: 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
f2b0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
f2c0: 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
f2d0: 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
f2e0: 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
f2f0: 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
f300: 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
f310: 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
f320: 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
f330: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
f340: 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
f350: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
f360: 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
f370: 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
f380: 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
f390: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
f3a0: 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
f3b0: 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
f3c0: 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
f3d0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
f3e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
f3f0: 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
f400: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
f410: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
f420: 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
f430: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
f440: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
f450: 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
f460: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f470: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
f480: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f490: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
f4a0: 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
f4b0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
f4c0: 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
f4d0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
f4e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
f4f0: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
f500: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f510: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
f520: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
f530: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
f540: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
f550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f560: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
f570: 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
f580: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
f590: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
f5a0: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
f5b0: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
f5c0: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
f5d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
f5f0: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
f600: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
f610: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
f620: 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
f630: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
f640: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
f650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
f660: 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
f670: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f690: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
f6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f750: 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
f760: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f780: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
f790: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
f7a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f7b0: 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61 6e  uses the existan
f7c0: 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
f7d0: 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20  ock.** files in 
f7e0: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c  order to control
f7f0: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
f800: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
f810: 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20  orks on just.** 
f820: 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
f830: 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
f840: 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
f850: 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
f860: 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
f870: 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
f880: 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
f890: 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
f8a0: 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
f8b0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
f8c0: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
f8d0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
f8e0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
f8f0: 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
f900: 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
f910: 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
f920: 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
f930: 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
f940: 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
f950: 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
f960: 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
f970: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
f980: 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
f990: 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
f9a0: 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
f9b0: 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
f9c0: 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
f9d0: 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
f9e0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
f9f0: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
fa00: 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
fa10: 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  a file in the sa
fa20: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
fa30: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
fa40: 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
fa50: 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
fa60: 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
fa70: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
fa80: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
fa90: 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69   lock file impli
faa0: 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
fab0: 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
fac0: 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28   lock.** types (
fad0: 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
fae0: 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
faf0: 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
fb00: 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
fb10: 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
fb20: 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
fb30: 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
fb40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
fb50: 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66  te the.** lock f
fb60: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
fb70: 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22  DOTLOCK_SUFFIX "
fb80: 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  .lock"../*.** Th
fb90: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
fba0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
fbb0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
fbc0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
fbd0: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
fbe0: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
fbf0: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
fc00: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
fc10: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
fc20: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
fc30: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
fc40: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
fc50: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
fc60: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
fc70: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
fc80: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
fc90: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
fca0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
fcb0: 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66  g..**.** In dotf
fcc0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74  ile locking, eit
fcd0: 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74  her a lock exist
fce0: 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74  s or it does not
fcf0: 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a  .  So in this.**
fd00: 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68   variation of Ch
fd10: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
fd20: 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  ), *pResOut is s
fd30: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e  et to true if an
fd40: 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c  y lock.** is hel
fd50: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  d on the file an
fd60: 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66  d false if the f
fd70: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
fd80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
fd90: 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
fda0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
fdb0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
fdc0: 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
fdd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fde0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
fdf0: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
fe00: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
fe10: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
fe20: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
fe30: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
fe40: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
fe50: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
fe60: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
fe70: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
fe80: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
fe90: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
fea0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
feb0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
fec0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
fed0: 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73    /* Either this
fee0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73   connection or s
fef0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
ff00: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65  tion in the same
ff10: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
ff20: 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
ff30: 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65  the file.  No ne
ff40: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74  ed to check furt
ff50: 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65  her. */.    rese
ff60: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  rved = 1;.  }els
ff70: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  e{.    /* The lo
ff80: 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e  ck is held if an
ff90: 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f  d only if the lo
ffa0: 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  ckfile exists */
ffb0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ffc0: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f  *zLockFile = (co
ffd0: 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d  nst char*)pFile-
ffe0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
fff0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
10000 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69  osAccess(zLockFi
10010 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20  le, 0)==0;.  }. 
10020 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
10030 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
10040 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
10050 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
10060 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
10070 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
10080 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10090 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
100a0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
100b0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
100c0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
100d0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
100e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
100f0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
10100 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
10110 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
10120 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
10130 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
10140 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
10150 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
10160 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
10170 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
10180 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
10190 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
101a0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
101b0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
101c0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
101d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
101e0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
101f0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
10200 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
10210 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
10220 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
10230 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
10240 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
10250 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
10260 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
10270 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
10280 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
10290 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
102a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
102b0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
102c0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
102d0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
102e0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
102f0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
10300 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
10310 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
10320 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
10330 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
10340 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
10350 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
10360 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
10370 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
10380 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
10390 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
103a0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
103b0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
103c0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
103d0 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
103e0 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
103f0 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
10400 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
10410 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
10420 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
10430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10440 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
10450 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
10460 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
10470 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
10480 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
10490 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20   int fd;.  char 
104a0 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
104b0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
104c0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
104d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
104e0 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
104f0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
10500 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
10510 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
10520 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
10530 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
10540 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
10550 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
10560 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
10570 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
10580 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
10590 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
105a0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
105b0 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
105c0 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
105d0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
105e0 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
105f0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
10600 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
10610 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
10620 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
10630 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
10640 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
10650 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10660 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
10670 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
10680 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
10690 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44  n(zLockFile,O_RD
106a0 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  ONLY|O_CREAT|O_E
106b0 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28  XCL,0600);.  if(
106c0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   fd<0 ){.    /* 
106d0 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
106e0 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20  reate the file, 
106f0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79  someone else may
10700 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65   have stolen the
10710 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
10720 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10730 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
10740 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
10750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
10760 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
10770 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
10780 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10790 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
107a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
107b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
107c0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
107d0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
107e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
107f0 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
10800 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
10810 3b 0a 20 20 7d 20 0a 20 20 72 6f 62 75 73 74 5f  ;.  } .  robust_
10820 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
10830 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20   __LINE__);.  . 
10840 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
10850 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10860 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
10870 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10880 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
10890 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
108a0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
108b0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
108c0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
108d0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
108e0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
108f0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
10900 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
10910 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10920 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10930 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10940 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10950 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10960 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10970 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
10980 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10990 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
109a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
109b0 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
109c0 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
109d0 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
109e0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
109f0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10a00 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
10a10 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
10a20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10a30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
10a40 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
10a50 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
10a60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
10a70 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10a80 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
10a90 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
10aa0 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c   %d pid=%d (dotl
10ab0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
10ac0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20  h, eFileLock,.. 
10ad0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10ae0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
10af0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
10b00 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
10b10 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
10b20 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
10b30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
10b40 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
10b50 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
10b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10b70 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
10b80 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
10b90 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
10ba0 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
10bb0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
10bc0 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
10bd0 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
10be0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
10bf0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
10c00 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
10c10 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
10c20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10c30 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
10c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10c50 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
10c60 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
10c70 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
10c80 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
10c90 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
10ca0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
10cb0 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
10cc0 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20  zLockFile) ){.  
10cd0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10ce0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
10cf0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e  rrno;.    if( EN
10d00 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
10d10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10d20 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10d40 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10d50 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
10d60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10d70 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
10d80 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
10d90 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10da0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
10db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10dd0 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
10de0 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
10df0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
10e00 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
10e10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10e20 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
10e30 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
10e40 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64  int rc;.  if( id
10e50 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
10e60 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10e70 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74  ile*)id;.    dot
10e80 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
10e90 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c  O_LOCK);.    sql
10ea0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
10eb0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
10ec0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f  ;.  }.  rc = clo
10ed0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
10ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
10ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f00 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f  ** End of the do
10f10 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c  t-file lock impl
10f20 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
10f90 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
11000 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a   flock Locking *
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11030 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c  **.** Use the fl
11040 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ock() system cal
11050 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63  l to do file loc
11060 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  king..**.** floc
11070 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  k() locking is l
11080 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  ike dot-file loc
11090 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65  king in that the
110a0 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65   various.** fine
110b0 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c  -grain locking l
110c0 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20  evels supported 
110d0 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f  by SQLite are co
110e0 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20  llapsed into.** 
110f0 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69  a single exclusi
11100 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68  ve lock.  In oth
11110 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44  er words, SHARED
11120 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a  , RESERVED, and.
11130 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73  ** PENDING locks
11140 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68   are the same th
11150 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53  ing as an EXCLUS
11160 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74  IVE lock.  SQLit
11170 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73  e.** still works
11180 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69   when you do thi
11190 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e  s, but concurren
111a0 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69  cy is reduced si
111b0 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  nce.** only a si
111c0 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
111d0 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
111e0 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69  database at a ti
111f0 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74  me..**.** Omit t
11200 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53  his section if S
11210 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
11220 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75  KING_STYLE is tu
11230 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a  rned off or if.*
11240 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20  * compiling for 
11250 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20  VXWORKS..*/.#if 
11260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11270 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
11280 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
11290 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20  * Retry flock() 
112a0 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
112b0 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69  with EINTR.*/.#i
112c0 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69  fdef EINTR.stati
112d0 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f  c int robust_flo
112e0 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ck(int fd, int o
112f0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
11300 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66  do{ rc = flock(f
11310 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72  d,op); }while( r
11320 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
11330 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
11340 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
11350 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63  fine robust_floc
11360 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62  k(a,b) flock(a,b
11370 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a  ).#endif.     ..
11380 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11390 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
113a0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
113b0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
113c0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
113d0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
113e0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
113f0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
11400 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11410 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11420 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11430 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11440 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
11450 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
11460 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
11470 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
11480 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
11490 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
114a0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
114b0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68  atic int flockCh
114c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
114d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
114e0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
114f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11500 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
11510 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
11520 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11530 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11540 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11550 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
11560 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
11570 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
11580 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11590 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   );.  .  /* Chec
115a0 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
115b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
115c0 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
115d0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
115e0 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
115f0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
11600 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
11610 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
11620 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
11630 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
11640 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
11650 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
11660 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
11670 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
11680 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73   int lrc = robus
11690 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
116a0 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
116b0 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c  _NB);.    if( !l
116c0 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67  rc ){.      /* g
116d0 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c  ot the lock, unl
116e0 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ock it */.      
116f0 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
11700 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11710 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
11720 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
11730 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11740 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rrno;.        /*
11750 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
11760 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
11770 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51          lrc = SQ
11780 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11790 4b 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  K; .        if( 
117a0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
117b0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
117c0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
117d0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
117e0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
117f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11800 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
11810 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
11820 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
11830 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
11840 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
11850 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
11860 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
11870 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
11880 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
11890 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
118a0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
118b0 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
118c0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
118d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
118e0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
118f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
11900 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
11910 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
11920 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
11930 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
11940 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
11950 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
11960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
11970 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
11980 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
11990 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
119a0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
119b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
119c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
119d0 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
119e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
119f0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
11a00 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
11a10 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11a20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11a30 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11a40 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11a50 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11a60 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
11a70 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
11a80 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
11a90 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
11aa0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
11ab0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
11ac0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
11ad0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11ae0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11af0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11b00 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11b10 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11b20 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11b30 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11b40 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11b50 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11b60 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11b70 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11b80 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11b90 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11ba0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11bb0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11bc0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11bd0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11be0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11bf0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11c00 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11c10 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11c20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11c30 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11c40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11c50 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11c60 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11c70 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11c80 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11c90 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11ca0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11cb0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11cc0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11cd0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11ce0 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
11cf0 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
11d00 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
11d10 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
11d20 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
11d30 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
11d40 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
11d50 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
11d60 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
11d70 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
11d80 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
11d90 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
11da0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
11db0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
11dc0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
11dd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11de0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
11df0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
11e00 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
11e10 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
11e20 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
11e30 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
11e40 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11e50 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11e60 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11e70 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
11e80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11e90 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11ea0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11eb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11ec0 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
11ed0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
11ee0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
11ef0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
11f00 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
11f10 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
11f20 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
11f30 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
11f40 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
11f50 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11f60 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11f70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11f80 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
11f90 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
11fa0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
11fb0 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
11fc0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11fd0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
11fe0 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
11ff0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
12000 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
12010 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
12020 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
12030 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
12040 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
12050 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
12060 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12070 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
12080 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12090 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
120a0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
120b0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
120c0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
120d0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
120e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
120f0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
12100 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
12110 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
12120 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12130 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
12140 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
12150 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
12160 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
12170 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
12180 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
12190 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
121a0 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
121b0 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
121c0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
121d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
121e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
121f0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12200 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
12210 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
12220 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
12230 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
12240 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
12250 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
12260 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
12270 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
12280 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
12290 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
122a0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
122b0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
122c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
122d0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
122e0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
122f0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
12300 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
12310 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
12320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
12330 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
12340 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12350 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
12360 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12370 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12380 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
12390 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
123a0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
123b0 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
123c0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
123d0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
123e0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
123f0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
12400 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
12410 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
12420 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12430 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
12440 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
12450 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
12460 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
12470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12480 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12490 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
124a0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
124b0 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
124c0 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
124d0 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
124e0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
124f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12500 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
12510 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12520 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
12530 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
12540 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lock. */.  if( r
12550 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
12560 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29  e->h, LOCK_UN) )
12570 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12580 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
12590 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74  K_ERRORS.    ret
125a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
125b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
125c0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
125d0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
125e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
125f0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65  ERR_UNLOCK;.  }e
12600 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
12610 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
12620 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
12630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
12640 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
12650 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
12660 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
12670 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
12680 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
12690 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
126a0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  d, NO_LOCK);.  }
126b0 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
126c0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
126d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
126e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
126f0 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
12700 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
12720 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
12730 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
12740 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
12750 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
12820 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
12850 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
12860 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
12870 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
12880 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
12890 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
128a0 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
128b0 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
128c0 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
128d0 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
128e0 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
128f0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12900 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
12910 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
12920 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
12930 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
12940 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
12950 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
12960 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
12970 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
12980 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
12990 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
129a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
129b0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
129c0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
129d0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
129e0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
129f0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12a00 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
12a10 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
12a20 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
12a30 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
12a40 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
12a50 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
12a60 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12a70 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
12a80 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
12a90 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
12aa0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
12ab0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
12ac0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
12ad0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
12ae0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12af0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12b00 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
12b10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12b20 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
12b30 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
12b40 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12b50 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
12b60 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12b70 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12b80 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
12b90 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
12ba0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12bb0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
12bc0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
12bd0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
12be0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
12bf0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
12c00 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
12c10 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
12c20 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
12c30 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
12c40 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
12c50 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
12c60 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
12c70 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
12c80 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
12c90 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
12ca0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
12cb0 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20  atBuf;..    if( 
12cc0 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
12cd0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
12ce0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12cf0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
12d00 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
12d10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12d20 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12d30 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
12d50 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
12d60 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
12d70 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
12d80 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  no;.      } else
12d90 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
12da0 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
12db0 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
12dc0 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
12dd0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
12de0 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
12df0 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
12e00 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
12e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12e20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
12e30 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
12e40 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
12e50 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
12e60 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
12e70 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12e80 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
12e90 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12ea0 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
12eb0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
12ec0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
12ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
12ee0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
12ef0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
12f00 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
12f10 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
12f20 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
12f30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
12f40 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
12f50 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
12f60 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
12f70 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
12f80 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
12f90 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
12fa0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
12fb0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
12fc0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
12fd0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
12fe0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
12ff0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
13000 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
13010 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
13020 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
13030 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
13040 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
13050 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
13060 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
13070 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
13080 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
13090 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
130a0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
130b0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
130c0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
130d0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
130e0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
130f0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13100 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13110 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
13120 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
13130 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13140 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
13150 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
13160 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
13170 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
13180 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
13190 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
131a0 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
131b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
131c0 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
131d0 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
131e0 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
131f0 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
13200 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
13210 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
13220 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
13230 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
13240 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
13250 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
13260 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
13270 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
13280 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13290 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
132a0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
132b0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
132c0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
132d0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
132e0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
132f0 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
13300 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13310 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13320 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13330 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13340 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
13350 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
13360 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
13370 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
13380 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
13390 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
133a0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
133b0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
133c0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
133d0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
133e0 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
133f0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
13400 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
13410 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
13420 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13430 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
13440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
13450 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
13460 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
13470 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
13480 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
13490 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
134a0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
134b0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
134c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
134d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
134e0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
134f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
13500 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
13510 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
13520 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13530 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13540 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
13550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13560 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
13570 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13580 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
13590 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
135a0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
135b0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
135c0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
135d0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
135e0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
135f0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
13600 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13610 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
13620 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
13630 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
13640 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
13650 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13660 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
13670 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
13680 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13690 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
136a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
136b0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
136c0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
136d0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
136e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
136f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
13700 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
13710 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
13720 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
13730 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
13740 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20  , eFileLock,..  
13750 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13760 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
13770 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
13780 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
13790 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
137a0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
137b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
137c0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
137d0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
137e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
137f0 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
13800 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
13810 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
13820 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
13830 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
13840 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
13850 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
13860 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
13870 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
13880 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13890 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
138a0 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
138b0 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
138c0 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
138d0 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
138e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
138f0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13900 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13910 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13920 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
13930 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
13940 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
13950 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13960 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
13970 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
13980 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
13990 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
139a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
139c0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
139d0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
139e0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
139f0 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
13a00 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
13a10 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13a20 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
13a30 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
13a40 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
13a50 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
13a60 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
13a70 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
13a80 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
13a90 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
13aa0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
13ab0 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
13ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ad0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
13ae0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
13af0 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
13b00 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
13b10 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
13b20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
13b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
13b40 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
13b50 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
13b60 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
13b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
13c40 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13c70 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
13c80 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
13c90 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
13ca0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
13cb0 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
13cc0 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
13cd0 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
13ce0 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
13cf0 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
13d00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
13d10 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
13d20 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
13d30 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
13d40 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
13d50 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
13d60 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
13d70 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
13d80 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
13d90 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
13da0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
13db0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
13dc0 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
13dd0 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
13de0 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
13df0 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
13e00 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
13e10 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
13e20 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
13e30 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
13e40 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
13e50 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
13e60 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
13e70 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
13e80 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
13e90 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
13ea0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
13eb0 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
13ec0 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
13ed0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
13ee0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
13ef0 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
13f00 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
13f10 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
13f20 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
13f30 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
13f40 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
13f50 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
13f60 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
13f70 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
13f80 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
13f90 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
13fa0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
13fb0 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
13fc0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
13fd0 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
13fe0 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
13ff0 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
14020 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
14030 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
14040 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
14050 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
14060 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
14070 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
14080 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
14090 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
140a0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
140b0 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
140c0 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
140d0 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
140e0 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
140f0 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
14100 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
14110 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
14120 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
14130 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
14140 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
14150 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
14160 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
14170 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
14180 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
14190 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
141a0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
141b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
141c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
141d0 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
141e0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
141f0 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
14200 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
14210 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
14220 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
14230 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
14240 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
14250 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
14260 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
14270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14280 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
14290 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
142a0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
142b0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
142c0 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
142d0 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
142e0 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
142f0 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
14300 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
14310 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
14320 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
14330 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
14340 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
14350 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
14360 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
14370 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
14380 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
14390 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
143a0 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
143b0 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
143c0 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
143d0 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
143e0 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
143f0 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
14400 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
14410 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
14420 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
14430 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
14440 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
14450 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
14460 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
14470 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
14480 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
14490 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
144a0 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
144b0 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
144c0 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
144d0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
144e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
144f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14500 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
14510 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14520 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14530 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
14540 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
14550 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
14560 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
14570 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
14580 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14590 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
145a0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
145b0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
145c0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
145d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
145e0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
145f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14600 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
14610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14620 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
14630 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
14640 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
14650 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
14660 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
14670 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
14680 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
14690 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
146a0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
146b0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
146c0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
146d0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
146e0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
146f0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
14700 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
14710 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
14720 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
14730 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14740 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
14750 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
14760 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
14770 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
14780 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
14790 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
147a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
147b0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
147c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
147d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
147e0 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
147f0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
14800 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
14810 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
14820 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
14830 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63  File );.  afpLoc
14840 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
14850 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
14860 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
14870 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
14880 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78  xt;.  if( contex
14890 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
148a0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
148b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
148c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
148d0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
148e0 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
148f0 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
14900 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
14910 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   */.  .  /* Chec
14920 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
14930 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
14940 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
14950 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14960 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
14970 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
14980 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
14990 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
149a0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
149b0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
149c0 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20  ss holds it..   
149d0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
149e0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63  ed ){.    /* loc
149f0 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62  k the RESERVED b
14a00 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  yte */.    int l
14a10 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
14a20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14a30 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
14a40 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
14a50 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
14a60 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  ==lrc ){.      /
14a70 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65  * if we succeede
14a80 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20  d in taking the 
14a90 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75  reserved lock, u
14aa0 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74  nlock it to rest
14ab0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ore.      ** the
14ac0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
14ad0 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61  */.      lrc = a
14ae0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
14af0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
14b00 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
14b10 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c   1, 0);.    } el
14b20 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  se {.      /* if
14b30 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65   we failed to ge
14b40 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20  t the lock then 
14b50 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73  someone else mus
14b60 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20  t have it */.   
14b70 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
14b80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
14b90 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
14ba0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72  ) ){.      rc=lr
14bb0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  c;.    }.  }.  .
14bc0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
14bd0 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
14be0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
14bf0 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  %d %d (afp)\n", 
14c00 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
14c10 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a  served));.  .  *
14c20 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
14c30 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
14c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
14c50 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
14c60 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
14c70 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
14c80 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
14c90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14ca0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
14cb0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14cc0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14cd0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14ce0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14cf0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14d00 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14d10 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
14d20 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
14d30 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
14d40 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
14d50 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
14d60 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
14d70 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
14d80 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
14d90 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
14da0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
14db0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14dc0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14dd0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14de0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14df0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14e00 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14e10 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
14e20 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
14e30 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
14e40 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
14e50 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
14e60 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
14e70 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14e80 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
14e90 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
14ea0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14eb0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14ec0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14ed0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14ee0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14ef0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
14f00 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14f10 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
14f20 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
14f30 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
14f40 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
14f50 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
14f60 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
14f70 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
14f80 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14f90 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69   eFileLock){.  i
14fa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14fb0 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
14fc0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14fd0 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
14fe0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
14ff0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
15000 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
15010 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
15020 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15030 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
15040 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
15050 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
15060 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
15070 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
15080 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
15090 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
150a0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
150b0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
150c0 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
150d0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
150e0 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  k),.           a
150f0 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
15100 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
15110 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
15120 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
15130 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
15140 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
15150 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
15160 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
15170 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
15180 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
15190 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
151a0 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
151b0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
151c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
151d0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
151e0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
151f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
15200 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
15210 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
15220 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
15230 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
15240 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
15250 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
15260 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
15270 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
15280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15290 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
152a0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
152b0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
152c0 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
152d0 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
152e0 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
152f0 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
15300 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
15310 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
15320 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
15330 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
15340 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
15350 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
15360 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
15370 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
15380 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
15390 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
153a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
153b0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
153c0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
153d0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
153e0 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
153f0 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
15400 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
15410 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
15420 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15430 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
15440 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
15450 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
15460 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
15470 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
15480 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
15490 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
154a0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
154b0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
154c0 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
154d0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
154e0 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
154f0 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
15500 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
15510 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
15520 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
15530 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
15540 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
15550 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
15560 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
15570 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
15580 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
15590 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
155a0 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
155b0 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
155c0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
155d0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
155e0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
155f0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
15600 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
15610 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
15620 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
15630 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
15640 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
15650 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
15660 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
15670 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
15680 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
15690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
156a0 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
156b0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
156c0 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
156d0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
156e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
156f0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
15700 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
15710 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
15720 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15730 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
15740 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
15750 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
15760 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
15770 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
15780 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15790 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
157a0 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
157b0 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
157c0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
157d0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
157e0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
157f0 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
15800 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
15810 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
15820 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
15830 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
15840 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
15850 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
15860 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
15870 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
15880 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
15890 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
158a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
158b0 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
158c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
158d0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
158e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
158f0 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
15900 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
15910 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
15920 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15930 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15940 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
15950 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
15960 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
15970 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
15980 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15990 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
159a0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
159b0 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
159c0 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
159d0 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
159e0 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
159f0 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
15a00 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
15a10 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
15a20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
15a30 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15a40 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
15a50 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  , lrc1Errno;.   
15a60 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
15a70 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
15a80 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15a90 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
15aa0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
15ab0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
15ac0 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
15ad0 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
15ae0 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
15af0 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
15b00 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
15b10 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
15b20 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
15b30 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
15b40 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
15b50 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
15b60 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
15b70 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
15b80 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
15b90 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
15ba0 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
15bb0 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
15bc0 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
15bd0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15be0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15bf0 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
15c00 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
15c10 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
15c20 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
15c30 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
15c40 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
15c50 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
15c60 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
15c70 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
15c80 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
15c90 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
15ca0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15cb0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15cc0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
15cd0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
15ce0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
15cf0 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
15d00 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15d10 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f  rrno = lrc1Errno
15d20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  ;.      rc = lrc
15d30 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  1;.      goto af
15d40 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
15d50 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f  } else if( IS_LO
15d60 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29  CK_ERROR(lrc2) )
15d70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
15d80 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  2;.      goto af
15d90 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
15da0 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20  } else if( lrc1 
15db0 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  != SQLITE_OK ) {
15dc0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15dd0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
15de0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
15df0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
15e00 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
15e10 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
15e20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
15e30 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
15e40 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
15e50 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15e60 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
15e70 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
15e80 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
15e90 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
15ea0 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
15eb0 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
15ec0 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  .     ** same pr
15ed0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
15ee0 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
15ef0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
15f00 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
15f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
15f20 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
15f30 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
15f40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
15f50 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
15f60 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
15f70 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
15f80 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
15f90 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
15fa0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
15fb0 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
15fc0 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
15fd0 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
15fe0 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28  Lock );.    if (
15ff0 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53  eFileLock >= RES
16000 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
16010 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
16020 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
16030 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
16040 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
16050 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
16060 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
16070 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16080 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16090 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
160a0 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c  .      if( !fail
160b0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ed ){.        co
160c0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
160d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
160e0 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
160f0 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20  ed && eFileLock 
16100 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  == EXCLUSIVE_LOC
16110 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63  K) {.      /* Ac
16120 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
16130 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  VE lock */.     
16140 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d     .      /* Rem
16150 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c  ove the shared l
16160 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e  ock before tryin
16170 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65  g the range.  we
16180 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20  'll need to .   
16190 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73     ** reestablis
161a0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
161b0 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65  k if we can't ge
161c0 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b  t the  afpUnlock
161d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
161e0 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61  if( !(failed = a
161f0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16200 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16210 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
16220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16230 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65            pInode
16240 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
16250 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   0)) ){.        
16260 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51  int failed2 = SQ
16270 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
16280 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
16290 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
162a0 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
162b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
162c0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
162d0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
162e0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
162f0 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
16320 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  E, 1);.        i
16330 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61  f( failed && (fa
16340 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f  iled2 = afpSetLo
16350 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16360 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20     SHARED_FIRST 
16390 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  + pInode->shared
163a0 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
163b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
163c0 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
163d0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
163e0 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
163f0 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
16400 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
16410 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
16420 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16430 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
16440 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
16450 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
16460 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
16470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16480 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
16490 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
164a0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
164b0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
164c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
164d0 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
164e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
164f0 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
16500 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
16510 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
16520 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16530 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
16540 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16550 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
16560 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
16570 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
16580 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
16590 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
165a0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
165b0 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
165c0 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
165d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
165e0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
165f0 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
16600 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
16610 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
16620 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
16630 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %s (afp)\n", pF
16640 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
16650 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
16660 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
16670 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
16680 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
16690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
166a0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
166b0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
166c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
166d0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
166e0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
166f0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
16700 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
16710 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
16720 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
16730 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
16740 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
16750 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
16760 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
16770 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
16780 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
16790 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
167a0 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
167b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
167c0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
167d0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
167e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
167f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
16800 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
16810 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
16820 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
16830 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
16840 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
16850 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
16860 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
16870 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65  .  int skipShare
16880 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
16890 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
168a0 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65  h = pFile->h;.#e
168b0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
168c0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
168d0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
168e0 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
168f0 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
16900 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
16910 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
16920 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16930 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
16940 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
16950 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
16960 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ared,.          
16970 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
16980 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
16990 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
169a0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
169b0 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
169c0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
169d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
169e0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
169f0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
16a00 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
16a10 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16a20 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
16a30 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
16a40 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
16a50 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
16a60 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
16a70 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
16a80 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
16a90 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
16aa0 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
16ab0 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
16ac0 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
16ad0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
16ae0 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e  ;.    .#ifndef N
16af0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
16b00 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
16b10 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
16b20 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
16b30 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
16b40 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
16b50 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
16b60 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
16b70 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
16b80 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
16b90 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
16ba0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
16bb0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
16bc0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
16bd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
16be0 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
16bf0 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
16c00 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
16c10 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
16c20 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
16c30 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
16c40 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
16c50 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
16c60 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
16c70 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
16c80 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
16c90 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
16ca0 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
16cb0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
16cc0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
16cd0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
16ce0 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
16cf0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
16d00 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
16d10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
16d20 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
16d30 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
16d40 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
16d50 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
16d60 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
16d70 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  >eFileLock==EXCL
16d80 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
16d90 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
16da0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16db0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
16dc0 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
16dd0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
16de0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16df0 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
16e00 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
16e10 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16e20 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >1) ){.        /
16e30 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c  * only re-establ
16e40 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
16e50 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ock if necessary
16e60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
16e70 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
16e80 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
16e90 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16ea0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
16eb0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16ec0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16ed0 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
16ee0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 1, 1);.      }
16ef0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
16f00 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a  skipShared = 1;.
16f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16f20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16f30 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
16f40 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
16f50 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
16f60 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16f70 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16f80 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
16f90 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
16fa0 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  } .    if( rc==S
16fb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
16fc0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45  e->eFileLock>=RE
16fd0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63  SERVED_LOCK && c
16fe0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
16ff0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
17000 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17010 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17020 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
17030 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
17040 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20  ( !rc ){ .      
17050 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
17060 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  ved = 0; .      
17070 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17090 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
170a0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
170b0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b  de->nShared>1)){
170c0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
170d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
170e0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
170f0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
17100 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f  TE_OK && eFileLo
17110 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a  ck==NO_LOCK ){..
17120 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
17130 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17140 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
17150 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
17160 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
17170 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
17180 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
17190 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
171a0 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
171b0 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
171c0 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65    */.    unsigne
171d0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
171e0 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
171f0 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
17200 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
17210 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
17220 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
17230 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
17240 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ){.      Simulat
17250 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
17260 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
17270 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
17280 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
17290 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
172a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b  );.      if( !sk
172b0 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ipShared ){.    
172c0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
172d0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
172e0 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
172f0 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
17300 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17310 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
17320 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17330 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
17340 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
17350 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
17360 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
17370 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17390 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
173a0 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
173b0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
173c0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
173d0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
173e0 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
173f0 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
17400 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17410 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
17420 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
17430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17440 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
17450 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
17460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17470 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
17480 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
17490 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
174a0 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
174b0 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
174c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
174d0 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
174e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
174f0 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
17500 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
17510 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
17520 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e   afpUnlock(id, N
17530 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69  O_LOCK);.    uni
17540 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
17550 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49     if( pFile->pI
17560 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70  node && pFile->p
17570 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
17580 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
17590 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
175a0 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
175b0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
175c0 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
175d0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
175e0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
175f0 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
17600 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
17610 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
17620 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
17630 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  node->aPending. 
17640 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
17650 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
17660 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
17670 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
17680 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
17690 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
176a0 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
176b0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e   }.    releaseIn
176c0 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
176d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
176e0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
176f0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20  ontext);.    rc 
17700 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
17710 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  id);.    unixLea
17720 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20  veMutex();.  }. 
17730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
17740 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
17750 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
17760 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17770 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
17780 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
17790 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f  ve is the AFP lo
177a0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
177b0 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
177c0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
177d0 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
177e0 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
177f0 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
17800 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
17810 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
17820 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20  .  If you don't 
17830 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61  compile for a ma
17840 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69  c, then the "uni
17850 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73  x-afp".** VFS is
17860 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a   not available..
17870 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
17880 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
17890 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
178a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
178b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178c0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
178d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17910 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
17920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17960 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
17970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
17980 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e  Begin NFS Lockin
17990 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179b0 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  **/..#if defined
179c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
179d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
179e0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a  KING_STYLE./*. *
179f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17a00 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
17a10 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
17a20 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
17a30 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20    eFileLock. ** 
17a40 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17a50 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
17a60 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49  _LOCK.. **. ** I
17a70 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
17a80 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
17a90 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
17aa0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
17ab0 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73  w. ** the reques
17ac0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17ad0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17ae0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a  is a no-op.. */.
17af0 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e  static int nfsUn
17b00 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
17b10 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
17b20 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20  Lock){.  return 
17b30 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
17b40 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d  eFileLock, 1);.}
17b50 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
17b60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
17b70 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
17b80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
17b90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
17ba0 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53  above is the NFS
17bb0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
17bc0 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
17bd0 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
17be0 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
17bf0 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
17c00 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
17c10 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
17c20 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
17c30 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  ble.  .**.******
17c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
17c50 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c  End of the NFS l
17c60 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
17c70 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
17c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
17c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cd0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
17ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d  *********** Non-
17d40 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
17d50 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  file methods ***
17d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
17d80 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69   The next divisi
17d90 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c  on contains impl
17da0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
17db0 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  all methods of t
17dc0 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  he .** sqlite3_f
17dd0 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72  ile object other
17de0 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   than the lockin
17df0 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  g methods.  The 
17e00 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f  locking.** metho
17e10 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  ds were defined 
17e20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f  in divisions abo
17e30 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20  ve (one locking 
17e40 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69  method per.** di
17e50 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20  vision).  Those 
17e60 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65  methods that are
17e70 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
17e80 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20  ocking modes.** 
17e90 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74  are gather toget
17ea0 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69  her into this di
17eb0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  vision..*/../*.*
17ec0 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
17ed0 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74  fset passed as t
17ee0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17ef0 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e  nt, then read cn
17f00 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f  t .** bytes into
17f10 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68   pBuf. Return th
17f20 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
17f30 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
17f40 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79  .**.** NB:  If y
17f50 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ou define USE_PR
17f60 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44  EAD or USE_PREAD
17f70 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  64, then it migh
17f80 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63  t also.** be nec
17f90 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65  essary to define
17fa0 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74   _XOPEN_SOURCE t
17fb0 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20  o be 500.  This 
17fc0 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f  varies from.** o
17fd0 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f  ne system to ano
17fe0 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c  ther.  Since SQL
17ff0 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66  ite does not def
18000 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a  ine USE_PREAD.**
18010 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79   any any form by
18020 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c   default, we wil
18030 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
18040 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
18050 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69  OURCE..** See ti
18060 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20  ckets #2741 and 
18070 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  #2681..**.** To 
18080 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
18090 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
180a0 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20  n a failed read 
180b0 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
180c0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
180d0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
180e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
180f0 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69  ekAndRead(unixFi
18100 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
18110 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f  int64 offset, vo
18120 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
18130 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23  t){.  int got;.#
18140 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
18150 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
18160 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
18170 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
18180 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
18190 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
181a0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
181b0 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72    do{ got = osPr
181c0 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
181d0 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d   cnt, offset); }
181e0 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
181f0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
18200 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18210 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
18220 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
18230 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
18240 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28  got = osPread64(
18250 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18260 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c  , offset); }whil
18270 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
18280 6f 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d  o==EINTR);.  Sim
18290 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
182a0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
182b0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
182c0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
182d0 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
182e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
182f0 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
18300 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
18310 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69  =offset ){.    i
18320 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
18330 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e  -1 ){.      ((un
18340 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18350 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
18360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18370 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
18380 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
18390 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ....    }.    re
183a0 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64  turn -1;.  }.  d
183b0 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28  o{ got = osRead(
183c0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
183d0 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
183e0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
183f0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d   );.#endif.  TIM
18400 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
18410 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
18420 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18430 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18440 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52   }.  OSTRACE(("R
18450 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
18460 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69  %7lld %llu\n", i
18470 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65  d->h, got, offse
18480 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  t, TIMER_ELAPSED
18490 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  ));.  return got
184a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
184b0 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
184c0 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
184d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
184e0 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
184f0 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
18500 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
18510 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
18520 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
18530 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
18540 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
18550 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
18560 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
18570 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
18580 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
18590 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
185a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
185b0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
185c0 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
185d0 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  d );..  /* If th
185e0 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
185f0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
18600 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
18610 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
18620 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
18630 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
18640 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
18650 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
18660 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
18670 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
18680 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
18690 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
186a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
186b0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
186c0 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
186d0 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
186e0 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ..  got = seekAn
186f0 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66  dRead(pFile, off
18700 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
18710 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
18720 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18730 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
18740 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
18750 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
18760 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
18770 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  d */.    return 
18780 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
18790 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
187a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
187b0 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
187c0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
187d0 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
187e0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
187f0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
18800 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
18810 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
18820 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
18830 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
18840 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
18850 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
18860 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
18870 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
18880 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
18890 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
188a0 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
188b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
188c0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
188d0 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
188e0 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ffset..**.** To 
188f0 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
18900 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
18910 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65  n a failed write
18920 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
18930 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
18940 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18960 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
18970 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
18980 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
18990 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
189a0 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66  {.  int got;.#if
189b0 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
189c0 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
189d0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
189e0 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
189f0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
18a00 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
18a10 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
18a20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69  do{ got = osPwri
18a30 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
18a40 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77  cnt, offset); }w
18a50 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
18a60 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
18a70 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
18a80 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
18a90 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34  got = osPwrite64
18aa0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18ab0 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c  t, offset);}whil
18ac0 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
18ad0 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
18ae0 0a 20 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66  .  do{.    newOf
18af0 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
18b00 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
18b10 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
18b20 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f  ateIOError( newO
18b30 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69  ffset-- );.    i
18b40 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
18b50 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66  fset ){.      if
18b60 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
18b70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75  1 ){.        ((u
18b80 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18b90 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18ba0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18bb0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
18bc0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
18bd0 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 20 20 7d   = 0;....      }
18be0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
18bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20  ;.    }.    got 
18c00 3d 20 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c  = osWrite(id->h,
18c10 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d   pBuf, cnt);.  }
18c20 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
18c30 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
18c40 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45  #endif.  TIMER_E
18c50 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20  ND;.  if( got<0 
18c60 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
18c70 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
18c80 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a  o = errno;.  }..
18c90 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
18ca0 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
18cb0 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
18cc0 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
18cd0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
18ce0 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
18cf0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
18d00 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
18d10 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
18d20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18d30 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
18d40 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
18d50 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
18d60 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
18d70 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73  t unixWrite(.  s
18d80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
18d90 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
18da0 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74  pBuf, .  int amt
18db0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
18dc0 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75  4 offset .){.  u
18dd0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
18de0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
18df0 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
18e00 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
18e10 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
18e20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
18e30 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
18e40 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
18e50 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
18e60 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
18e70 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
18e80 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
18e90 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
18ea0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
18eb0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
18ec0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
18ed0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
18ee0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
18ef0 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
18f00 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
18f10 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
18f20 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
18f30 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18f40 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
18f50 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
18f60 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
18f70 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
18f80 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
18f90 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
18fa0 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
18fb0 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
18fc0 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
18fd0 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
18fe0 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
18ff0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
19000 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
19010 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
19020 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
19030 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
19040 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
19050 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
19060 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
19070 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
19080 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
19090 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
190a0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
190b0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
190c0 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
190d0 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
190e0 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
190f0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
19100 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
19110 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
19120 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
19130 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
19140 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
19150 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
19160 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
19170 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
19180 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19190 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
191a0 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
191b0 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
191c0 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
191d0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
191e0 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
191f0 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
19200 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
19210 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
19220 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
19230 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20  .  while( amt>0 
19240 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b  && (wrote = seek
19250 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
19260 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
19270 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  t))>0 ){.    amt
19280 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f   -= wrote;.    o
19290 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a  ffset += wrote;.
192a0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
192b0 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
192c0 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
192d0 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  IOError(( wrote=
192e0 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  (-1), amt=1 ));.
192f0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
19300 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  llError(( wrote=
19310 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20  0, amt=1 ));..  
19320 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20  if( amt>0 ){.   
19330 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20   if( wrote<0 && 
19340 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
19350 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20  !=ENOSPC ){.    
19360 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
19370 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  et by seekAndWri
19380 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  te */.      retu
19390 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
193a0 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
193b0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
193c0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a  astErrno = 0; /*
193d0 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
193e0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ror */.      ret
193f0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
19400 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
19410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19420 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
19430 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
19440 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
19450 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
19460 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
19470 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
19480 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
19490 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
194a0 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74  e occurring at t
194b0 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
194c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
194d0 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
194e0 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
194f0 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
19500 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
19510 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73  do not trust sys
19520 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20  tems to provide 
19530 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73  a working fdatas
19540 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e  ync().  Some do.
19550 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f  .** Others do no
19560 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77  .  To be safe, w
19570 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74  e will stick wit
19580 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20 66  h the (slower) f
19590 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f  sync()..** If yo
195a0 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72  u know that your
195b0 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70   system does sup
195c0 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29  port fdatasync()
195d0 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74   correctly,.** t
195e0 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69  hen simply compi
195f0 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73  le with -Dfdatas
19600 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f  ync=fdatasync.*/
19610 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64  .#if !defined(fd
19620 61 74 61 73 79 6e 63 29 20 26 26 20 21 64 65 66  atasync) && !def
19630 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
19640 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
19650 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
19660 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
19670 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
19680 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
19690 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
196a0 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
196b0 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
196c0 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
196d0 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
196e0 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
196f0 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
19700 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
19710 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
19720 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
19730 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
19740 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
19750 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
19760 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
19770 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
19780 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
19790 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
197a0 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
197b0 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
197c0 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
197d0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
197e0 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
197f0 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
19800 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
19810 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
19820 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
19830 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
19840 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
19850 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
19860 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
19870 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
19880 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
19890 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
198a0 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
198b0 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
198c0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
198d0 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
198e0 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
198f0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
19900 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
19910 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
19920 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
19930 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
19940 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
19950 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
19960 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
19970 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
19980 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
19990 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
199a0 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
199b0 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
199c0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
199d0 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
199e0 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
199f0 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
19a00 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
19a10 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
19a20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
19a30 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
19a40 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
19a50 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
19a60 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
19a70 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
19a80 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
19a90 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
19aa0 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
19ab0 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
19ac0 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
19ad0 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
19ae0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
19af0 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
19b00 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
19b10 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
19b20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
19b30 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
19b40 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
19b50 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
19b60 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
19b70 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
19b80 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
19b90 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
19ba0 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
19bb0 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
19bc0 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
19bd0 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
19be0 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
19bf0 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
19c00 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
19c10 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
19c20 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
19c30 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
19c40 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
19c50 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
19c60 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
19c70 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
19c80 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
19c90 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
19ca0 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
19cb0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
19cc0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
19cd0 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
19ce0 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
19cf0 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
19d00 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
19d10 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
19d20 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
19d30 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
19d40 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
19d50 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
19d60 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
19d70 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
19d80 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
19d90 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
19da0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
19db0 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
19dc0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
19dd0 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
19de0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
19df0 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
19e00 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
19e10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
19e20 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
19e30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19e40 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
19e50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19e60 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
19e70 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
19e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
19e90 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
19ea0 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
19eb0 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
19ec0 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
19ed0 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
19ee0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
19ef0 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
19f00 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
19f10 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
19f20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
19f30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19f40 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
19f50 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
19f60 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
19f70 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
19f80 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
19f90 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
19fa0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
19fb0 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
19fc0 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
19fd0 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
19fe0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19ff0 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
1a000 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
1a010 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1a020 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
1a030 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1a040 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
1a050 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
1a060 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
1a070 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
1a080 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
1a090 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
1a0a0 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
1a0b0 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
1a0c0 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
1a0d0 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
1a0e0 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
1a0f0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
1a100 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
1a110 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
1a120 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
1a130 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
1a140 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
1a150 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
1a160 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
1a170 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
1a180 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
1a190 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
1a1a0 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
1a1b0 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
1a1c0 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
1a1d0 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
1a1e0 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
1a1f0 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
1a200 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
1a210 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
1a220 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
1a230 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
1a240 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
1a250 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1a260 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
1a270 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
1a280 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
1a290 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
1a2a0 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
1a2b0 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
1a2c0 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
1a2d0 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
1a2e0 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
1a2f0 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
1a300 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
1a310 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
1a320 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
1a330 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
1a340 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
1a350 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
1a360 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
1a370 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
1a380 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1a390 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
1a3a0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1a3b0 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
1a3c0 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
1a3d0 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1a3e0 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
1a3f0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
1a400 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a410 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
1a420 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
1a430 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1a440 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
1a450 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
1a460 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
1a470 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
1a480 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1a490 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1a4a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1a4b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1a4c0 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
1a4d0 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
1a4e0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
1a4f0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
1a500 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
1a510 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
1a520 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65  ..**.** The dire
1a530 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1a540 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  iptor is used fo
1a550 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67  r only one thing
1a560 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29   - to.** fsync()
1a570 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20   a directory to 
1a580 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63  make sure file c
1a590 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65  reation and dele
1a5a0 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61  tion events.** a
1a5b0 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  re flushed to di
1a5c0 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73  sk.  Such fsyncs
1a5d0 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
1a5e0 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72  on newer.** jour
1a5f0 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65  naling filesyste
1a600 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75  ms, but are requ
1a610 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69  ired on older fi
1a620 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a  lesystems..**.**
1a630 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1a640 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
1a650 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79  using the xSetSy
1a660 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  sCall interface.
1a670 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20  .** The ability 
1a680 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  to override this
1a690 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64   routine was add
1a6a0 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66  ed in support of
1a6b0 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d   the.** chromium
1a6c0 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69   sandbox.  Openi
1a6d0 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  ng a directory i
1a6e0 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73  s a security ris
1a6f0 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c  k (we are.** tol
1a700 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20  d) so making it 
1a710 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c  overrideable all
1a720 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d  ows the chromium
1a730 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72   sandbox to.** r
1a740 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74  eplace this rout
1a750 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c  ine with a harml
1a760 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d  ess no-op.  To m
1a770 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ake this routine
1a780 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70  .** a no-op, rep
1a790 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73  lace it with a s
1a7a0 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73  tub that returns
1a7b0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1a7c0 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65  eaves.** *pFd se
1a7d0 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20  t to a negative 
1a7e0 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  number..**.** If
1a7f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1a800 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
1a810 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1a820 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
1a830 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1a840 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
1a850 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
1a860 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
1a870 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
1a880 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
1a890 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
1a8a0 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
1a8b0 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
1a8c0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
1a8d0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1a8e0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1a8f0 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
1a900 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
1a910 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
1a920 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
1a930 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>1 && zDirname[
1a940 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
1a950 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
1a960 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
1a970 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d  = '\0';.    fd =
1a980 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1a990 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1a9a0 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1a9b0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23    if( fd>=0 ){.#
1a9c0 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
1a9d0 0a 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  .      osFcntl(f
1a9e0 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
1a9f0 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
1aa00 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
1aa10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1aa20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
1aa30 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
1aa40 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
1aa50 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
1aa60 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
1aa70 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
1aa80 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1aa90 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1aaa0 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
1aab0 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  me));.}../*.** M
1aac0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1aad0 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1aae0 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1aaf0 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1ab00 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1ab10 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1ab20 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1ab30 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1ab40 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1ab50 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1ab60 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1ab70 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1ab80 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1ab90 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1aba0 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1abb0 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1abc0 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1abd0 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1abe0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1abf0 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1ac00 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1ac10 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1ac20 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1ac30 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1ac40 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1ac50 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1ac60 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1ac70 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1ac80 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1ac90 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1aca0 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1acb0 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1acc0 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1acd0 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1ace0 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1acf0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1ad00 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1ad10 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1ad20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1ad30 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1ad40 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1ad50 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1ad60 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1ad70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1ad80 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1ad90 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1ada0 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1adb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1adc0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1add0 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1ade0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1adf0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1ae00 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1ae10 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1ae20 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1ae30 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1ae40 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1ae50 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1ae60 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1ae70 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1ae80 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1ae90 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1aea0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1aeb0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1aec0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1aed0 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1aee0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1aef0 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1af00 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1af10 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1af20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1af30 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1af40 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1af50 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1af60 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1af70 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1af80 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1af90 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1afa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1afb0 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1afc0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1afd0 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1afe0 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1aff0 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1b000 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1b010 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1b020 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1b030 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1b040 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1b050 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1b060 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1b070 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1b080 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1b090 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1b0a0 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1b0b0 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1b0c0 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1b0d0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1b0e0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1b0f0 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1b100 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1b110 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1b120 65 20 6f 63 63 75 72 72 61 6e 63 65 2e 20 20 4d  e occurrance.  M
1b130 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1b140 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1b150 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1b160 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1b170 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1b180 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1b190 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1b1a0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1b1b0 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1b1c0 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1b1d0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1b1e0 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1b1f0 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1b200 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1b210 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1b220 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1b230 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1b240 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1b250 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1b260 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1b270 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1b280 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b290 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
1b2a0 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
1b2b0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
1b2c0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1b2d0 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
1b2e0 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
1b2f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b300 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
1b310 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1b330 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1b340 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e  ~UNIXFILE_DIRSYN
1b350 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
1b360 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1b370 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1b380 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1b390 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1b3a0 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1b3b0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1b3c0 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1b3d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1b3e0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1b3f0 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
1b400 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1b410 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1b420 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1b430 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1b440 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1b450 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1b460 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1b470 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1b480 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1b490 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
1b4a0 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
1b4b0 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1b4c0 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
1b4d0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
1b4e0 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
1b4f0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
1b500 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
1b510 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
1b520 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
1b530 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1b540 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79  Chunk ){.    nBy
1b550 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
1b560 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
1b570 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
1b580 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1b590 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  unk;.  }..  rc =
1b5a0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1b5b0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66  e(pFile->h, (off
1b5c0 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  _t)nByte);.  if(
1b5d0 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
1b5e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1b5f0 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1b600 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1b610 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1b620 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1b630 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1b640 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
1b650 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49   NDEBUG.    /* I
1b660 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1b670 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1b680 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1b690 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1b6a0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1b6b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1b6c0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1b6d0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1b6e0 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1b6f0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1b700 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1b710 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1b720 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1b730 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1b740 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1b750 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1b760 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1b770 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1b780 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1b790 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1b7a0 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1b7b0 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1b7c0 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1b7d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
1b7e0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1b7f0 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
1b800 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
1b810 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1b820 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1b830 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b840 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
1b850 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
1b860 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
1b870 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
1b880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1b890 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  ixFileSize(sqlit
1b8a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1b8b0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
1b8c0 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  rc;.  struct sta
1b8d0 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28  t buf;.  assert(
1b8e0 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73   id );.  rc = os
1b8f0 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  Fstat(((unixFile
1b900 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b  *)id)->h, &buf);
1b910 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1b920 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1b930 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28  ( rc!=0 ){.    (
1b940 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1b950 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1b960 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  o;.    return SQ
1b970 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1b980 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
1b990 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20   buf.st_size;.. 
1b9a0 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67   /* When opening
1b9b0 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74   a zero-size dat
1b9c0 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49  abase, the findI
1b9d0 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65  nodeInfo() proce
1b9e0 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73  dure.  ** writes
1b9f0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1ba00 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e  nto that file in
1ba10 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61   order to work a
1ba20 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a  round a bug.  **
1ba30 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64   in the OS-X msd
1ba40 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  os filesystem.  
1ba50 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  In order to avoi
1ba60 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  d problems with 
1ba70 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72  upper.  ** layer
1ba80 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  s, we need to re
1ba90 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73  port this file s
1baa0 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e  ize as zero even
1bab0 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20   though it is.  
1bac0 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54  ** really 1.   T
1bad0 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a  icket #3260..  *
1bae0 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d  /.  if( *pSize==
1baf0 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a  1 ) *pSize = 0;.
1bb00 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1bb10 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
1bb20 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1bb30 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1bb40 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
1bb50 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72  *.** Handler for
1bb60 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66   proxy-locking f
1bb70 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62  ile-control verb
1bb80 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f  s.  Defined belo
1bb90 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78  w in the.** prox
1bba0 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76  ying locking div
1bbb0 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ision..*/.static
1bbc0 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f   int proxyFileCo
1bbd0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1bbe0 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a  le*,int,void*);.
1bbf0 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54  #endif../* .** T
1bc00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1bc10 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65  called to handle
1bc20 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
1bc30 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20  L_SIZE_HINT .** 
1bc40 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65  file-control ope
1bc50 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
1bc60 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
1bc70 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
1bc80 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
1bc90 69 6c 65 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ile, it could be
1bca0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c  .** that the fil
1bcb0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 65 78  e needs to be ex
1bcc0 74 65 6e 64 65 64 20 61 74 20 74 68 69 73 20 70  tended at this p
1bcd0 6f 69 6e 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  oint. Otherwise,
1bce0 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46   the.** SQLITE_F
1bcf0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 6f  CNTL_SIZE_HINT o
1bd00 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 6e 6f  peration is a no
1bd10 2d 6f 70 20 66 6f 72 20 55 6e 69 78 2e 0a 2a 2f  -op for Unix..*/
1bd20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74  .static int fcnt
1bd30 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69  lSizeHint(unixFi
1bd40 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e  le *pFile, i64 n
1bd50 42 79 74 65 29 7b 0a 20 20 7b 20 2f 2a 20 70 72  Byte){.  { /* pr
1bd60 65 73 65 72 76 65 20 69 6e 64 65 6e 74 61 74 69  eserve indentati
1bd70 6f 6e 20 6f 66 20 72 65 6d 6f 76 65 64 20 22 69  on of removed "i
1bd80 66 22 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 53  f" */.    i64 nS
1bd90 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1bda0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1bdb0 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1bdc0 0a 20 20 20 20 69 36 34 20 73 7a 43 68 75 6e 6b  .    i64 szChunk
1bdd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bde0 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
1bdf0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
1be00 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20  tat buf;        
1be10 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1be20 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c   hold return val
1be30 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a  ues of fstat() *
1be40 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73  /.   .    if( os
1be50 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
1be60 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 53  &buf) ) return S
1be70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1be80 54 3b 0a 0a 20 20 20 20 73 7a 43 68 75 6e 6b 20  T;..    szChunk 
1be90 3d 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  = pFile->szChunk
1bea0 3b 0a 20 20 20 20 69 66 28 20 73 7a 43 68 75 6e  ;.    if( szChun
1beb0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  k==0 ){.      nS
1bec0 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ize = nByte;.   
1bed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
1bee0 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 73 7a  ize = ((nByte+sz
1bef0 43 68 75 6e 6b 2d 31 29 20 2f 20 73 7a 43 68 75  Chunk-1) / szChu
1bf00 6e 6b 29 20 2a 20 73 7a 43 68 75 6e 6b 3b 0a 20  nk) * szChunk;. 
1bf10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 69     }.    if( nSi
1bf20 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73  ze>(i64)buf.st_s
1bf30 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69  ize ){..#if defi
1bf40 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
1bf50 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
1bf60 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1bf70 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  E.      /* The c
1bf80 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e  ode below is han
1bf90 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  dling the return
1bfa0 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c   value of osFall
1bfb0 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a  ocate() .      *
1bfc0 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73  * correctly. pos
1bfd0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69  ix_fallocate() i
1bfe0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65  s defined to "re
1bff0 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75  turns zero on su
1c000 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a  ccess, .      **
1c010 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d   or an error num
1c020 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22  ber on  failure"
1c030 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67  . See the manpag
1c040 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  e for details. *
1c050 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b  /.      int err;
1c060 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
1c070 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f     err = osFallo
1c080 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62  cate(pFile->h, b
1c090 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a  uf.st_size, nSiz
1c0a0 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a  e-buf.st_size);.
1c0b0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72        }while( er
1c0c0 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  r==EINTR );.    
1c0d0 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74 75    if( err ) retu
1c0e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c0f0 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20  WRITE;.#else.   
1c100 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20     /* If the OS 
1c110 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f  does not have po
1c120 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c  six_fallocate(),
1c130 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20   fake it. First 
1c140 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72  use.      ** ftr
1c150 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74 20  uncate() to set 
1c160 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74  the file size, t
1c170 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67  hen write a sing
1c180 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20  le byte to.     
1c190 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74   ** the last byt
1c1a0 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
1c1b0 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e  within the exten
1c1c0 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73  ded region. This
1c1d0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
1c1e0 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20   same technique 
1c1f0 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f  used by glibc to
1c200 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78   implement posix
1c210 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20  _fallocate().   
1c220 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73     ** on systems
1c230 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76   that do not hav
1c240 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61  e a real falloca
1c250 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  te() system call
1c260 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c270 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1c280 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1c290 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1c2a0 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1c2b0 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c2d0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1c2e0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1c2f0 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1c300 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1c310 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  nSize) ){.      
1c320 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1c330 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1c340 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1c350 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1c360 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1c370 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1c380 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1c390 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20   }.      iWrite 
1c3a0 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20  = ((buf.st_size 
1c3b0 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42  + 2*nBlk - 1)/nB
1c3c0 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20  lk)*nBlk-1;.    
1c3d0 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c    while( iWrite<
1c3e0 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  nSize ){.       
1c3f0 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65   int nWrite = se
1c400 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1c410 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29  , iWrite, "", 1)
1c420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57  ;.        if( nW
1c430 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e  rite!=1 ) return
1c440 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1c450 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72  ITE;.        iWr
1c460 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20  ite += nBlk;.   
1c470 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c480 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1c490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c4a0 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
1c4b0 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61  and control of a
1c4c0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  n open file hand
1c4d0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1c4e0 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f  t unixFileContro
1c4f0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
1c500 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
1c510 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46   *pArg){.  unixF
1c520 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1c530 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  ixFile*)id;.  sw
1c540 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1c550 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1c560 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
1c570 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1c580 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
1c590 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ock;.      retur
1c5a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1c5b0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1c5c0 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
1c5d0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1c5e0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  rg = pFile->last
1c5f0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
1c600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c610 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1c620 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
1c630 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
1c640 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
1c650 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
1c660 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c670 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1c680 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1c690 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
1c6a0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1c6b0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1c6c0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1c6d0 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a     rc = fcntlSiz
1c6e0 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69  eHint(pFile, *(i
1c6f0 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  64 *)pArg);.    
1c700 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1c710 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1c720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c730 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1c740 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
1c750 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _WAL: {.      in
1c760 74 20 62 50 65 72 73 69 73 74 20 3d 20 2a 28 69  t bPersist = *(i
1c770 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
1c780 69 66 28 20 62 50 65 72 73 69 73 74 3c 30 20 29  if( bPersist<0 )
1c790 7b 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a  {.        *(int*
1c7a0 29 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  )pArg = (pFile->
1c7b0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1c7c0 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
1c7d0 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )!=0;.      }els
1c7e0 65 20 69 66 28 20 62 50 65 72 73 69 73 74 3d 3d  e if( bPersist==
1c7f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
1c800 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
1c810 20 7e 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49   ~UNIXFILE_PERSI
1c820 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 65  ST_WAL;.      }e
1c830 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
1c840 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
1c850 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
1c860 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  T_WAL;.      }. 
1c870 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c880 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
1c890 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1c8a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
1c8b0 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
1c8c0 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
1c8d0 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
1c8e0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
1c8f0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1c900 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
1c910 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
1c920 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
1c930 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
1c940 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
1c950 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
1c960 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
1c970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c980 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1c990 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
1c9a0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1c9b0 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
1c9c0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
1c9d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c9e0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1c9f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1ca00 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1ca10 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1ca20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
1ca30 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1ca40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ca50 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
1ca60 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
1ca70 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
1ca80 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
1ca90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1caa0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1cab0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1cac0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1cad0 5f 29 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  _) */.    case S
1cae0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43  QLITE_FCNTL_SYNC
1caf0 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20  _OMITTED: {.    
1cb00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cb10 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70 20  OK;  /* A no-op 
1cb20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
1cb30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
1cb40 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
1cb50 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
1cb60 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
1cb70 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
1cb80 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
1cb90 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
1cba0 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
1cbb0 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
1cbc0 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
1cbd0 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
1cbe0 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
1cbf0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
1cc00 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
1cc10 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
1cc20 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
1cc30 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
1cc40 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
1cc50 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
1cc60 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
1cc70 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
1cc80 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
1cc90 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
1cca0 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
1ccb0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1ccc0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
1ccd0 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
1cce0 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
1ccf0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1cd00 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
1cd10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1cd20 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
1cd30 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
1cd40 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
1cd50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1cd60 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
1cd70 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65  eristics for the
1cd80 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
1cd90 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78  lways 0 for unix
1cda0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cdb0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
1cdc0 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
1cdd0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
1cde0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1cdf0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
1ce00 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
1ce10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ce20 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62  T_WAL.../*.** Ob
1ce30 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
1ce40 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64  resent an shared
1ce50 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20   memory buffer. 
1ce60 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c   .**.** When mul
1ce70 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
1ce80 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
1ce90 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20  same wal-index, 
1cea0 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68  each thread.** h
1ceb0 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53  as its own unixS
1cec0 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  hm object, but t
1ced0 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f  hey all point to
1cee0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
1cef0 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e  ce.** of this un
1cf00 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1cf10 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1cf20 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65  s, each wal-inde
1cf30 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  x is opened.** o
1cf40 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
1cf50 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  cess..**.** Each
1cf60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1cf70 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  ect is connected
1cf80 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69   to a single uni
1cf90 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
1cfa0 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63  t..** We could c
1cfb0 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a  oalesce this obj
1cfc0 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f  ect into unixIno
1cfd0 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74  deInfo, but that
1cfe0 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65   would mean.** e
1cff0 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74  very open file t
1d000 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
1d010 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28   shared memory (
1d020 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
1d030 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c  most.** open fil
1d040 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74  es) would have t
1d050 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74  o carry around t
1d060 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  his extra inform
1d070 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68  ation.  So.** th
1d080 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
1d090 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
1d0a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
1d0b0 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1d0c0 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ject.** and the 
1d0d0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1d0e0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e  ct is created on
1d0f0 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a  ly when needed..
1d100 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  **.** unixMutexH
1d110 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
1d120 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
1d130 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
1d140 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
1d150 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
1d160 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
1d170 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
1d180 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
1d190 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1d1a0 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
1d1b0 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
1d1c0 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
1d1d0 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
1d1e0 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
1d1f0 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
1d200 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ther unixShmNode
1d210 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
1d220 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f  eld or unixShmNo
1d230 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
1d240 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  * unixMutexHeld(
1d250 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
1d260 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1d270 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
1d280 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
1d290 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
1d2a0 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a  t unixShmNode {.
1d2b0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
1d2c0 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  *pInode;     /* 
1d2d0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68  unixInodeInfo th
1d2e0 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d  at owns this SHM
1d2f0 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   node */.  sqlit
1d300 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
1d310 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
1d320 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
1d330 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
1d340 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
1d350 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1d360 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  the mmapped file
1d370 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
1d3a0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e  scriptor */.  in
1d3b0 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
1d3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1d3d0 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
1d3e0 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75  y regions */.  u
1d3f0 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  16 nRegion;     
1d400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1d410 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
1d420 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65  ion */.  u8 isRe
1d430 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adonly;         
1d440 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1d450 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68  ead-only */.  ch
1d460 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20  ar **apRegion;  
1d470 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
1d480 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72  y of mapped shar
1d490 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1d4a0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
1d4d0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
1d4e0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1d4f0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46  */.  unixShm *pF
1d500 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1d510 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f  /* All unixShm o
1d520 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1d530 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65  to this */.#ifde
1d540 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d550 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20   u8 exclMask;   
1d560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1d570 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
1d580 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
1d590 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20   u8 sharedMask; 
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1d5b0 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
1d5c0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
1d5d0 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
1d5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1d5f0 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53   available unixS
1d600 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
1d610 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1d620 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
1d630 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
1d640 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
1d650 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
1d660 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
1d670 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
1d680 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
1d690 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
1d6a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
1d6b0 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
1d6c0 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
1d6d0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
1d6e0 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
1d6f0 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65     unixShm.pFile
1d700 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69  .**    unixShm.i
1d710 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
1d720 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
1d730 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e  d/write.  The un
1d740 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74  ixShm.pFile->mut
1d750 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
1d760 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
1d770 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
1d780 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
1d790 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20  uct unixShm {.  
1d7a0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1d7b0 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68  mNode;     /* Th
1d7c0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69  e underlying uni
1d7d0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1d7e0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e  */.  unixShm *pN
1d7f0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1d800 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20  /* Next unixShm 
1d810 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e  with the same un
1d820 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
1d830 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
1d840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d850 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
1d860 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74   unixShmNode mut
1d870 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  ex */.  u16 shar
1d880 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1d890 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
1d8a0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
1d8b0 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
1d8c0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1d8d0 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
1d8e0 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
1d8f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d900 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20  _DEBUG.  u8 id; 
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
1d930 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
1d940 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e  hin its unixShmN
1d950 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ode */.#endif.};
1d960 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
1d970 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
1d980 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
1d990 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IX_SHM_BASE   ((
1d9a0 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
1d9b0 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20  OCK)*4)         
1d9c0 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
1d9d0 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  te */.#define UN
1d9e0 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55  IX_SHM_DMS    (U
1d9f0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  NIX_SHM_BASE+SQL
1da00 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
1da10 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
1da20 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
1da30 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  y posix advisory
1da40 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62   locks for all b
1da50 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74  ytes from ofst t
1da60 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e  hrough ofst+n-1.
1da70 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
1da80 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ck if the mask i
1da90 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53  s exactly UNIX_S
1daa0 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e  HM_C and are non
1dab0 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
1dac0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1dad0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
1dae0 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53  temLock(.  unixS
1daf0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1db00 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73  , /* Apply locks
1db10 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
1db20 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1db30 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
1db40 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  kType,          
1db50 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44  /* F_UNLCK, F_RD
1db60 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20  LCK, or F_WRLCK 
1db70 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
1db80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1db90 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
1dba0 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a   locking range *
1dbb0 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20  /.  int n       
1dbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dbd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1dbe0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
1dbf0 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20  ruct flock f;   
1dc00 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78      /* The posix
1dc10 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
1dc20 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
1dc30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1dc40 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74  _OK;   /* Result
1dc50 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c   code form fcntl
1dc60 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
1dc70 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
1dc80 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1dc90 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
1dca0 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
1dcb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1dcc0 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64  tex_held(pShmNod
1dcd0 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68  e->mutex) || pSh
1dce0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
1dcf0 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c  ;..  /* Shared l
1dd00 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20  ocks never span 
1dd10 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79  more than one by
1dd20 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  te */.  assert( 
1dd30 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65  n==1 || lockType
1dd40 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20  !=F_RDLCK );..  
1dd50 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74  /* Locks are wit
1dd60 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61  hin range */.  a
1dd70 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e  ssert( n>=1 && n
1dd80 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  <SQLITE_SHM_NLOC
1dd90 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  K );..  if( pShm
1dda0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
1ddb0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1ddc0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
1ddd0 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65  meters */.    me
1dde0 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65  mset(&f, 0, size
1ddf0 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f  of(f));.    f.l_
1de00 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b  type = lockType;
1de10 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20  .    f.l_whence 
1de20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
1de30 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74  f.l_start = ofst
1de40 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20  ;.    f.l_len = 
1de50 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  n;..    rc = osF
1de60 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cntl(pShmNode->h
1de70 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a  , F_SETLK, &f);.
1de80 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d      rc = (rc!=(-
1de90 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
1dea0 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
1deb0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
1dec0 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20  the global lock 
1ded0 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62  state and do deb
1dee0 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  ug tracing */.#i
1def0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1df00 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a  G.  { u16 mask;.
1df10 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1df20 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b  LOCK "));.  mask
1df30 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   = (1<<(ofst+n))
1df40 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
1df50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1df60 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
1df70 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
1df80 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1df90 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
1dfa0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
1dfb0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
1dfc0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1dfd0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1dfe0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
1dff0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1e000 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
1e010 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1e020 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
1e030 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
1e040 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
1e050 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1e060 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1e070 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
1e080 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
1e090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
1e0a0 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
1e0b0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1e0c0 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
1e0d0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
1e0e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
1e0f0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
1e100 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e110 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1e120 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
1e130 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
1e140 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
1e150 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1e160 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
1e170 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
1e180 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
1e190 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
1e1a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
1e1b0 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
1e1c0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1e1d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
1e1e0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
1e1f0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1e200 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
1e210 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
1e220 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
1e230 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
1e240 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
1e250 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
1e260 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
1e270 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
1e280 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
1e290 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1e2a0 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f  c;        .}.../
1e2b0 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75  *.** Purge the u
1e2c0 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  nixShmNodeList l
1e2d0 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
1e2e0 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e  es with unixShmN
1e2f0 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
1e300 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
1e310 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1e320 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
1e330 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
1e340 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
1e350 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1e360 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
1e370 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
1e380 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65  hmPurge(unixFile
1e390 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68   *pFd){.  unixSh
1e3a0 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e  mNode *p = pFd->
1e3b0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
1e3c0 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
1e3d0 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
1e3e0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65   if( p && p->nRe
1e3f0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  f==0 ){.    int 
1e400 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
1e410 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70  ->pInode==pFd->p
1e420 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c  Inode );.    sql
1e430 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
1e440 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66  p->mutex);.    f
1e450 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
1e460 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
1e470 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
1e480 0a 20 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28  .        munmap(
1e490 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20  p->apRegion[i], 
1e4a0 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  p->szRegion);.  
1e4b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e4c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1e4d0 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b  p->apRegion[i]);
1e4e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e4f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1e500 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20  p->apRegion);.  
1e510 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
1e520 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
1e530 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f  ose(pFd, p->h, _
1e540 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
1e550 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  p->h = -1;.    }
1e560 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e  .    p->pInode->
1e570 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  pShmNode = 0;.  
1e580 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e590 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1e5a0 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65  Open a shared-me
1e5b0 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
1e5c0 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64  ated with open d
1e5d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
1e5e0 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61  Fd.  .** This pa
1e5f0 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65  rticular impleme
1e600 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61  ntation uses mma
1e610 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
1e620 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20  * The file used 
1e630 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61  to implement sha
1e640 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e  red-memory is in
1e650 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
1e660 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70  ory.** as the op
1e670 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1e680 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
1e690 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70  e name as the op
1e6a0 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  en database.** f
1e6b0 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73  ile with the "-s
1e6c0 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64  hm" suffix added
1e6d0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
1e6e0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1e6f0 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d  file.** is "/hom
1e700 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
1e710 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  b" then the file
1e720 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
1e730 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20   and mmapped.** 
1e740 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
1e750 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  y will be called
1e760 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
1e770 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a  nfig.db-shm".  .
1e780 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70  **.** Another ap
1e790 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20  proach to is to 
1e7a0 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65  use files in /de
1e7b0 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d  v/shm or /dev/tm
1e7c0 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20  p or an.** some 
1e7d0 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e  other tmpfs moun
1e7e0 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65  t. But if a file
1e7f0 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
1e800 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f  directory.** fro
1e810 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1e820 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  ile is used, the
1e830 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65  n differing acce
1e840 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ss permissions.*
1e850 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20  * or a chroot() 
1e860 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20  might cause two 
1e870 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
1e880 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ses on the same.
1e890 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65  ** database to e
1e8a0 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66  nd up using diff
1e8b0 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20  erent files for 
1e8c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20  shared memory - 
1e8d0 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  .** meaning that
1e8e0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f   their memory wo
1e8f0 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  uld not really b
1e900 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c  e shared - resul
1e910 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62  ting.** in datab
1e920 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
1e930 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74   Nevertheless, t
1e940 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75  his tmpfs file u
1e950 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65  sage.** can be e
1e960 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
1e970 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1e980 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1e990 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a  ORY="/dev/shm".*
1e9a0 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c  * or the equival
1e9b0 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66  ent.  The use of
1e9c0 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   the SQLITE_SHM_
1e9d0 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
1e9e0 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e  e-time.** option
1e9f0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69   results in an i
1ea00 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c  ncompatible buil
1ea10 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75  d of SQLite;  bu
1ea20 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a  ilds of SQLite.*
1ea30 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66  * that with diff
1ea40 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d  ering SQLITE_SHM
1ea50 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69  _DIRECTORY setti
1ea60 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75  ngs attempt to u
1ea70 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64  se the.** same d
1ea80 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
1ea90 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64  the same time, d
1eaa0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1eab0 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  on will likely.*
1eac0 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51  * result. The SQ
1ead0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1eae0 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  RY compile-time 
1eaf0 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64  option is consid
1eb00 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f  ered.** "unsuppo
1eb10 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f  rted" and may go
1eb20 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72   away in a futur
1eb30 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65  e SQLite release
1eb40 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
1eb50 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
1eb60 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
1eb70 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
1eb80 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
1eb90 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
1eba0 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
1ebb0 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
1ebc0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
1ebd0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
1ebe0 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
1ebf0 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
1ec00 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
1ec10 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a  ader cleared..**
1ec20 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69  .** If the origi
1ec30 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
1ec40 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69  e (pDbFd) is usi
1ec50 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63  ng the "unix-exc
1ec60 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d  l" VFS.** that m
1ec70 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63  eans that an exc
1ec80 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
1ec90 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1eca0 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  ase file and.** 
1ecb0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
1ecc0 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65  ocesses are able
1ecd0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1ece0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
1ecf0 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65   In.** that case
1ed00 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c  , we do not real
1ed10 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d  ly need shared m
1ed20 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65  emory.  No share
1ed30 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65  d memory.** file
1ed40 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
1ed50 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1ed60 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65  will be simulate
1ed70 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f  d with heap memo
1ed80 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
1ed90 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  t unixOpenShared
1eda0 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20  Memory(unixFile 
1edb0 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
1edc0 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30  t unixShm *p = 0
1edd0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
1ede0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1edf0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
1ee00 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1ee10 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f  e *pShmNode;   /
1ee20 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1ee30 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1ee40 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee60 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1ee70 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
1ee80 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
1ee90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1eea0 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63  ode of fd */.  c
1eeb0 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d  har *zShmFilenam
1eec0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1eed0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1eee0 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20  le used for SHM 
1eef0 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c  */.  int nShmFil
1ef00 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1ef10 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ef20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65  the SHM filename
1ef30 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1ef40 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1ef50 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  e for the new un
1ef60 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f  ixShm object. */
1ef70 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
1ef80 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
1ef90 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
1efa0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1efb0 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
1efc0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
1efd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1efe0 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a  Fd->pShm==0 );..
1eff0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1f000 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f  e if a unixShmNo
1f010 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64  de object alread
1f020 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20  y exists. Reuse 
1f030 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
1f040 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e   one if present.
1f050 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
1f060 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
1f070 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
1f080 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
1f090 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
1f0a0 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  e;.  pShmNode = 
1f0b0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
1f0c0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
1f0d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
1f0e0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f100 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f   fstat() info fo
1f110 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
1f120 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  */..    /* Call 
1f130 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72  fstat() to figur
1f140 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73  e out the permis
1f150 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74  sions on the dat
1f160 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20  abase file. If. 
1f170 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68     ** a new *-sh
1f180 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  m file is create
1f190 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69  d, an attempt wi
1f1a0 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72  ll be made to cr
1f1b0 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77  eate it.    ** w
1f1c0 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72  ith the same per
1f1d0 6d 69 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63  missions. The ac
1f1e0 74 75 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73  tual permissions
1f1f0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 72 65   the file is cre
1f200 61 74 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68  ated.    ** with
1f210 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
1f220 74 68 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73  the current umas
1f230 6b 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a  k setting..    *
1f240 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
1f250 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74  t(pDbFd->h, &sSt
1f260 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62  at) && pInode->b
1f270 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
1f280 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1f290 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1f2a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1f2b0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1f2c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
1f2d0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
1f2e0 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
1f2f0 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
1f300 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
1f310 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  0;.#else.    nSh
1f320 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20  mFilename = 5 + 
1f330 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46  (int)strlen(pDbF
1f340 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69  d->zPath);.#endi
1f350 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
1f360 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1f370 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
1f380 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  e) + nShmFilenam
1f390 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  e );.    if( pSh
1f3a0 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
1f3b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1f3c0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1f3d0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1f3e0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
1f3f0 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  ShmNode, 0, size
1f400 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a  of(*pShmNode));.
1f410 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
1f420 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
1f430 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
1f440 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
1f450 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
1f460 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
1f470 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
1f480 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
1f490 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1f4c0 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
1f4d0 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4f0 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
1f500 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
1f510 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
1f520 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1f530 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
1f540 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
1f550 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
1f560 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
1f570 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
1f580 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
1f590 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
1f5a0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
1f5b0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
1f5c0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
1f5d0 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
1f5e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
1f5f0 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
1f600 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  node;.    pShmNo
1f610 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
1f620 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1f630 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
1f640 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
1f650 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
1f660 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1f670 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1f680 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1f690 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
1f6a0 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
1f6b0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
1f6c0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
1f6d0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53  = robust_open(zS
1f6e0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  hmFilename, O_RD
1f6f0 57 52 7c 4f 5f 43 52 45 41 54 2c 0a 20 20 20 20  WR|O_CREAT,.    
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 20 20 20 20 20 20 20 28 73 53 74 61             (sSta
1f720 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37  t.st_mode & 0777
1f730 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ));.      if( pS
1f740 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20  hmNode->h<0 ){. 
1f750 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1f760 72 20 2a 7a 52 4f 3b 0a 20 20 20 20 20 20 20 20  r *zRO;.        
1f770 7a 52 4f 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  zRO = sqlite3_ur
1f780 69 5f 70 61 72 61 6d 65 74 65 72 28 70 44 62 46  i_parameter(pDbF
1f790 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f  d->zPath, "reado
1f7a0 6e 6c 79 5f 73 68 6d 22 29 3b 0a 20 20 20 20 20  nly_shm");.     
1f7b0 20 20 20 69 66 28 20 7a 52 4f 20 26 26 20 73 71     if( zRO && sq
1f7c0 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
1f7d0 7a 52 4f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  zRO) ){.        
1f7e0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
1f7f0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
1f800 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  Filename, O_RDON
1f810 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LY,.            
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 20 20 28 73 53 74 61 74 2e 73          (sStat.s
1f840 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29 3b  t_mode & 0777));
1f850 0a 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e  .          pShmN
1f860 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
1f870 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
1f880 20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e         if( pShmN
1f890 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
1f8a0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
1f8b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1f8c0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1f8d0 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  pen", zShmFilena
1f8e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
1f8f0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1f900 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f910 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
1f920 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1f930 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1f940 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
1f950 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
1f960 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c        ** If not,
1f970 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
1f980 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
1f990 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  h. .      */.   
1f9a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1f9b0 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  K;.      if( uni
1f9c0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1f9d0 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
1f9e0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
1f9f0 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
1fa00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62  .        if( rob
1fa10 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53  ust_ftruncate(pS
1fa20 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b  hmNode->h, 0) ){
1fa30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1fa40 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1fa50 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1fa60 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  N, "ftruncate", 
1fa70 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
1fa80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1fa90 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1faa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fab0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
1fac0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1fad0 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e  ode, F_RDLCK, UN
1fae0 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IX_SHM_DMS, 1);.
1faf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1fb00 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
1fb10 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1fb20 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
1fb30 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
1fb40 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
1fb50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
1fb60 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
1fb70 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
1fb80 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1fb90 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
1fba0 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
1fbb0 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
1fbc0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
1fbd0 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
1fbe0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1fbf0 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
1fc00 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
1fc10 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
1fc20 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
1fc30 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
1fc40 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
1fc50 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1fc60 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
1fc70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
1fc80 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
1fc90 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
1fca0 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
1fcb0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
1fcc0 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
1fcd0 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
1fce0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
1fcf0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
1fd00 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
1fd10 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
1fd20 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
1fd30 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
1fd40 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
1fd50 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1fd60 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
1fd70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1fd80 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1fd90 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
1fda0 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
1fdb0 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
1fdc0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
1fdd0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1fde0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1fdf0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1fe00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1fe10 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
1fe20 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
1fe30 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
1fe40 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
1fe50 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
1fe60 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
1fe70 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
1fe80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1fe90 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
1fea0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
1feb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1fec0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1fed0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
1fee0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
1fef0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
1ff00 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
1ff10 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
1ff20 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1ff30 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
1ff40 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1ff50 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
1ff60 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
1ff70 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
1ff80 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1ff90 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
1ffa0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
1ffb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1ffc0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1ffd0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1ffe0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
1fff0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
20000 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
20010 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61  f the bExtend pa
20020 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
20030 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
20040 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
20050 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
20060 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
20070 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
20080 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
20090 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
200a0 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
200b0 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
200c0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
200d0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
200e0 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73  f .** bExtend is
200f0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
20100 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
20110 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
20120 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
20130 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
20140 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
20150 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
20160 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
20170 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
20180 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
20190 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
201a0 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
201b0 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
201c0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
201d0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
201e0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
201f0 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
20200 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
20210 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
20220 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
20230 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
20240 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
20250 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
20260 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
20270 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61  ic int unixShmMa
20280 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
20290 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
202a0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
202b0 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
202c0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
202d0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
202e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
202f0 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
20300 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
20310 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20320 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
20330 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
20340 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20   bExtend,       
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20360 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
20370 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
20380 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
20390 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
203a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
203b0 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
203c0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
203d0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
203e0 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
203f0 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  p;.  unixShmNode
20400 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
20410 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20420 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
20430 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
20440 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
20450 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
20460 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28  it now. */.  if(
20470 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
20480 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  ){.    rc = unix
20490 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
204a0 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
204b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
204c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
204d0 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
204e0 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  hm;.  pShmNode =
204f0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20   p->pShmNode;.  
20500 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
20510 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
20520 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
20530 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
20540 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
20550 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
20560 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
20570 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
20580 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
20590 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
205a0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c  ShmNode->h>=0 ||
205b0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
205c0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20  bProcessLock==1 
205d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
205e0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44  mNode->h<0 || pD
205f0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
20600 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
20610 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
20620 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
20630 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
20640 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
20650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20660 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72  ew apRegion[] ar
20670 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
20680 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
20690 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a  1)*szRegion;  /*
206a0 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
206b0 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
206c0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
206d0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
206e0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
206f0 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20   fstat() */..   
20700 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
20710 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
20720 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
20730 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
20740 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
20750 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
20760 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
20770 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
20780 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20  ss space..      
20790 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
207a0 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
207b0 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
207c0 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
207d0 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  file is.      **
207e0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
207f0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
20800 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
20810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20820 66 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e  f( osFstat(pShmN
20830 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  ode->h, &sStat) 
20840 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20850 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
20860 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f  SIZE;.        go
20870 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
20880 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
20890 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69   if( sStat.st_si
208a0 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  ze<nByte ){.    
208b0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
208c0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
208d0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
208e0 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73  t. If bExtend is
208f0 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20   set to.        
20900 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65  ** false, exit e
20910 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
20920 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
20930 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
20940 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  rned..        **
20950 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65  .        ** Alte
20960 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45  rnatively, if bE
20970 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75  xtend is true, u
20980 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  se ftruncate() t
20990 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20  o allocate.     
209a0 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
209b0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
209c0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
209d0 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65        if( !bExte
209e0 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  nd ) goto shmpag
209f0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69  e_out;.        i
20a00 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
20a10 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
20a20 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20   nByte) ){.     
20a30 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
20a40 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20a50 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74  ERR_SHMSIZE, "ft
20a60 72 75 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20  runcate",.      
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
20a90 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
20aa0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
20ab0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
20ac0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
20ad0 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
20ae0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
20af0 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
20b00 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
20b10 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
20b20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
20b30 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
20b40 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
20b50 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
20b60 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65  (iRegion+1)*size
20b70 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29  of(char *).    )
20b80 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
20b90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
20ba0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
20bb0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
20bc0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
20bd0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
20be0 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  pRegion = apNew;
20bf0 0a 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e  .    while(pShmN
20c00 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
20c10 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f  egion){.      vo
20c20 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20  id *pMem;.      
20c30 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
20c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =0 ){.        pM
20c50 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52  em = mmap(0, szR
20c60 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  egion,.         
20c70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52     pShmNode->isR
20c80 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52  eadonly ? PROT_R
20c90 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c  EAD : PROT_READ|
20ca0 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20  PROT_WRITE, .   
20cb0 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41           MAP_SHA
20cc0 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  RED, pShmNode->h
20cd0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
20ce0 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20  ion*szRegion.   
20cf0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
20d00 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41  if( pMem==MAP_FA
20d10 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
20d20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
20d30 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
20d40 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c  _SHMMAP, "mmap",
20d50 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
20d60 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
20d70 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
20d80 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
20d90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20da0 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33    pMem = sqlite3
20db0 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e  _malloc(szRegion
20dc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
20dd0 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
20de0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20df0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
20e00 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
20e10 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
20e20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
20e30 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
20e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
20e50 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
20e60 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
20e70 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20  on] = pMem;.    
20e80 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
20e90 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ion++;.    }.  }
20ea0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
20eb0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
20ec0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
20ed0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
20ee0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
20ef0 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
20f00 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
20f10 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
20f20 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
20f30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20f40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
20f50 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
20f60 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
20f70 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
20f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20f90 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
20fa0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
20fb0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
20fc0 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
20fd0 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
20fe0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
20ff0 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
21000 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
21010 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
21020 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
21030 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
21040 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
21050 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
21060 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
21070 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
21080 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
21090 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
210a0 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
210b0 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
210c0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
210d0 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
210e0 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
210f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
21100 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
21110 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
21120 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
21130 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
21140 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
21150 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
21180 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
21190 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
211c0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
211d0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
211e0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21200 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
21210 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
21220 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
21230 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
21240 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
21250 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
21260 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
21270 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
21280 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
21290 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
212a0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
212b0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
212c0 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
212f0 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
21300 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
21310 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
21320 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
21330 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
21340 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
21350 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21360 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
21370 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
21380 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
21390 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
213c0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
213d0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
213e0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
213f0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
21400 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
21410 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
21420 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
21430 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
21440 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
21450 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
21460 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
21470 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
21480 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
21490 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
214a0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
214b0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
214c0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
214d0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
214e0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
214f0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
21500 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
21510 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
21520 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
21530 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
21540 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
21550 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
21560 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
21570 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
21580 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
21590 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
215a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
215b0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
215c0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
215d0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
215e0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
215f0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
21600 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
21610 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
21620 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
21630 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
21640 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
21650 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
21660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
21670 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
21680 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
21690 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
216a0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
216b0 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
216c0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
216d0 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
216e0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
216f0 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
21700 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
21710 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
21720 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
21730 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
21740 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
21750 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
21760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
21770 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
21780 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
21790 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
217a0 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
217b0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
217c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
217d0 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
217e0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
217f0 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
21800 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
21810 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
21820 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
21830 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20  mNode, F_UNLCK, 
21840 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
21850 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
21860 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
21870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
21880 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
21890 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
218a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
218b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
218c0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
218d0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
218e0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
218f0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
21900 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
21910 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
21920 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
21930 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
21940 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
21950 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
21960 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
21970 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
21980 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
21990 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
219a0 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
219b0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
219c0 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
219d0 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
219e0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
219f0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
21a00 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
21a10 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
21a20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
21a30 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
21a40 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
21a50 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
21a60 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
21a70 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
21a80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
21a90 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
21aa0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
21ab0 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
21ac0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
21ad0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
21ae0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
21af0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
21b00 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
21b10 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
21b20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21b30 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
21b40 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
21b50 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
21b60 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
21b70 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
21b80 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
21b90 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
21ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
21bb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21bc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21bd0 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
21be0 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
21bf0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
21c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21c10 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
21c20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
21c30 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
21c40 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
21c50 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
21c60 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
21c70 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
21c80 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
21c90 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
21ca0 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
21cb0 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
21cc0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
21cd0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
21ce0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
21cf0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
21d00 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
21d10 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
21d20 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
21d30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
21d40 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
21d50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21d60 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
21d70 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
21d80 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
21d90 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
21da0 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
21db0 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
21dc0 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
21dd0 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
21de0 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
21df0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
21e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21e10 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
21e20 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
21e30 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  , F_WRLCK, ofst+
21e40 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
21e50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21e70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
21e80 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
21e90 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
21ea0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
21eb0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
21ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
21ed0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
21ee0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
21ef0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
21f00 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
21f10 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78   pid-%d got %03x
21f20 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
21f30 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70       p->id, getp
21f40 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  id(), p->sharedM
21f50 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
21f60 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
21f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
21f80 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
21f90 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
21fa0 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
21fb0 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
21fc0 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
21fd0 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
21fe0 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
21ff0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
22000 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
22010 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
22020 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
22030 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
22040 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20  nixShmBarrier(. 
22050 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
22060 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
22070 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
22080 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
22090 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
220a0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
220b0 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78  ETER(fd);.  unix
220c0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
220d0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
220e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
220f0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
22100 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
22110 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
22120 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
22130 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
22140 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
22150 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
22160 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
22170 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22180 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e   connection then
22190 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
221a0 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
221b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
221c0 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  int unixShmUnmap
221d0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
221e0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
221f0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
22200 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
22210 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ile */.  int del
22220 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
22230 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
22240 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  te shared-memory
22250 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
22260 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20   unixShm *p;    
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
22290 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
222a0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
222b0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
222c0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
222d0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
222e0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
222f0 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  nixShm **pp;    
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22310 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
22320 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
22330 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78  ctions */.  unix
22340 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
22350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22360 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
22370 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
22380 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46    pDbFd = (unixF
22390 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
223a0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
223b0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
223c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
223d0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
223e0 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ode;..  assert( 
223f0 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
22400 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
22410 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
22420 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
22430 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
22440 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
22450 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
22460 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
22470 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
22480 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
22490 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
224a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
224b0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
224c0 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
224d0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
224e0 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
224f0 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
22500 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
22510 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
22520 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
22530 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
22540 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
22550 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
22560 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
22570 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
22580 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
22590 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
225a0 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
225b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
225c0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
225d0 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75  file, too */.  u
225e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
225f0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
22600 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
22610 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
22620 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
22630 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
22640 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
22650 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e   && pShmNode->h>
22660 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28 70 53  =0 ) osUnlink(pS
22670 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
22680 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50  e);.    unixShmP
22690 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d  urge(pDbFd);.  }
226a0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
226b0 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
226c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65  QLITE_OK;.}...#e
226d0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
226e0 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  xShmMap     0.# 
226f0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f  define unixShmLo
22700 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
22710 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20   unixShmBarrier 
22720 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
22730 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
22740 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
22750 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
22760 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
22770 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
22780 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
22790 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
227a0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
227b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
227c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
227d0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
227e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227f0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
22800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22840 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
22850 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
22860 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
22870 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
22880 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
22890 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
228a0 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
228b0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
228c0 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
228d0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
228e0 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
228f0 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
22900 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
22910 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
22920 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
22930 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
22940 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
22950 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
22960 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
22970 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
22980 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
22990 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
229a0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
229b0 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
229c0 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
229d0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
229e0 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
229f0 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
22a00 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
22a10 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
22a20 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
22a30 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
22a40 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
22a50 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
22a60 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
22a70 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
22a80 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
22a90 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
22aa0 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
22ab0 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
22ac0 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
22ad0 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
22ae0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
22af0 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
22b00 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
22b10 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
22b20 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
22b30 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
22b40 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
22b50 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
22b60 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
22b70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
22b80 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
22b90 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
22ba0 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
22bb0 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
22bc0 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
22bd0 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
22be0 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
22bf0 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
22c00 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
22c10 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
22c20 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
22c30 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
22c40 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
22c50 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
22c60 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
22c70 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
22c80 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
22c90 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
22ca0 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
22cb0 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
22cc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
22cd0 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
22ce0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
22cf0 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
22d00 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
22d10 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
22d20 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
22d30 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
22d40 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
22d50 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
22d60 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
22d70 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
22d80 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
22d90 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
22da0 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
22db0 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
22dc0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
22dd0 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
22de0 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
22df0 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
22e00 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20  OCK, CKLOCK)    
22e10 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
22e20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22e30 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20   \.   VERSION,  
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22f00 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22f50 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f70 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
22fa0 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22fc0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
22ff0 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23010 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23030 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23040 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
23050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23060 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
23090 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
230a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
230b0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
230e0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
230f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23100 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23120 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
23130 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
23140 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
23150 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
23160 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23170 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
23180 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
23190 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
231a0 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231c0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
231d0 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
231e0 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
231f0 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23210 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
23220 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
23230 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
23240 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23260 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
23270 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
23280 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
23290 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c     \.   unixShmL
232c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
232d0 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
232e0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23300 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61    \.   unixShmBa
23310 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
23320 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
23330 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d   \.   unixShmUnm
23360 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
23370 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
23380 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233a0 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
233f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
23400 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23410 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
23420 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
23430 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
23440 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
23450 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
23460 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23490 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23520 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
23530 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
23540 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
23550 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
23560 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
23570 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
23580 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
23590 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
235a0 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
235b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
235c0 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
235d0 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
235e0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
235f0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
23600 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
23610 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
23620 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
23630 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
23640 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
23650 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
23660 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
23670 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
23680 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
23690 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
236a0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
236b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20   name */.  2,   
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
236e0 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64  emory is enabled
236f0 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
23720 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
23750 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23770 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
23780 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
23790 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
237a0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
237b0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
237c0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
237d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
237e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
237f0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
23800 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
23810 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
23820 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
23830 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
23840 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
23850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23860 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
23870 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
23880 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
238a0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
238b0 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
238d0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
238e0 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
238f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23900 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
23910 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
23920 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20  servedLock   /* 
23930 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23940 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
23950 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
23960 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
23970 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
23980 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
23990 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
239a0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
239b0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
239c0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
239d0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
239f0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
23a00 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
23a10 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
23a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
23a30 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
23a40 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
23a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
23a60 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
23a70 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
23a80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
23a90 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23aa0 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
23ab0 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68  rvedLock  /* xCh
23ac0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
23ad0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
23ae0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23af0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
23b00 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45  !OS_VXWORKS.IOME
23b10 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
23b20 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
23b30 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
23b40 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
23b50 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
23b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
23b70 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23b80 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
23b90 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
23ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
23bb0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
23bc0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
23bd0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
23be0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
23bf0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
23c00 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
23c10 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
23c20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
23c30 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
23c40 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
23c50 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
23c60 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
23c70 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
23c80 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
23c90 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
23ca0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
23cb0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
23cc0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
23cd0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
23ce0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
23cf0 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
23d00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
23d10 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23d20 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
23d30 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d50 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
23d60 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
23d70 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20   semClose,      
23d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
23d90 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
23da0 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20   semLock,       
23db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
23dc0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
23dd0 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  semUnlock,      
23de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23df0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
23e00 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
23e10 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
23e20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23e30 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
23e40 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
23e50 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
23e60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
23e70 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
23e80 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
23e90 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
23ea0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
23eb0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
23ec0 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
23ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
23ee0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
23ef0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
23f00 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
23f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
23f20 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
23f30 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43  sabled */.  afpC
23f40 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
23f50 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
23f60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
23f70 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23f80 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
23f90 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
23fa0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
23fb0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
23fc0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
23fd0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23fe0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
23ff0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
24000 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
24010 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
24020 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
24030 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
24040 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
24050 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
24060 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
24070 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
24080 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
24090 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
240a0 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
240b0 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
240c0 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
240d0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
240e0 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
240f0 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
24100 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
24110 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
24120 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
24130 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
24140 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
24150 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
24160 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
24170 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
24180 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
24190 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
241a0 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
241b0 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
241c0 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
241d0 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
241e0 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
241f0 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
24200 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
24210 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
24220 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
24230 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
24240 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
24250 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
24260 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
24270 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
24280 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
24290 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
242a0 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
242b0 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
242c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
242d0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
242e0 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
242f0 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
24300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
24310 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
24320 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
24330 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
24340 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
24350 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
24360 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24380 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
24390 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
243a0 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
243c0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
243d0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
243f0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
24400 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24420 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
24430 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
24440 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
24450 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
24460 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
24470 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c  #endif../* nfs l
24480 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33  ockd on OSX 10.3
24490 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20  + doesn't clear 
244a0 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e  write locks when
244b0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
244c0 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  set */.#if defin
244d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
244e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
244f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
24500 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46  ETHODS(.  nfsIoF
24510 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
24520 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
24530 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
24540 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20    nfsIoMethods, 
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24560 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24570 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
24580 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245a0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
245b0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
245c0 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
245d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
245e0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
245f0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24610 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
24620 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20    nfsUnlock,    
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24640 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
24650 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
24660 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
24670 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
24680 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
24690 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
246a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
246b0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
246c0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
246d0 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
246e0 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
246f0 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
24700 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
24710 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
24720 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
24730 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
24740 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
24750 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
24760 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
24770 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
24780 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
24790 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
247a0 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c  s for MacOSX onl
247b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
247c0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
247d0 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
247e0 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
247f0 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
24800 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
24810 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24820 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
24830 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
24840 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20     /* open file 
24850 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64  object for the d
24860 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
24870 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
24880 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67  t struct Mapping
24890 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
248a0 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  r *zFilesystem; 
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248c0 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  Filesystem type 
248d0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  name */.    cons
248e0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
248f0 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20  hods *pMethods; 
24900 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65    /* Appropriate
24910 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
24920 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20  */.  } aMap[] = 
24930 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20  {.    { "hfs",  
24940 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
24950 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  s },.    { "ufs"
24960 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
24970 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61  hods },.    { "a
24980 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  fpfs",  &afpIoMe
24990 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
249a0 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  smbfs",  &afpIoM
249b0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
249c0 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63  "webdav", &noloc
249d0 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  kIoMethods },.  
249e0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
249f0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
24a00 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
24a10 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
24a20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
24a30 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
24a40 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
24a50 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
24a60 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
24a70 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
24a80 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
24a90 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
24aa0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
24ab0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
24ac0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
24ad0 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28   }.  if( statfs(
24ae0 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66  filePath, &fsInf
24af0 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) != -1 ){.    
24b00 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
24b10 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20  gs & MNT_RDONLY 
24b20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
24b30 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
24b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
24b50 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  i=0; aMap[i].zFi
24b60 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a  lesystem; i++){.
24b70 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
24b80 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
24b90 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46  name, aMap[i].zF
24ba0 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b  ilesystem)==0 ){
24bb0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24bc0 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73  aMap[i].pMethods
24bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24be0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c    }..  /* Defaul
24bf0 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c  t case. Handles,
24c00 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c   amongst others,
24c10 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73   "nfs"..  ** Tes
24c20 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
24c30 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
24c40 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
24c50 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
24c60 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
24c70 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
24c80 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
24c90 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
24ca0 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
24cb0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
24cc0 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
24cd0 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
24ce0 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
24cf0 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
24d00 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
24d10 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
24d20 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
24d30 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28  !=-1 ) {.    if(
24d40 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
24d50 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66  _fstypename, "nf
24d60 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
24d70 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74  return &nfsIoMet
24d80 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65  hods;.    } else
24d90 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
24da0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
24db0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
24dc0 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c      return &dotl
24dd0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
24de0 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
24df0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24e00 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
24e10 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
24e20 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
24e30 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
24e40 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
24e50 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
24e60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
24e70 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
24e80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
24e90 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
24ea0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
24eb0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
24ec0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
24ed0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
24ee0 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
24ef0 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
24f00 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
24f10 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
24f20 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
24f30 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
24f40 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
24f50 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
24f60 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
24f70 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
24f80 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
24f90 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f  is for VXWorks o
24fa0 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
24fb0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
24fc0 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
24fd0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
24fe0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
24ff0 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
25000 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
25010 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
25020 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
25030 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e       /* the open
25040 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   file object */.
25050 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
25060 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
25070 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
25080 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
25090 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
250a0 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
250b0 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
250c0 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
250d0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
250e0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
250f0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
25100 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
25110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
25120 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75  if fcntl() is su
25130 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20  pported and use 
25140 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
25150 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  s..  ** Otherwis
25160 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  e fall back to t
25170 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
25180 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a  re method..  */.
25190 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
251a0 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
251b0 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
251c0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
251d0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
251e0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
251f0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
25200 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
25210 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
25220 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
25230 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
25240 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
25250 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73  e{.    return &s
25260 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  emIoMethods;.  }
25270 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
25280 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
25290 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
252a0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
252b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
252c0 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
252d0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
252e0 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
252f0 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f  WORKS && SQLITE_
25300 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
25310 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  TYLE */../*.** A
25320 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20  n abstract type 
25330 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  for a pointer to
25340 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e   a IO method fin
25350 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
25360 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
25370 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
25380 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
25390 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
253a0 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a  ixFile*);.../***
253b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
25400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25410 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
25420 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
25430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25440 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
25450 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
25460 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
25470 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
25480 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
25490 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
254a0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
254b0 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
254c0 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
254d0 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
254e0 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
254f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
25500 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
25510 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
25520 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
25530 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
25540 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25560 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
25570 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
25580 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
25590 69 6e 74 20 73 79 6e 63 44 69 72 2c 20 20 20 20  int syncDir,    
255a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
255b0 74 6f 20 73 79 6e 63 20 64 69 72 65 63 74 6f 72  to sync director
255c0 79 20 6f 6e 20 66 69 72 73 74 20 73 79 6e 63 20  y on first sync 
255d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
255e0 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20  e *pId,      /* 
255f0 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69  Write to the uni
25600 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
25610 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
25620 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
25630 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
25640 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
25650 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  ed */.  int noLo
25660 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
25670 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  /* Omit locking 
25680 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  if true */.  int
25690 20 69 73 44 65 6c 65 74 65 2c 20 20 20 20 20 20   isDelete,      
256a0 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f       /* Delete o
256b0 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20  n close if true 
256c0 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 61 64 4f  */.  int isReadO
256d0 6e 6c 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nly          /* 
256e0 54 72 75 65 20 69 66 20 74 68 65 20 66 69 6c 65  True if the file
256f0 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
25700 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  only */.){.  con
25710 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
25720 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53  thods *pLockingS
25730 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65  tyle;.  unixFile
25740 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
25750 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
25760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25770 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
25780 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b  >pInode==NULL );
25790 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72  ..  /* Parameter
257a0 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c   isDelete is onl
257b0 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b  y used on vxwork
257c0 73 2e 20 45 78 70 72 65 73 73 20 74 68 69 73 20  s. Express this 
257d0 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a  explicitly .  **
257e0 20 68 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74   here to prevent
257f0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
25800 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20  gs about unused 
25810 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
25820 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25830 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a  TER(isDelete);..
25840 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65    /* Usually the
25850 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20   path zFilename 
25860 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
25870 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
25880 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65  e. The.  ** exce
25890 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70  ption is when op
258a0 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20  ening the proxy 
258b0 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20  "conch" file in 
258c0 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a  builds that.  **
258d0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65   include the spe
258e0 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69  cial Apple locki
258f0 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a  ng styles..  */.
25900 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
25910 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
25920 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
25930 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20  STYLE.  assert( 
25940 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
25950 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
25960 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e  ' .    || pVfs->
25970 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a  pAppData==(void*
25980 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
25990 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73  er );.#else.  as
259a0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
259b0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
259c0 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69  0]=='/' );.#endi
259d0 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  f..  OSTRACE(("O
259e0 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
259f0 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
25a00 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  );.  pNew->h = h
25a10 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20  ;.  pNew->zPath 
25a20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69  = zFilename;.  i
25a30 66 28 20 6d 65 6d 63 6d 70 28 70 56 66 73 2d 3e  f( memcmp(pVfs->
25a40 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c  zName,"unix-excl
25a50 22 2c 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",10)==0 ){.    
25a60 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
25a70 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b  = UNIXFILE_EXCL;
25a80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
25a90 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
25aa0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 52  0;.  }.  if( isR
25ab0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 70  eadOnly ){.    p
25ac0 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
25ad0 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  = UNIXFILE_RDONL
25ae0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 79 6e  Y;.  }.  if( syn
25af0 63 44 69 72 20 29 7b 0a 20 20 20 20 70 4e 65 77  cDir ){.    pNew
25b00 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
25b10 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
25b20 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
25b30 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
25b40 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
25b50 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
25b60 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
25b70 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63  ==0 ){.    noLoc
25b80 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
25b90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25ba0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
25bb0 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  noLock ){.    pL
25bc0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e  ockingStyle = &n
25bd0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
25be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
25bf0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a  ckingStyle = (**
25c00 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56  (finder_type*)pV
25c10 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46  fs->pAppData)(zF
25c20 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a  ilename, pNew);.
25c30 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
25c40 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
25c50 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69      /* Cache zFi
25c60 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f  lename in the lo
25c70 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41  cking context (A
25c80 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f  FP and dotlock o
25c90 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20  verride) for.   
25ca0 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63   ** proxyLock ac
25cb0 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73  tivation is poss
25cc0 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f  ible (remote pro
25cd0 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64  xy is based on d
25ce0 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a  b name).    ** z
25cf0 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73  Filename remains
25d00 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c   valid until fil
25d10 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20  e is closed, to 
25d20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70  support */.    p
25d30 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
25d40 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69  ext = (void*)zFi
25d50 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  lename;.#endif. 
25d60 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69   }..  if( pLocki
25d70 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69  ngStyle == &posi
25d80 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64  xIoMethods.#if d
25d90 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
25da0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
25db0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
25dc0 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67  .    || pLocking
25dd0 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d  Style == &nfsIoM
25de0 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20  ethods.#endif.  
25df0 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
25e00 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
25e10 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
25e20 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
25e30 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
25e40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25e50 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72       /* If an er
25e60 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66  ror occured in f
25e70 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
25e80 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
25e90 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
25ea0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
25eb0 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
25ec0 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
25ed0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
25ee0 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
25ef0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
25f00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
25f10 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
25f20 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
25f30 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
25f40 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
25f50 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
25f60 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
25f70 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
25f80 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
25f90 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
25fa0 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
25fb0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
25fc0 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
25fd0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
25fe0 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
25ff0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
26000 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
26010 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
26020 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
26030 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
26040 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
26050 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
26060 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
26070 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
26080 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
26090 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
260a0 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
260b0 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
260c0 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
260d0 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
260e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
260f0 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
26100 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
26110 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
26120 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
26130 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
26140 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
26150 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
26160 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
26170 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
26180 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
26190 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
261a0 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
261b0 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
261c0 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
261d0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
261e0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
261f0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d  NE__);.      h =
26200 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
26210 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
26220 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
26230 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
26240 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
26250 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
26260 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
26270 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
26280 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
26290 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
262a0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
262b0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
262c0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
262d0 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
262e0 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
262f0 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
26300 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
26310 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
26320 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
26330 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
26340 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
26350 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d  ;.    if( pCtx==
26360 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
26370 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
26390 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20  * NB: zFilename 
263a0 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69  exists and remai
263b0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ns valid until t
263c0 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  he file is close
263d0 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72  d.      ** accor
263e0 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d  ding to requirem
263f0 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20  ent F11141.  So 
26400 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
26410 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a  o make a.      *
26420 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  * copy of the fi
26430 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  lename. */.     
26440 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
26450 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
26460 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20   pCtx->reserved 
26470 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64  = 0;.      srand
26480 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75  omdev();.      u
26490 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
264a0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
264b0 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
264c0 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
264d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
264e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
264f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26500 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
26510 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72  text);.        r
26520 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
26530 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
26540 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
26550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
26560 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
26570 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
26580 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
26590 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
265a0 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
265b0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
265c0 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
265d0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
265e0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
265f0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
26600 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
26610 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
26620 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
26630 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
26640 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
26650 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d  me;.    nFilenam
26660 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
26670 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
26680 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
26690 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
266a0 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
266b0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
266c0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
266d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
266e0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
266f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
26700 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
26710 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
26720 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
26730 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
26740 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
26750 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
26760 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
26770 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
26780 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
26790 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
267a0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
267b0 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
267c0 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
267d0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
267e0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
267f0 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
26800 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
26810 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
26820 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
26830 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
26840 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
26850 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
26860 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
26870 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
26880 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
26890 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
268a0 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
268b0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
268c0 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
268d0 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
268e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
268f0 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
26900 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26920 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
26930 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
26940 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
26950 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
26960 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
26970 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
26980 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
26990 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
269a0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
269b0 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
269c0 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
269d0 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
269e0 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
269f0 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
26a00 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
26a10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
26a20 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
26a30 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
26a40 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
26a50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
26a60 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
26a70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
26a80 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  pNew->lastErrno 
26a90 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  = 0;.#if OS_VXWO
26aa0 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
26ab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
26ac0 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
26ad0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
26ae0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68  __LINE__);.    h
26af0 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c   = -1;.    osUnl
26b00 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
26b10 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30      isDelete = 0
26b20 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73  ;.  }.  pNew->is
26b30 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c 65 74  Delete = isDelet
26b40 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
26b50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26b60 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
26b70 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
26b80 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
26b90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
26ba0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
26bb0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
26bc0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
26bd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26be0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
26bf0 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
26c00 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68   directory in wh
26c10 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f  ich to put tempo
26c20 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49  rary files..** I
26c30 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65  f no suitable te
26c40 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72  mporary file dir
26c50 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f  ectory can be fo
26c60 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  und, return NULL
26c70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
26c80 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70  t char *unixTemp
26c90 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20  FileDir(void){. 
26ca0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
26cb0 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
26cc0 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c  .     0,.     0,
26cd0 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22  .     "/var/tmp"
26ce0 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70  ,.     "/usr/tmp
26cf0 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  ",.     "/tmp",.
26d00 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
26d10 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
26d20 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67   */.  };.  unsig
26d30 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ned int i;.  str
26d40 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
26d50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
26d60 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b   = 0;..  azDirs[
26d70 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  0] = sqlite3_tem
26d80 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69  p_directory;.  i
26d90 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20  f( !azDirs[1] ) 
26da0 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
26db0 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
26dc0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
26dd0 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
26de0 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69  (azDirs[0]); zDi
26df0 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a  r=azDirs[i++]){.
26e00 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20      if( zDir==0 
26e10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26e20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c  if( osStat(zDir,
26e30 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
26e40 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
26e50 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
26e60 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26e70 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44   if( osAccess(zD
26e80 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e  ir, 07) ) contin
26e90 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ue;.    break;. 
26ea0 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72   }.  return zDir
26eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
26ec0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
26ed0 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
26ee0 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61    zBuf must be a
26ef0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
26f00 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
26f10 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62  ss and must be b
26f20 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
26f30 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56  d at least.** pV
26f40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62  fs->mxPathname b
26f50 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
26f60 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
26f70 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
26f80 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
26f90 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
26fa0 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ed char zChars[]
26fb0 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
26fc0 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
26fd0 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
26fe0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
26ff0 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
27000 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65  6789";.  unsigne
27010 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f  d int i, j;.  co
27020 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a  nst char *zDir;.
27030 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
27040 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
27050 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
27060 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
27070 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
27080 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
27090 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
270a0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
270b0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
270c0 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
270d0 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
270e0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
270f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27100 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e   );..  zDir = un
27110 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b  ixTempFileDir();
27120 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29  .  if( zDir==0 )
27130 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20   zDir = ".";..  
27140 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
27150 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
27160 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
27170 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
27180 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d  y file .  ** nam
27190 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  e. If it is not,
271a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
271b0 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  RROR..  */.  if(
271c0 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b   (strlen(zDir) +
271d0 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54   strlen(SQLITE_T
271e0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
271f0 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f   + 17) >= (size_
27200 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65  t)nBuf ){.    re
27210 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
27220 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20  R;.  }..  do{.  
27230 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27240 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66  tf(nBuf-17, zBuf
27250 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45  , "%s/"SQLITE_TE
27260 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
27270 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28  zDir);.    j = (
27280 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29  int)strlen(zBuf)
27290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
272a0 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
272b0 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  uf[j]);.    for(
272c0 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
272d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  j++){.      zBuf
272e0 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
272f0 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
27300 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
27310 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
27320 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  ];.    }.    zBu
27330 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69  f[j] = 0;.  }whi
27340 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75  le( osAccess(zBu
27350 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  f,0)==0 );.  ret
27360 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27370 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
27380 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
27390 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
273a0 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f  PPLE__)./*.** Ro
273b0 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f  utine to transfo
273c0 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e  rm a unixFile in
273d0 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  to a proxy-locki
273e0 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20  ng unixFile..** 
273f0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  Implementation i
27400 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b  n the proxy-lock
27410 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75   division, but u
27420 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  sed by unixOpen(
27430 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50  ).** if SQLITE_P
27440 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
27450 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  ING is defined..
27460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
27470 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
27480 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20  File(unixFile*, 
27490 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65  const char*);.#e
274a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  ndif../*.** Sear
274b0 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
274c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
274d0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64   that was opened
274e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
274f0 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61   .** file (not a
27500 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74   journal or mast
27510 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er-journal file)
27520 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
27530 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68  athname.** zPath
27540 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45   with SQLITE_OPE
27550 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63  N_XXX flags matc
27560 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65  hing those passe
27570 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  d as the second.
27580 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ** argument to t
27590 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
275a0 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20  .** Such a file 
275b0 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65  descriptor may e
275c0 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61  xist if a databa
275d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  se connection wa
275e0 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20  s closed.** but 
275f0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
27600 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63  ile descriptor c
27610 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73  ould not be clos
27620 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a  ed because some.
27630 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ** other file de
27640 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
27650 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69   the same file i
27660 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65  s holding a file
27670 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20  -lock..** Refer 
27680 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  to comments in t
27690 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66  he unixClose() f
276a0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  unction and the 
276b0 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a  lengthy comment.
276c0 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50  ** describing "P
276d0 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
276e0 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74  cking" at the st
276f0 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65  art of this file
27700 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72   for .** further
27710 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20   details. Also, 
27720 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a  ticket #4018..**
27730 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c  .** If a suitabl
27740 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
27750 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  r is found, then
27760 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
27770 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66   If no.** such f
27780 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
27790 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73  s located, -1 is
277a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
277b0 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46  atic UnixUnusedF
277c0 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46  d *findReusableF
277d0 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  d(const char *zP
277e0 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ath, int flags){
277f0 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
27800 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20  *pUnused = 0;.. 
27810 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63   /* Do not searc
27820 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
27830 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
27840 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20  on vxworks. Not 
27850 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77  because.  ** vxw
27860 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62  orks would not b
27870 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20  enefit from the 
27880 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74  change (it might
27890 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65  , we're not sure
278a0 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61  ),.  ** but beca
278b0 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65  use no way to te
278c0 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  st it is current
278d0 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74  ly available. It
278e0 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a   is better .  **
278f0 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65   not to risk bre
27900 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75  aking vxworks su
27910 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61  pport for the sa
27920 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62  ke of such an ob
27930 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74  scure .  ** feat
27940 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53  ure.  */.#if !OS
27950 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
27960 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74  /* Results of st
27990 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  at() call */..  
279a0 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c  /* A stat() call
279b0 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61   may fail for va
279c0 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49  rious reasons. I
279d0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
279e0 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73  it is.  ** almos
279f0 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61  t certain that a
27a00 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e  n open() call on
27a10 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77   the same path w
27a20 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20  ill also fail.. 
27a30 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61   ** For this rea
27a40 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  son, if an error
27a50 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73   occurs in the s
27a60 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c  tat() call here,
27a70 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f   it is.  ** igno
27a80 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65  red and -1 is re
27a90 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
27aa0 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f  er will try to o
27ab0 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20  pen a new file. 
27ac0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f   ** descriptor o
27ad0 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c  n the same path,
27ae0 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72   fail, and retur
27af0 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51  n an error to SQ
27b00 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Lite..  **.  ** 
27b10 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71  Even if a subseq
27b20 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c  uent open() call
27b30 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74   does succeed, t
27b40 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20  he consequences 
27b50 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72  of.  ** not sear
27b60 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75  ching for a resu
27b70 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  sable file descr
27b80 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69  iptor are not di
27b90 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  re.  */.  if( 0=
27ba0 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26  =osStat(zPath, &
27bb0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e  sStat) ){.    un
27bc0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
27bd0 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e  ode;..    unixEn
27be0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
27bf0 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
27c00 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  st;.    while( p
27c10 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65  Inode && (pInode
27c20 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53  ->fileId.dev!=sS
27c30 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20  tat.st_dev.     
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c50 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  || pInode->fileI
27c60 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f  d.ino!=sStat.st_
27c70 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70  ino) ){.       p
27c80 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
27c90 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
27ca0 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20   if( pInode ){. 
27cb0 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46       UnixUnusedF
27cc0 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f  d **pp;.      fo
27cd0 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55  r(pp=&pInode->pU
27ce0 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a  nused; *pp && (*
27cf0 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67  pp)->flags!=flag
27d00 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  s; pp=&((*pp)->p
27d10 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55  Next));.      pU
27d20 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20  nused = *pp;.   
27d30 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
27d40 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
27d50 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a  pUnused->pNext;.
27d60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27d70 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
27d80 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20  ();.  }.#endif  
27d90 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f    /* if !OS_VXWO
27da0 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  RKS */.  return 
27db0 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  pUnused;.}../*.*
27dc0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27dd0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69  is called by uni
27de0 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72  xOpen() to deter
27df0 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65  mine the unix pe
27e00 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20  rmissions.** to 
27e10 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73  create new files
27e20 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72   with. If no err
27e30 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
27e40 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
27e50 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76  urned.** and a v
27e60 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f  alue suitable fo
27e70 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65  r passing as the
27e80 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
27e90 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a  to open(2) is.**
27ea0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f   written to *pMo
27eb0 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  de. If an IO err
27ec0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
27ed0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
27ee0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
27ef0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
27f00 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d   *pMode is not m
27f10 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  odified..**.** I
27f20 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
27f30 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74 65 6d   opened is a tem
27f40 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69 74 20  porary file, it 
27f50 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74 65  is always create
27f60 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f 63  d with.** the oc
27f70 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  tal permissions 
27f80 30 36 30 30 20 28 72 65 61 64 2f 77 72 69 74 61  0600 (read/writa
27f90 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e 6c  ble by owner onl
27fa0 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a  y). If the file.
27fb0 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61 73 65  ** is a database
27fc0 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   or master journ
27fd0 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73 20 63  al file, it is c
27fe0 72 65 61 74 65 64 20 77 69 74 68 20 74 68 65 20  reated with the 
27ff0 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20  permissions .** 
28000 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45 46 41  mask SQLITE_DEFA
28010 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
28020 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61  IONS..**.** Fina
28030 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69 6c 65  lly, if the file
28040 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
28050 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61   a WAL or regula
28060 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
28070 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  then .** this fu
28080 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74  nction queries t
28090 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
280a0 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  or the permissio
280b0 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  ns on the .** co
280c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
280d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
280e0 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69  ts *pMode to thi
280f0 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65  s value. Wheneve
28100 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  r .** possible, 
28110 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  WAL and journal 
28120 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
28130 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
28140 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
28150 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   as the associat
28160 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
28170 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
28180 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
28190 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73  _NAMES option is
281a0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
281b0 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66  he.** original f
281c0 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61  ilename is unava
281d0 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33  ilable.  But 8_3
281e0 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75  _NAMES is only u
281f0 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66  sed for.** FAT f
28200 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70  ilesystems and p
28210 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f  ermissions do no
28220 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20  t matter there, 
28230 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74  so just use.** t
28240 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69  he default permi
28250 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssions..*/.stati
28260 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65  c int findCreate
28270 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
28280 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
28290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
282a0 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73  ath of file (pos
282b0 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65  sibly) being cre
282c0 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ated */.  int fl
282d0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
282e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
282f0 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68  gs passed as 4th
28300 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70   argument to xOp
28310 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  en() */.  mode_t
28320 20 2a 70 4d 6f 64 65 20 20 20 20 20 20 20 20 20   *pMode         
28330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
28340 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  : Permissions to
28350 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20   open file with 
28360 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
28370 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
28380 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28390 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f  n Code */.  *pMo
283a0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
283b0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
283c0 49 4f 4e 53 3b 0a 20 20 69 66 28 20 66 6c 61 67  IONS;.  if( flag
283d0 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
283e0 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
283f0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29  _MAIN_JOURNAL) )
28400 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d  {.    char zDb[M
28410 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20  AX_PATHNAME+1]; 
28420 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
28430 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
28440 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20   int nDb;       
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28460 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
28470 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a  d bytes in zDb *
28480 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
28490 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
284a0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66      /* Output of
284b0 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62   stat() on datab
284c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
284d0 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70   /* zPath is a p
284e0 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20  ath to a WAL or 
284f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
28500 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
28510 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a  k derives.    **
28520 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
28530 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
28540 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a  base file from z
28550 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b  Path. This block
28560 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20   handles.    ** 
28570 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61  the following na
28580 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ming conventions
28590 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
285a0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
285b0 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20  journal".    ** 
285c0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
285d0 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  wal".    **   "<
285e0 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
285f0 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20  nalNN".    **   
28600 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
28610 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lNN".    **.    
28620 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61  ** where NN is a
28630 20 34 20 64 69 67 69 74 20 64 65 63 69 6d 61 6c   4 digit decimal
28640 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20   number. The NN 
28650 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61  naming schemes a
28660 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  re .    ** used 
28670 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74  by the test_mult
28680 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a  iplex.c module..
28690 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d      */.    nDb =
286a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
286b0 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20 20  (zPath) - 1; .  
286c0 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26    while( nDb>0 &
286d0 26 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  & zPath[nDb]!='-
286e0 27 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69  ' ) nDb--;.    i
286f0 66 28 20 6e 44 62 3d 3d 30 20 29 20 72 65 74 75  f( nDb==0 ) retu
28700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28710 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
28720 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
28730 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
28740 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  .    if( 0==osSt
28750 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20  at(zDb, &sStat) 
28760 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20  ){.      *pMode 
28770 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20  = sStat.st_mode 
28780 26 20 30 37 37 37 3b 0a 20 20 20 20 7d 65 6c 73  & 0777;.    }els
28790 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
287a0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
287b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
287c0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
287d0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
287e0 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d  CLOSE ){.    *pM
287f0 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a  ode = 0600;.  }.
28800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28810 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66  /*.** Open the f
28820 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a  ile zPath..** .*
28830 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68  * Previously, th
28840 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65  e SQLite OS laye
28850 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e  r used three fun
28860 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20  ctions in place 
28870 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a  of this.** one:.
28880 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
28890 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
288a0 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
288b0 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
288c0 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
288d0 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
288e0 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  e();.**.** These
288f0 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e   calls correspon
28900 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d to the followi
28910 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
28920 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
28930 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20      ReadWrite() 
28940 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54  ->     (READWRIT
28950 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20  E | CREATE).**  
28960 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d     ReadOnly()  -
28970 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29  >     (READONLY)
28980 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63   .**     OpenExc
28990 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41  lusive() -> (REA
289a0 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
289b0 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a  | EXCLUSIVE).**.
289c0 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45  ** The old OpenE
289d0 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70  xclusive() accep
289e0 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72  ted a boolean ar
289f0 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61  gument - "delFla
28a00 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20  g". If.** true, 
28a10 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e  the file was con
28a20 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75  figured to be au
28a30 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
28a40 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ted when the.** 
28a50 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73  file handle clos
28a60 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ed. To achieve t
28a70 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75  he same effect u
28a80 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a  sing this new .*
28a90 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64  * interface, add
28aa0 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f   the DELETEONCLO
28ab0 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65  SE flag to those
28ac0 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65   specified above
28ad0 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63   for .** OpenExc
28ae0 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61  lusive()..*/.sta
28af0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
28b00 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
28b10 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
28b20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20   /* The VFS for 
28b30 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68  which this is th
28b40 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a  e xOpen method *
28b50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28b60 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
28b70 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20   /* Pathname of 
28b80 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  file to be opene
28b90 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
28ba0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
28bb0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
28bc0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
28bd0 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20   filled in */.  
28be0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28c00 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63  Input flags to c
28c10 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69  ontrol the openi
28c20 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  ng */.  int *pOu
28c30 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
28c40 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66       /* Output f
28c50 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f  lags returned to
28c60 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a   SQLite core */.
28c70 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
28c80 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
28c90 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d  File;.  int fd =
28ca0 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
28cb0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
28cc0 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
28cd0 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
28ce0 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
28cf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
28d00 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
28d10 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  s to open() */. 
28d20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
28d30 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
28d40 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
28d50 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
28d60 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
28d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28d80 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b  rue to omit lock
28d90 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a  ing primitives *
28da0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
28db0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
28dc0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
28dd0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20  eturn Code */.. 
28de0 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
28df0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
28e00 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
28e10 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
28e20 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
28e30 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
28e40 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
28e50 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
28e60 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
28e70 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
28e80 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
28e90 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
28ea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
28eb0 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
28ec0 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
28ed0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
28ee0 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
28ef0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
28f00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
28f10 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
28f20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
28f30 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
28f40 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
28f50 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61  If creating a ma
28f60 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c  ster or main-fil
28f70 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20  e journal, this 
28f80 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70  function will op
28f90 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64  en.  ** a file-d
28fa0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
28fb0 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20   directory too. 
28fc0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75  The first time u
28fd0 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69  nixSync().  ** i
28fe0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72  s called the dir
28ff0 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
29000 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66  riptor will be f
29010 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f  sync()ed and clo
29020 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e  se()d..  */.  in
29030 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43  t syncDir = (isC
29040 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20  reate && (.     
29050 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45     eType==SQLITE
29060 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
29070 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
29080 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
29090 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _MAIN_JOURNAL . 
290a0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
290b0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
290c0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67  ));..  /* If arg
290d0 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
290e0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
290f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29100 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
29110 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
29120 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
29130 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
29140 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
29150 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
29160 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
29170 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74  NAME+1];.  const
29180 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a   char *zName = z
29190 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Path;..  /* Chec
291a0 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
291b0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
291c0 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
291d0 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
291e0 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
291f0 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
29200 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
29210 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
29220 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
29230 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
29240 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
29250 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
29260 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
29270 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
29280 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
29290 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
292a0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
292b0 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
292c0 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
292d0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
292e0 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
292f0 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
29300 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
29310 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
29320 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
29330 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
29340 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
29350 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
29360 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
29370 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
29380 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
29390 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
293a0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
293b0 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
293c0 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
293d0 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
293e0 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
293f0 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
29400 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
29410 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
29420 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
29430 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
29440 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
29450 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
29460 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
29470 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
29480 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
29490 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
294a0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
294b0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
294c0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
294d0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
294e0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
294f0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
29500 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
29510 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
29520 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
29530 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
29540 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
29550 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
29560 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
29570 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
29580 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
29590 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
295a0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
295b0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
295c0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
295d0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
295e0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
295f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
29600 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
29610 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
29620 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
29630 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
29640 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
29650 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
29660 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
29670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
29680 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
29690 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
296a0 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  AL.  );..  memse
296b0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(p, 0, sizeof(u
296c0 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66  nixFile));..  if
296d0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
296e0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
296f0 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
29700 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70   *pUnused;.    p
29710 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
29720 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66  sableFd(zName, f
29730 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
29740 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
29750 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
29760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29770 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
29780 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
29790 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
297a0 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65       if( !pUnuse
297b0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
297c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
297d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
297e0 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d      p->pUnused =
297f0 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73   pUnused;.  }els
29800 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a  e if( !zName ){.
29810 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
29820 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70  is NULL, the upp
29830 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75  er layer is requ
29840 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69  esting a temp fi
29850 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
29860 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 73  t(isDelete && !s
29870 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20  yncDir);.    rc 
29880 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  = unixGetTempnam
29890 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e(MAX_PATHNAME+1
298a0 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
298b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
298c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
298d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
298e0 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
298f0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  e;.  }..  /* Det
29900 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
29910 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61   of the flags pa
29920 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
29930 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e  o POSIX function
29940 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68  .  ** open(). Th
29950 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63  ese must be calc
29960 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f  ulated even if o
29970 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  pen() is not cal
29980 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65  led, as.  ** the
29990 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  y may be stored 
299a0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  as part of the f
299b0 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75  ile handle and u
299c0 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  sed by the .  **
299d0 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f   'conch file' lo
299e0 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  cking functions 
299f0 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20  later on.  */.  
29a00 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
29a10 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
29a20 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
29a30 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65  sReadWrite ) ope
29a40 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52  nFlags |= O_RDWR
29a50 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65  ;.  if( isCreate
29a60 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20   )    openFlags 
29a70 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66  |= O_CREAT;.  if
29a80 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20  ( isExclusive ) 
29a90 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
29aa0 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29  EXCL|O_NOFOLLOW)
29ab0 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  ;.  openFlags |=
29ac0 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f   (O_LARGEFILE|O_
29ad0 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20  BINARY);..  if( 
29ae0 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  fd<0 ){.    mode
29af0 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
29b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
29b10 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
29b20 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
29b30 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65      rc = findCre
29b40 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d  ateFileMode(zNam
29b50 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d  e, flags, &openM
29b60 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
29b70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29b80 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
29b90 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20  >pUnused );.    
29ba0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
29bb0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
29bc0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
29bd0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
29be0 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74  NAL );.      ret
29bf0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
29c00 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
29c10 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
29c20 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
29c30 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
29c40 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
29c50 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
29c60 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20   openFlags));.  
29c70 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
29c80 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69  rno!=EISDIR && i
29c90 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69  sReadWrite && !i
29ca0 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
29cb0 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f      /* Failed to
29cc0 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66   open the file f
29cd0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
29ce0 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f  cess. Try read-o
29cf0 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c  nly. */.      fl
29d00 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
29d10 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
29d20 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
29d30 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  E);.      openFl
29d40 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c  ags &= ~(O_RDWR|
29d50 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20  O_CREAT);.      
29d60 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
29d70 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
29d80 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c       openFlags |
29d90 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
29da0 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31    isReadonly = 1
29db0 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62  ;.      fd = rob
29dc0 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
29dd0 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
29de0 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ode);.    }.    
29df0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
29e00 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
29e10 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
29e20 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
29e30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
29e40 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
29e50 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
29e60 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b  assert( fd>=0 );
29e70 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
29e80 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61   ){.    *pOutFla
29e90 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
29ea0 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65  .  if( p->pUnuse
29eb0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75  d ){.    p->pUnu
29ec0 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
29ed0 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c    p->pUnused->fl
29ee0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
29ef0 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
29f00 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
29f10 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a  KS.    zPath = z
29f20 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Name;.#else.    
29f30 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b  osUnlink(zName);
29f40 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
29f50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29f60 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
29f70 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46  se{.    p->openF
29f80 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
29f90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
29fa0 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
29fb0 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
29fc0 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66  SETFD, osFcntl(f
29fd0 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
29fe0 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
29ff0 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
2a000 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2a010 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
2a020 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2a030 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
2a040 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2a050 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20  _STYLE.  struct 
2a060 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
2a070 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
2a080 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
2a090 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
2a0a0 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45  e*)pFile)->lastE
2a0b0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2a0c0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2a0d0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2a0e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a0f0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2a100 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
2a110 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c  strncmp("msdos",
2a120 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
2a130 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
2a140 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
2a150 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53  e)->fsFlags |= S
2a160 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
2a170 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64  _MSDOS;.  }.#end
2a180 69 66 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45  if.  .#if SQLITE
2a190 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a1a0 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45  STYLE.#if SQLITE
2a1b0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2a1c0 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72  CKING.  isAutoPr
2a1d0 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  oxy = 1;.#endif.
2a1e0 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78    if( isAutoProx
2a1f0 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c  y && (zPath!=NUL
2a200 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20  L) && (!noLock) 
2a210 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29  && pVfs->xOpen )
2a220 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66  {.    char *envf
2a230 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53  orce = getenv("S
2a240 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2a250 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20  Y_LOCKING");.   
2a260 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20   int useProxy = 
2a270 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  0;..    /* SQLIT
2a280 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2a290 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66  CKING==1 means f
2a2a0 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20  orce always use 
2a2b0 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a  proxy, 0 means .
2a2c0 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65      ** never use
2a2d0 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61   proxy, NULL mea
2a2e0 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72  ns use proxy for
2a2f0 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73   non-local files
2a300 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69   only.  */.    i
2a310 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c  f( envforce!=NUL
2a320 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72  L ){.      usePr
2a330 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f  oxy = atoi(envfo
2a340 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73  rce)>0;.    }els
2a350 65 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  e{.      struct 
2a360 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
2a370 20 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28       if( statfs(
2a380 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  zPath, &fsInfo) 
2a390 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  == -1 ){.       
2a3a0 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74   /* In theory, t
2a3b0 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c  he close(fd) cal
2a3c0 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c  l is sub-optimal
2a3d0 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  . If the file op
2a3e0 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ened.        ** 
2a3f0 77 69 74 68 20 66 64 20 69 73 20 61 20 64 61 74  with fd is a dat
2a400 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20  abase file, and 
2a410 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
2a420 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e  connections open
2a430 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  .        ** on t
2a440 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72  hat file that ar
2a450 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64  e currently hold
2a460 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  ing advisory loc
2a470 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20  ks on it,.      
2a480 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61    ** then the ca
2a490 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69  ll to close() wi
2a4a0 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20  ll cancel those 
2a4b0 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69  locks. In practi
2a4c0 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ce,.        ** w
2a4d0 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68  e're assuming th
2a4e0 61 74 20 73 74 61 74 66 73 28 29 20 64 6f 65 73  at statfs() does
2a4f0 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66  n't fail very of
2a500 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20  ten. At least.  
2a510 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69        ** not whi
2a520 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  le other file de
2a530 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
2a540 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
2a550 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20  cess on.        
2a560 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ** the same file
2a570 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a   are working.  *
2a580 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73  /.        p->las
2a590 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
2a5a0 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2a5b0 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2a5c0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72  NE__);.        r
2a5d0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2a5e0 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20  _ACCESS;.       
2a5f0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
2a600 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
2a610 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
2a620 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
2a630 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
2a640 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
2a650 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
2a660 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
2a670 56 66 73 2c 20 66 64 2c 20 73 79 6e 63 44 69 72  Vfs, fd, syncDir
2a680 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
2a690 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  noLock,.        
2a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6b0 20 20 69 73 44 65 6c 65 74 65 2c 20 69 73 52 65    isDelete, isRe
2a6c0 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 69  adonly);.      i
2a6d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a6f0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
2a700 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c  nixFile((unixFil
2a710 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f  e*)pFile, ":auto
2a720 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :");.        if(
2a730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a740 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  {.          /* U
2a750 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20  se unixClose to 
2a760 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73  clean up the res
2a770 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20  ources added in 
2a780 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a  fillInUnixFile .
2a790 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
2a7a0 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73   clear all the s
2a7b0 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72  tructure's refer
2a7c0 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63  ences.  Specific
2a7d0 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20  ally, .         
2a7e0 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68   ** pFile->pMeth
2a7f0 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ods will be NULL
2a800 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   so sqlite3OsClo
2a810 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d  se will be a no-
2a820 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  op .          */
2a830 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43  .          unixC
2a840 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  lose(pFile);.   
2a850 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2a860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a870 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f    }.      goto o
2a880 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
2a890 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
2a8a0 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55   .  rc = fillInU
2a8b0 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
2a8c0 2c 20 73 79 6e 63 44 69 72 2c 20 70 46 69 6c 65  , syncDir, pFile
2a8d0 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
2a8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a8f0 20 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c         isDelete,
2a900 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70   isReadonly);.op
2a910 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  en_finished:.  i
2a920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a930 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a940 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29  free(p->pUnused)
2a950 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a960 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
2a970 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
2a980 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
2a990 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
2a9a0 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
2a9b0 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
2a9c0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
2a9d0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
2a9e0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
2a9f0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
2aa00 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
2aa10 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
2aa20 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
2aa30 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
2aa40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2aa50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
2aa60 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2aa70 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
2aa80 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
2aa90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
2aaa0 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
2aab0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
2aac0 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
2aad0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2aae0 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
2aaf0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2ab00 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
2ab10 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
2ab20 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
2ab30 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e  );.  if( osUnlin
2ab40 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26  k(zPath)==(-1) &
2ab50 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20  & errno!=ENOENT 
2ab60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  ){.    return un
2ab70 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2ab80 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
2ab90 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29  "unlink", zPath)
2aba0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
2abb0 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
2abc0 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79  SYNC.  if( dirSy
2abd0 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64  nc ){.    int fd
2abe0 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65  ;.    rc = osOpe
2abf0 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
2ac00 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
2ac10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ac20 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2ac30 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
2ac40 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
2ac50 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
2ac60 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
2ac70 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
2ac80 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
2ac90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
2aca0 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20  FSYNC, "fsync", 
2acb0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
2acc0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2acd0 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
2ace0 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  __);.    }else i
2acf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
2ad00 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
2ad10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ad20 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2ad30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ad40 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  ./*.** Test the 
2ad50 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20  existance of or 
2ad60 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
2ad70 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68  ns of file zPath
2ad80 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65  . The.** test pe
2ad90 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20  rformed depends 
2ada0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
2adb0 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
2adc0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2add0 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20  XISTS: Return 1 
2ade0 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
2adf0 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ts.**     SQLITE
2ae00 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
2ae10 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  E: Return 1 if t
2ae20 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20  he file is read 
2ae30 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a  and writable..**
2ae40 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
2ae50 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74  SS_READONLY: Ret
2ae60 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2ae70 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a  e is readable..*
2ae80 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
2ae90 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
2aea0 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73  ic int unixAcces
2aeb0 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
2aec0 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20   *NotUsed,   /* 
2aed0 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69  The VFS containi
2aee0 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20  ng this xAccess 
2aef0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2af00 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2af10 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74      /* Path of t
2af20 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69  he file to exami
2af30 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ne */.  int flag
2af40 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2af50 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61  /* What do we wa
2af60 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75  nt to learn abou
2af70 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65  t the zPath file
2af80 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  ? */.  int *pRes
2af90 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Out            /
2afa0 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62  * Write result b
2afb0 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29  oolean here */.)
2afc0 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20  {.  int amode = 
2afd0 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
2afe0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2aff0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2b000 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2b010 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29  _IOERR_ACCESS; )
2b020 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
2b030 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
2b040 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2b050 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TS:.      amode 
2b060 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = F_OK;.      br
2b070 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2b080 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
2b090 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f  WRITE:.      amo
2b0a0 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a  de = W_OK|R_OK;.
2b0b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b0c0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
2b0d0 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20  ESS_READ:.      
2b0e0 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20  amode = R_OK;.  
2b0f0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2b100 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
2b110 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
2b120 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
2b130 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
2b140 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61   = (osAccess(zPa
2b150 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a  th, amode)==0);.
2b160 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c    if( flags==SQL
2b170 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2b180 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b  S && *pResOut ){
2b190 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
2b1a0 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d   buf;.    if( 0=
2b1b0 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26  =osStat(zPath, &
2b1c0 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73  buf) && buf.st_s
2b1d0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
2b1e0 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
2b1f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2b200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2b210 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
2b220 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
2b230 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
2b240 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
2b250 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
2b260 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
2b270 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
2b280 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
2b290 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
2b2a0 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
2b2b0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
2b2c0 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
2b2d0 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
2b2e0 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
2b2f0 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
2b300 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
2b310 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
2b320 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
2b330 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
2b340 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2b350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b360 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
2b370 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2b380 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2b390 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2b3a0 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
2b3b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2b3c0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
2b3d0 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
2b3e0 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
2b3f0 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20  .  int nOut,    
2b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b410 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
2b420 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
2b430 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  es */.  char *zO
2b440 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
2b450 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2b460 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20  buffer */.){..  
2b470 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
2b480 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
2b490 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
2b4a0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
2b4b0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
2b4c0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
2b4d0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
2b4e0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
2b4f0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
2b500 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
2b510 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
2b520 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
2b530 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
2b540 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
2b550 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
2b560 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
2b570 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
2b580 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2b590 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
2b5a0 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
2b5b0 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
2b5c0 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55  _PATHNAME );.  U
2b5d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2b5e0 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e  pVfs);..  zOut[n
2b5f0 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out-1] = '\0';. 
2b600 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27   if( zPath[0]=='
2b610 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  /' ){.    sqlite
2b620 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c  3_snprintf(nOut,
2b630 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61   zOut, "%s", zPa
2b640 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
2b650 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20    int nCwd;.    
2b660 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
2b670 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b  t, nOut-1)==0 ){
2b680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
2b690 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2b6a0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
2b6b0 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
2b6c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  );.    }.    nCw
2b6d0 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
2b6e0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
2b6f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
2b700 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
2b710 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
2b720 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b730 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
2b740 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b750 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
2b760 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
2b770 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
2b780 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
2b790 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
2b7a0 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
2b7b0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
2b7c0 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
2b7d0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
2b7e0 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
2b7f0 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
2b800 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
2b810 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
2b820 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
2b830 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
2b840 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b850 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
2b860 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
2b870 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
2b880 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
2b890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
2b8a0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
2b8b0 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
2b8c0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2b8d0 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
2b8e0 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
2b8f0 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
2b900 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
2b910 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
2b920 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
2b930 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
2b940 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
2b950 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
2b960 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
2b970 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
2b980 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
2b990 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
2b9a0 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
2b9b0 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
2b9c0 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
2b9d0 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
2b9e0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2b9f0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
2ba00 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
2ba10 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2ba20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f  *zErr;.  UNUSED_
2ba30 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2ba40 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
2ba50 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d  utex();.  zErr =
2ba60 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66   dlerror();.  if
2ba70 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ( zErr ){.    sq
2ba80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2ba90 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25  Buf, zBufOut, "%
2baa0 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  s", zErr);.  }. 
2bab0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2bac0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2bad0 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c   (*unixDlSym(sql
2bae0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2baf0 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73  d, void *p, cons
2bb00 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f  t char*zSym))(vo
2bb10 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  id){.  /* .  ** 
2bb20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74  GCC with -pedant
2bb30 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74  ic-errors says t
2bb40 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74  hat C90 does not
2bb50 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74   allow a void* t
2bb60 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69  o be.  ** cast i
2bb70 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
2bb80 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e   a function.  An
2bb90 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72  d yet the librar
2bba0 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e  y dlsym() routin
2bbb0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  e.  ** returns a
2bbc0 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20   void* which is 
2bbd0 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  really a pointer
2bbe0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
2bbf0 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20   So how do we.  
2bc00 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77  ** use dlsym() w
2bc10 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
2bc20 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rors?.  **.  ** 
2bc30 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77  Variable x below
2bc40 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
2bc50 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
2bc60 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67   function taking
2bc70 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  .  ** parameters
2bc80 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74   void* and const
2bc90 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72   char* and retur
2bca0 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  ning a pointer t
2bcb0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  o a function..  
2bcc0 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** We initialize
2bcd0 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20   x by assigning 
2bce0 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  it a pointer to 
2bcf0 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63  the dlsym() func
2bd00 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74  tion..  ** (That
2bd10 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75   assignment requ
2bd20 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54  ires a cast.)  T
2bd30 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20  hen we call the 
2bd40 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20  function that.  
2bd50 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ** x points to. 
2bd60 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
2bd70 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20   work-around is 
2bd80 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b  unlikely to work
2bd90 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e   correctly on an
2bda0 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20  y system where. 
2bdb0 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63   ** you really c
2bdc0 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e  annot cast a fun
2bdd0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e  ction pointer in
2bde0 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74  to void*.  But t
2bdf0 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  hen, on the.  **
2be00 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73   other hand, dls
2be10 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  ym() will not wo
2be20 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73  rk on such a sys
2be30 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77  tem either, so w
2be40 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20  e have.  ** not 
2be50 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74  really lost anyt
2be60 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69  hing..  */.  voi
2be70 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63  d (*(*x)(void*,c
2be80 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
2be90 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
2bea0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2beb0 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a  .  x = (void(*(*
2bec0 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
2bed0 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79  ar*))(void))dlsy
2bee0 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29  m;.  return (*x)
2bef0 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  (p, zSym);.}.sta
2bf00 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43  tic void unixDlC
2bf10 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
2bf20 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
2bf30 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
2bf40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2bf50 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73  tUsed);.  dlclos
2bf60 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  e(pHandle);.}.#e
2bf70 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
2bf80 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2bf90 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
2bfa0 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e   */.  #define un
2bfb0 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  ixDlOpen  0.  #d
2bfc0 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f  efine unixDlErro
2bfd0 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  r 0.  #define un
2bfe0 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  ixDlSym   0.  #d
2bff0 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73  efine unixDlClos
2c000 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  e 0.#endif../*.*
2c010 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74  * Write nBuf byt
2c020 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74  es of random dat
2c030 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  a to the supplie
2c040 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a  d buffer zBuf..*
2c050 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2c060 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  xRandomness(sqli
2c070 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2c080 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2c090 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
2c0a0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c0b0 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28  sed);.  assert((
2c0c0 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69  size_t)nBuf>=(si
2c0d0 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a  zeof(time_t)+siz
2c0e0 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f  eof(int)));..  /
2c0f0 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69  * We have to ini
2c100 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20  tialize zBuf to 
2c110 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64  prevent valgrind
2c120 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a   from reporting.
2c130 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68    ** errors.  Th
2c140 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64  e reports issued
2c150 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65   by valgrind are
2c160 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20   incorrect - we 
2c170 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65  would.  ** prefe
2c180 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f  r that the rando
2c190 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73  mness be increas
2c1a0 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65  ed by making use
2c1b0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   of the.  ** uni
2c1c0 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
2c1d0 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76   in zBuf - but v
2c1e0 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74  algrind errors t
2c1f0 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a  end to worry.  *
2c200 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52  * some users.  R
2c210 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65  ather than argue
2c220 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65  , it seems easie
2c230 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61  r just to initia
2c240 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68  lize.  ** the wh
2c250 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69  ole array and si
2c260 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20  lence valgrind, 
2c270 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
2c280 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65  ns less randomne
2c290 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  ss.  ** in the r
2c2a0 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a  andom seed..  **
2c2b0 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69  .  ** When testi
2c2c0 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  ng, initializing
2c2d0 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20   zBuf[] to zero 
2c2e0 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54  is all we do.  T
2c2f0 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  hat means.  ** t
2c300 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73  hat we always us
2c310 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f  e the same rando
2c320 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63  m number sequenc
2c330 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74  e.  This makes t
2c340 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65  he.  ** tests re
2c350 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  peatable..  */. 
2c360 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2c370 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66   nBuf);.#if !def
2c380 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2c390 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  ).  {.    int pi
2c3a0 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20  d, fd;.    fd = 
2c3b0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65  robust_open("/de
2c3c0 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
2c3d0 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  ONLY, 0);.    if
2c3e0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
2c3f0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
2c400 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
2c410 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
2c420 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
2c430 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
2c440 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2c450 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
2c460 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
2c470 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
2c480 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
2c490 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
2c4a0 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
2c4b0 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
2c4c0 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
2c4d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c4e0 20 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f 73 52    do{ nBuf = osR
2c4f0 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
2c500 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75  uf); }while( nBu
2c510 66 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  f<0 && errno==EI
2c520 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62  NTR );.      rob
2c530 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
2c540 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2c550 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
2c560 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
2c570 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
2c580 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
2c590 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
2c5a0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
2c5b0 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
2c5c0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
2c5d0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
2c5e0 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
2c5f0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
2c600 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
2c610 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
2c620 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
2c630 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
2c640 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
2c650 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
2c660 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
2c670 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
2c680 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2c690 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
2c6a0 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
2c6b0 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
2c6c0 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
2c6d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2c6e0 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
2c6f0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2c700 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
2c710 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2c720 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
2c730 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63  sp;..  sp.tv_sec
2c740 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20   = microseconds 
2c750 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e  / 1000000;.  sp.
2c760 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f  tv_nsec = (micro
2c770 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30  seconds % 100000
2c780 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e  0) * 1000;.  nan
2c790 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c  osleep(&sp, NULL
2c7a0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2c7b0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c7c0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
2c7d0 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66  conds;.#elif def
2c7e0 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
2c7f0 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
2c800 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73  .  usleep(micros
2c810 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
2c820 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c830 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
2c840 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
2c850 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73  se.  int seconds
2c860 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
2c870 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30  +999999)/1000000
2c880 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64  ;.  sleep(second
2c890 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
2c8a0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2c8b0 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
2c8c0 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69  s*1000000;.#endi
2c8d0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
2c8e0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
2c8f0 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
2c900 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
2c910 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2c920 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
2c930 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
2c940 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
2c950 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
2c960 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
2c970 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
2c980 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
2c990 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2c9a0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2c9b0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
2c9c0 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
2c9d0 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
2c9e0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
2c9f0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
2ca00 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
2ca10 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
2ca20 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
2ca30 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
2ca40 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
2ca50 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
2ca60 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2ca70 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
2ca80 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
2ca90 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
2caa0 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
2cab0 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
2cac0 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
2cad0 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
2cae0 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
2caf0 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
2cb00 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
2cb10 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
2cb20 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
2cb30 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
2cb40 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
2cb50 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
2cb60 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
2cb70 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
2cb80 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
2cb90 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
2cba0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
2cbb0 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
2cbc0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2cbd0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
2cbe0 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
2cbf0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2cc00 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
2cc10 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
2cc20 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
2cc30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  ;.#if defined(NO
2cc40 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f  _GETTOD).  time_
2cc50 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
2cc60 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71  .  *piNow = ((sq
2cc70 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31  lite3_int64)t)*1
2cc80 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  000 + unixEpoch;
2cc90 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
2cca0 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
2ccb0 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
2ccc0 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
2ccd0 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
2cce0 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
2ccf0 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
2cd00 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
2cd10 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
2cd20 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b  tv_nsec/1000000;
2cd30 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
2cd40 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20  timeval sNow;.  
2cd50 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
2cd60 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77  ow, 0);.  *piNow
2cd70 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
2cd80 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2cd90 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
2cda0 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30   sNow.tv_usec/10
2cdb0 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  00;.#endif..#ifd
2cdc0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2cdd0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
2cde0 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
2cdf0 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
2ce00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
2ce10 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2ce20 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
2ce30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
2ce40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2ce50 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
2ce60 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
2ce70 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2ce80 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2ce90 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2cea0 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
2ceb0 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
2cec0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2ced0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
2cee0 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
2cef0 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
2cf00 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
2cf10 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
2cf20 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
2cf30 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
2cf40 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2cf50 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2cf60 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
2cf70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2cf80 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  i;.  UNUSED_PARA
2cf90 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2cfa0 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
2cfb0 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20  eInt64(0, &i);. 
2cfc0 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
2cfd0 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e  0000.0;.  return
2cfe0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20   0;.}../*.** We 
2cff0 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61  added the xGetLa
2d000 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
2d010 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74   with the intent
2d020 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67  ion of providing
2d030 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c  .** better low-l
2d040 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
2d050 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69  ges when operati
2d060 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
2d070 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
2d080 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
2d090 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66  ation.  But so f
2d0a0 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74  ar, none of that
2d0b0 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d   has been implem
2d0c0 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ented.** in the 
2d0d0 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72  core.  So this r
2d0e0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
2d0f0 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77  called.  For now
2d100 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a  , it is merely.*
2d110 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  * a place-holder
2d120 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d130 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
2d140 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2d150 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
2d160 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
2d170 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
2d180 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2d190 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d1a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
2d1b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d1c0 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
2d1d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
2d1e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2d1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
2d200 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  f sqlite3_vfs me
2d210 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
2d220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d230 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2d240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d280 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
2d290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2d2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
2d2f0 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e  gin Proxy Lockin
2d300 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
2d310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d320 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  **.**.** Proxy l
2d330 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65  ocking is a "ube
2d340 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64  r-locking-method
2d350 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a  " in this sense:
2d360 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a    It uses the.**
2d370 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d   other locking m
2d380 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64  ethods on second
2d390 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20  ary lock files. 
2d3a0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2d3b0 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65  s a.** meta-laye
2d3c0 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68  r over top of th
2d3d0 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
2d3e0 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ing implemented 
2d3f0 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  above.  For.** t
2d400 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
2d410 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
2d420 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78  plements of prox
2d430 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66  y locking is def
2d440 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c  erred.** until l
2d450 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ate in the file 
2d460 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c  (here) after all
2d470 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f   of the other I/
2d480 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a  O methods have.*
2d490 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d  * been defined -
2d4a0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69   so that the pri
2d4b0 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d  mitive locking m
2d4c0 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c  ethods are avail
2d4d0 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69  able.** as servi
2d4e0 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68  ces to help with
2d4f0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2d500 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  ion of proxy loc
2d510 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a  king..**.****.**
2d520 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
2d530 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20  locking schemes 
2d540 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79  in SQLite use by
2d550 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f  te-range locks o
2d560 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
2d570 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69  e file to coordi
2d580 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75  nate safe, concu
2d590 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20  rrent access by 
2d5a0 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
2d5b0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20  .** and writers 
2d5c0 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f  [http://sqlite.o
2d5d0 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d  rg/lockingv3.htm
2d5e0 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69  l].  The five fi
2d5f0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  le locking.** st
2d600 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20  ates (UNLOCKED, 
2d610 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c  PENDING, SHARED,
2d620 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55   RESERVED, EXCLU
2d630 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d  SIVE) are implem
2d640 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49  ented.** as POSI
2d650 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c  X read & write l
2d660 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20  ocks over fixed 
2d670 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73  set of locations
2d680 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a   (via fsctl),.**
2d690 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20   on AFP and SMB 
2d6a0 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62  only exclusive b
2d6b0 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
2d6c0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69  are available vi
2d6d0 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20  a fsctl.** with 
2d6e0 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
2d6f0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
2d700 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b  ockPB2) to track
2d710 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74   the same 5 stat
2d720 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61  es..** To simula
2d730 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20  te a F_RDLCK on 
2d740 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
2d750 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f  , on AFP a rando
2d760 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20  mly selected.** 
2d770 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73  address in the s
2d780 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
2d790 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45  aken for a SHARE
2d7a0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69  D lock, the enti
2d7b0 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e  re.** shared ran
2d7c0 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
2d7d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2d7e0 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  k):.**.**      P
2d7f0 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20  ENDING_BYTE     
2d800 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20     0x40000000.. 
2d810 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45    ..**      RESE
2d820 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
2d830 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
2d840 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
2d850 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
2d860 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
2d870 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
2d880 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
2d890 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
2d8a0 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
2d8b0 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
2d8c0 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
2d8d0 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
2d8e0 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
2d8f0 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
2d900 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
2d910 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
2d920 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
2d930 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
2d940 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
2d950 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
2d960 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
2d970 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
2d980 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
2d990 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
2d9a0 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
2d9b0 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
2d9c0 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
2d9d0 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
2d9e0 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
2d9f0 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
2da00 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
2da10 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
2da20 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
2da30 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
2da40 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
2da50 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
2da60 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
2da70 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
2da80 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
2da90 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
2daa0 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
2dab0 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
2dac0 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
2dad0 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
2dae0 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
2daf0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
2db00 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
2db10 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
2db20 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
2db30 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
2db40 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
2db50 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
2db60 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
2db70 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
2db80 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
2db90 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
2dba0 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
2dbb0 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
2dbc0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2dbd0 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
2dbe0 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
2dbf0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
2dc00 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
2dc10 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
2dc20 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
2dc30 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
2dc40 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
2dc50 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2dc60 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
2dc70 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
2dc80 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
2dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dca0 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
2dcb0 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
2dcc0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
2dcd0 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
2dce0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
2dcf0 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
2dd00 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
2dd10 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
2dd20 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
2dd30 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
2dd40 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
2dd50 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
2dd60 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
2dd70 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
2dd80 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
2dd90 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
2dda0 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
2ddb0 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
2ddc0 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
2ddd0 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
2dde0 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
2ddf0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
2de00 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
2de10 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
2de20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
2de30 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
2de40 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
2de50 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
2de60 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2de70 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
2de80 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
2de90 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
2dea0 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
2deb0 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
2dec0 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
2ded0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
2dee0 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
2def0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
2df00 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
2df10 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
2df20 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
2df30 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
2df40 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
2df50 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
2df60 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
2df70 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
2df80 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
2df90 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
2dfa0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2dfb0 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
2dfc0 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
2dfd0 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
2dfe0 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
2dff0 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
2e000 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
2e010 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
2e020 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
2e030 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
2e040 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
2e050 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
2e060 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
2e070 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
2e080 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
2e090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e0a0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
2e0b0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
2e0c0 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
2e0d0 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
2e0e0 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
2e0f0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
2e100 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
2e110 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
2e120 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
2e130 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
2e140 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
2e150 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
2e160 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
2e170 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
2e180 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
2e190 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
2e1a0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
2e1b0 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
2e1c0 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
2e1d0 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
2e1e0 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
2e1f0 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
2e200 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
2e210 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
2e220 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
2e230 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
2e240 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
2e250 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
2e260 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
2e270 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
2e280 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
2e290 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
2e2a0 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
2e2b0 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
2e2c0 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
2e2d0 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
2e2e0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
2e2f0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
2e300 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e310 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
2e320 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
2e330 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
2e340 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2e350 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
2e360 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
2e370 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
2e380 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
2e390 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
2e3a0 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
2e3b0 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
2e3c0 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
2e3d0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
2e3e0 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
2e3f0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
2e400 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
2e410 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
2e420 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
2e430 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
2e440 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
2e450 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
2e460 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
2e470 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
2e480 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
2e490 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
2e4a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
2e4b0 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
2e4c0 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
2e4d0 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
2e4e0 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
2e4f0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
2e500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
2e510 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
2e520 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
2e530 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
2e540 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
2e550 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
2e560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e570 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
2e580 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
2e590 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
2e5a0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
2e5b0 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
2e5c0 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
2e5d0 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
2e5e0 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
2e5f0 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
2e600 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
2e610 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
2e620 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
2e630 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
2e640 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
2e650 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
2e660 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
2e670 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
2e680 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
2e690 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
2e6a0 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
2e6b0 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
2e6c0 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
2e6d0 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
2e6e0 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
2e6f0 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
2e700 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
2e710 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
2e720 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
2e730 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
2e740 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
2e750 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
2e760 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e770 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
2e780 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
2e790 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
2e7a0 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
2e7b0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
2e7c0 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
2e7d0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
2e7e0 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
2e7f0 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
2e800 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
2e810 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
2e820 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
2e830 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
2e840 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
2e850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e860 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
2e870 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2e880 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
2e890 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
2e8a0 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
2e8b0 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
2e8c0 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
2e8d0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
2e8e0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
2e8f0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
2e900 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
2e910 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
2e920 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
2e930 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
2e940 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
2e950 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
2e960 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
2e970 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
2e980 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
2e990 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
2e9a0 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
2e9b0 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
2e9c0 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
2e9d0 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
2e9e0 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
2e9f0 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
2ea00 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
2ea10 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
2ea20 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
2ea30 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
2ea40 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
2ea50 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
2ea60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
2ea70 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
2ea80 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
2ea90 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
2eaa0 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
2eab0 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
2eac0 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
2ead0 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
2eae0 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
2eaf0 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
2eb00 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
2eb10 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
2eb20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
2eb30 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
2eb40 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
2eb50 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
2eb60 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
2eb70 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
2eb80 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2eb90 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
2eba0 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
2ebb0 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
2ebc0 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
2ebd0 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
2ebe0 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
2ebf0 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
2ec00 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
2ec10 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
2ec20 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
2ec30 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
2ec40 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
2ec50 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
2ec60 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
2ec70 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
2ec80 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
2ec90 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
2eca0 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
2ecb0 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
2ecc0 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
2ecd0 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
2ece0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2ecf0 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
2ed00 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
2ed10 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
2ed20 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
2ed30 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2ed40 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2ed50 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2ed60 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
2ed70 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2ed80 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
2ed90 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
2eda0 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
2edb0 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
2edc0 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
2edd0 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
2ede0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
2edf0 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
2ee00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
2ee10 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
2ee20 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
2ee30 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2ee40 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
2ee50 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
2ee60 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
2ee70 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
2ee80 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2ee90 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
2eea0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
2eeb0 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
2eec0 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
2eed0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2eee0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
2eef0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2ef00 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
2ef10 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2ef20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
2ef30 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ef40 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
2ef50 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
2ef60 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
2ef70 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
2ef80 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
2ef90 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
2efa0 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
2efb0 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
2efc0 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
2efd0 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
2efe0 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
2eff0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
2f000 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
2f010 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
2f020 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
2f030 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
2f040 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
2f050 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
2f060 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
2f070 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
2f080 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2f090 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
2f0a0 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
2f0b0 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
2f0c0 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
2f0d0 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
2f0e0 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
2f0f0 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
2f100 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
2f110 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
2f120 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
2f130 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
2f140 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
2f150 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
2f160 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
2f170 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
2f180 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
2f190 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
2f1a0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
2f1b0 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
2f1c0 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
2f1d0 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
2f1e0 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
2f1f0 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
2f200 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
2f210 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
2f220 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
2f230 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
2f240 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
2f260 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69  th, errno, getpi
2f270 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  d()));.      ret
2f280 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2f290 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
2f2a0 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
2f2b0 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
2f2c0 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
2f2d0 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
2f2e0 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
2f2f0 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
2f300 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
2f310 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
2f320 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
2f330 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
2f340 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
2f350 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
2f360 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
2f370 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
2f380 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
2f390 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
2f3a0 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
2f3b0 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
2f3c0 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
2f3d0 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
2f3e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
2f3f0 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
2f400 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
2f410 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
2f420 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
2f430 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
2f440 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
2f450 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
2f460 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
2f470 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
2f480 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
2f490 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65  %d\n", lPath, ge
2f4a0 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
2f4b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f4c0 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73  ./* . ** Creates
2f4d0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
2f4e0 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64  nd any missing d
2f4f0 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f  irectories in lo
2f500 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69  ckPath. */.stati
2f510 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
2f520 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  eLockPath(const 
2f530 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b  char *lockPath){
2f540 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20  .  int i, len;. 
2f550 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54   char buf[MAXPAT
2f560 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61  HLEN];.  int sta
2f570 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73  rt = 0;.  .  ass
2f580 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55  ert(lockPath!=NU
2f590 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  LL);.  /* try to
2f5a0 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20   create all the 
2f5b0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72  intermediate dir
2f5c0 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65  ectories */.  le
2f5d0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
2f5e0 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66  lockPath);.  buf
2f5f0 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30  [0] = lockPath[0
2f600 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69  ];.  for( i=1; i
2f610 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  <len; i++ ){.   
2f620 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d   if( lockPath[i]
2f630 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20   == '/' && (i - 
2f640 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20  start > 0) ){.  
2f650 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69      /* only mkdi
2f660 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d  r if leaf dir !=
2f670 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22   "." or "/" or "
2f680 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  .." */.      if(
2f690 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69   i-start>2 || (i
2f6a0 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66  -start==1 && buf
2f6b0 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
2f6c0 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
2f6d0 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c  '/') .         |
2f6e0 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26  | (i-start==2 &&
2f6f0 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
2f700 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b  .' && buf[start+
2f710 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20  1] != '.') ){.  
2f720 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30        buf[i]='\0
2f730 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ';.        if( m
2f740 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45  kdir(buf, SQLITE
2f750 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
2f760 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29  R_PERMISSIONS) )
2f770 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2f780 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20  err=errno;.     
2f790 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45       if( err!=EE
2f7a0 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20  XIST ) {.       
2f7b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43       OSTRACE(("C
2f7c0 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46  REATELOCKPATH  F
2f7d0 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25  AILED creating %
2f7e0 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  s, ".           
2f7f0 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20            "'%s' 
2f800 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
2f810 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %s pid=%d\n",.  
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f830 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72     buf, strerror
2f840 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c  (err), lockPath,
2f850 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
2f860 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2f870 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  err;.          }
2f880 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f890 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69   }.      start=i
2f8a0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75  +1;.    }.    bu
2f8b0 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[i] = lockPath[
2f8c0 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  i];.  }.  OSTRAC
2f8d0 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
2f8e0 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
2f8f0 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
2f900 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70  , lockPath, getp
2f910 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  id()));.  return
2f920 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2f930 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69  ate a new VFS fi
2f940 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73  le descriptor (s
2f950 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
2f960 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
2f970 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
2f980 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69   and open the fi
2f990 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20  le named "path" 
2f9a0 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
2f9b0 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  riptor..**.** Th
2f9c0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
2f9d0 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79  onsible not only
2f9e0 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65   for closing the
2f9f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2fa00 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72  .** but also for
2fa10 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d   freeing the mem
2fa20 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2fa30 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73  ith the file des
2fa40 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  criptor..*/.stat
2fa50 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
2fa60 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20  teUnixFile(.    
2fa70 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
2fa80 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68  ,        /* path
2fa90 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
2faa0 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69  xFile */.    uni
2fab0 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20  xFile **ppFile, 
2fac0 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c        /* unixFil
2fad0 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65  e created and re
2fae0 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f  turned by ref */
2faf0 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66  .    int islockf
2fb00 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ile           /*
2fb10 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73   if non zero mis
2fb20 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62  sing dirs will b
2fb30 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b  e created */.) {
2fb40 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
2fb50 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2fb60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2fb70 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70  ITE_OK;.  int op
2fb80 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
2fb90 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71   | O_CREAT;.  sq
2fba0 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56  lite3_vfs dummyV
2fbb0 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f  fs;.  int terrno
2fbc0 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73   = 0;.  UnixUnus
2fbd0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
2fbe0 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66  NULL;..  /* 1. f
2fbf0 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e  irst try to open
2fc00 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65  /create the file
2fc10 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74  .  ** 2. if that
2fc20 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73   fails, and this
2fc30 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20   is a lock file 
2fc40 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79  (not-conch), try
2fc50 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
2fc60 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74  he parent direct
2fc70 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74  ories and then t
2fc80 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33  ry again..  ** 3
2fc90 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c  . if that fails,
2fca0 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   try to open the
2fcb0 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a   file read-only.
2fcc0 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72    ** otherwise r
2fcd0 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c  eturn BUSY (if l
2fce0 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e  ock file) or CAN
2fcf0 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f  TOPEN for the co
2fd00 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20  nch file.  */.  
2fd10 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65  pUnused = findRe
2fd20 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f  usableFd(path, o
2fd30 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28  penFlags);.  if(
2fd40 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2fd50 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
2fd60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2fd70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
2fd80 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
2fd90 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69  pUnused));.    i
2fda0 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20  f( !pUnused ){. 
2fdb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fdc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2fdd0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
2fde0 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  {.    fd = robus
2fdf0 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  t_open(path, ope
2fe00 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44  nFlags, SQLITE_D
2fe10 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
2fe20 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65  ISSIONS);.    te
2fe30 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2fe40 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
2fe50 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69  rno==ENOENT && i
2fe60 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
2fe70 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61     if( proxyCrea
2fe80 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29  teLockPath(path)
2fe90 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   == SQLITE_OK ){
2fea0 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f  .        fd = ro
2feb0 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
2fec0 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
2fed0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2fee0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
2fef0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2ff00 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2ff10 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
2ff20 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
2ff30 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
2ff40 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
2ff50 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2ff60 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2ff70 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
2ff80 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
2ff90 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
2ffa0 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
2ffb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
2ffc0 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
2ffd0 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
2ffe0 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
2fff0 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
30000 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
30010 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
30020 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30030 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
30040 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
30050 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
30060 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
30070 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
30080 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
30090 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
300a0 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
300b0 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
300c0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
300d0 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
300e0 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
300f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
30100 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
30110 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
30120 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
30130 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
30140 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
30150 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
30160 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74  nFlags;.  memset
30170 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73  (&dummyVfs, 0, s
30180 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29  izeof(dummyVfs))
30190 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70  ;.  dummyVfs.pAp
301a0 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  pData = (void*)&
301b0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
301c0 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61  ;.  dummyVfs.zNa
301d0 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20  me = "dummy";.  
301e0 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
301f0 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61  ;.  pUnused->fla
30200 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
30210 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20    pNew->pUnused 
30220 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20  = pUnused;.  .  
30230 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
30240 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66  ile(&dummyVfs, f
30250 64 2c 20 30 2c 20 28 73 71 6c 69 74 65 33 5f 66  d, 0, (sqlite3_f
30260 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c  ile*)pNew, path,
30270 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
30280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30290 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
302a0 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
302b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
302c0 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
302d0 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63  :    .  robust_c
302e0 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f  lose(pNew, fd, _
302f0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69  _LINE__);.  sqli
30300 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
30310 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
30320 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72  Unused);.  retur
30330 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
30340 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73  SQLITE_TEST./* s
30350 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
30360 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
30370 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
30380 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69   file paths */.i
30390 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
303a0 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  d_num = 0;.#endi
303b0 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  f..#define PROXY
303c0 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36  _HOSTIDLEN    16
303d0 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
303e0 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a  host id length *
303f0 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73  /../* Not always
30400 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
30410 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75  headers as it ou
30420 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74  ght to be */.ext
30430 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75  ern int gethostu
30440 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63  uid(uuid_t id, c
30450 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
30460 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a  spec *wait);../*
30470 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
30480 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
30490 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
304a0 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
304b0 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
304c0 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
304d0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
304e0 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
304f0 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
30500 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
30510 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73   *pError){.  ass
30520 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44  ert(PROXY_HOSTID
30530 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75  LEN == sizeof(uu
30540 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74  id_t));.  memset
30550 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f  (pHostID, 0, PRO
30560 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23  XY_HOSTIDLEN);.#
30570 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58  if defined(__MAX
30580 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49  _OS_X_VERSION_MI
30590 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20  N_REQUIRED)\.   
305a0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 5f              && _
305b0 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
305c0 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31  N_MIN_REQUIRED<1
305d0 30 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74  050.  {.    stat
305e0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
305f0 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74  timespec timeout
30600 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20   = {1, 0}; /* 1 
30610 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20  sec timeout */. 
30620 20 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75     if( gethostuu
30630 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d  id(pHostID, &tim
30640 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69  eout) ){.      i
30650 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
30660 20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72        if( pError
30670 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72   ){.        *pEr
30680 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20  ror = err;.     
30690 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
306a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
306b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23    }.  }.#endif.#
306c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
306d0 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20  T.  /* simulate 
306e0 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62  multiple hosts b
306f0 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75  y creating uniqu
30700 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61  e hostid file pa
30710 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ths */.  if( sql
30720 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
30730 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74  != 0){.    pHost
30740 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70  ID[0] = (char)(p
30750 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61  HostID[0] + (cha
30760 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  r)(sqlite3_hosti
30770 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a  d_num & 0xFF));.
30780 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
30790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
307a0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63  ;.}../* The conc
307b0 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  h file contains 
307c0 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74  the header, host
307d0 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   id and lock fil
307e0 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69  e path. */.#defi
307f0 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ne PROXY_CONCHVE
30800 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62  RSION 2   /* 1-b
30810 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62  yte header, 16-b
30820 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74  yte host id, pat
30830 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
30840 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20  XY_HEADERLEN    
30850 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c  1   /* conch fil
30860 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  e header length 
30870 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
30880 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28 50  _PATHINDEX    (P
30890 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
308a0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a  ROXY_HOSTIDLEN).
308b0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41  #define PROXY_MA
308c0 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58  XCONCHLEN  (PROX
308d0 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
308e0 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50  Y_HOSTIDLEN+MAXP
308f0 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20  ATHLEN)../* .** 
30900 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f  Takes an open co
30910 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73  nch file, copies
30920 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f   the contents to
30930 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20   a new path and 
30940 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69  then moves .** i
30950 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77  t back.  The new
30960 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65 27  ly created file'
30970 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  s file descripto
30980 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f  r is assigned to
30990 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69   the.** conch fi
309a0 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  le structure and
309b0 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69   finally the ori
309c0 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65  ginal conch file
309d0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a   descriptor is .
309e0 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75  ** closed.  Retu
309f0 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63  rns zero if succ
30a00 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69  essful..*/.stati
30a10 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b  c int proxyBreak
30a20 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
30a30 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
30a40 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70  t myHostID){.  p
30a50 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
30a60 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
30a70 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
30a80 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
30a90 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78  Context; .  unix
30aa0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
30ab0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
30ac0 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b  e;.  char tPath[
30ad0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63  MAXPATHLEN];.  c
30ae0 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41  har buf[PROXY_MA
30af0 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68  XCONCHLEN];.  ch
30b00 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78  ar *cPath = pCtx
30b10 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b  ->conchFilePath;
30b20 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65  .  size_t readLe
30b30 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20  n = 0;.  size_t 
30b40 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  pathLen = 0;.  c
30b50 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d  har errmsg[64] =
30b60 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   "";.  int fd = 
30b70 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d  -1;.  int rc = -
30b80 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  1;.  UNUSED_PARA
30b90 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b  METER(myHostID);
30ba0 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20  ..  /* create a 
30bb0 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70 6c  new path by repl
30bc0 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  ace the trailing
30bd0 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27   '-conch' with '
30be0 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74  -break' */.  pat
30bf0 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74  hLen = strlcpy(t
30c00 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58  Path, cPath, MAX
30c10 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20  PATHLEN);.  if( 
30c20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c  pathLen>MAXPATHL
30c30 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20  EN || pathLen<6 
30c40 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70  || .     (strlcp
30c50 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e  y(&tPath[pathLen
30c60 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29  -5], "break", 6)
30c70 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71   != 5) ){.    sq
30c80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
30c90 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
30ca0 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72  rmsg,"path error
30cb0 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
30cc0 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  pathLen);.    go
30cd0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
30ce0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20  ;.  }.  /* read 
30cf0 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e  the conch conten
30d00 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d  t */.  readLen =
30d10 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69   osPread(conchFi
30d20 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58  le->h, buf, PROX
30d30 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
30d40 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e  );.  if( readLen
30d50 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  <PROXY_PATHINDEX
30d60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30d70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
30d80 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22  errmsg),errmsg,"
30d90 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20  read error (len 
30da0 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c 65  %d)",(int)readLe
30db0 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
30dc0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
30dd0 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75    /* write it ou
30de0 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  t to the tempora
30df0 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f  ry break file */
30e00 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
30e10 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44  pen(tPath, (O_RD
30e20 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  WR|O_CREAT|O_EXC
30e30 4c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L),.            
30e40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
30e50 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
30e60 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66  SSIONS);.  if( f
30e70 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d<0 ){.    sqlit
30e80 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
30e90 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
30ea0 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
30eb0 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
30ec0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
30ed0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
30ee0 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c  if( osPwrite(fd,
30ef0 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
30f00 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65  ) != (ssize_t)re
30f10 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  adLen ){.    sql
30f20 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30f30 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
30f40 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69  rmsg, "write fai
30f50 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
30f60 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
30f70 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
30f80 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74   if( rename(tPat
30f90 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20  h, cPath) ){.   
30fa0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30fb0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
30fc0 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  , errmsg, "renam
30fd0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
30fe0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
30ff0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
31000 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
31010 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
31020 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
31030 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
31040 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f  h);.  robust_clo
31050 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46  se(pFile, conchF
31060 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
31070 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  );.  conchFile->
31080 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46  h = fd;.  conchF
31090 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  ile->openFlags =
310a0 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
310b0 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  T;..end_breakloc
310c0 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  k:.  if( rc ){. 
310d0 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
310e0 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74        osUnlink(t
310f0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f 62  Path);.      rob
31100 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
31110 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
31120 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
31130 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65  f(stderr, "faile
31140 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65  d to break stale
31150 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c   lock on %s, %s\
31160 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73  n", cPath, errms
31170 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
31180 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20   rc;.}../* Take 
31190 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
311a0 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
311b0 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61  file and break a
311c0 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74   stale lock if t
311d0 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d  he .** host id m
311e0 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  atches..*/.stati
311f0 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68  c int proxyConch
31200 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
31210 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
31220 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54  ostID, int lockT
31230 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ype){.  proxyLoc
31240 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
31250 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
31260 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
31270 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
31280 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
31290 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
312a0 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e  >conchFile;.  in
312b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
312c0 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d  ;.  int nTries =
312d0 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d   0;.  struct tim
312e0 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69  espec conchModTi
312f0 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20 20  me;.  .  do {.  
31300 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
31310 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
31320 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
31330 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54  conchFile, lockT
31340 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73  ype);.    nTries
31350 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   ++;.    if( rc=
31360 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
31370 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
31380 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73  lock failed (bus
31390 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74  y):.       * 1st
313a0 20 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f   try: get the mo
313b0 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f  d time of the co
313c0 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61  nch, wait 0.5s a
313d0 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20  nd try again. . 
313e0 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a        * 2nd try:
313f0 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64   fail if the mod
31400 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72   time changed or
31410 20 68 6f 73 74 20 69 64 20 69 73 20 64 69 66 66   host id is diff
31420 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20  erent, wait .   
31430 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
31440 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 61  10 sec and try a
31450 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72  gain.       * 3r
31460 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65  d try: break the
31470 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65   lock unless the
31480 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68   mod time has ch
31490 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f  anged..       */
314a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
314b0 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66  at buf;.      if
314c0 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63 68 46  ( osFstat(conchF
314d0 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b  ile->h, &buf) ){
314e0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
314f0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
31500 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
31510 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
31520 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
31530 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
31540 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ries==1 ){.     
31550 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20     conchModTime 
31560 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
31570 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65  ec;.        usle
31580 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77  ep(500000); /* w
31590 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20  ait 0.5 sec and 
315a0 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
315b0 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  in*/.        con
315c0 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d  tinue;  .      }
315d0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
315e0 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20  nTries>1 );.    
315f0 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69    if( conchModTi
31600 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66  me.tv_sec != buf
31610 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
31620 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20  _sec || .       
31630 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74    conchModTime.t
31640 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74  v_nsec != buf.st
31650 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73  _mtimespec.tv_ns
31660 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ec ){.        re
31670 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
31680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31690 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65  .      if( nTrie
316a0 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20  s==2 ){  .      
316b0 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58    char tBuf[PROX
316c0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
316d0 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
316e0 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
316f0 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52  ile->h, tBuf, PR
31700 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
31710 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
31720 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   len<0 ){.      
31730 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
31740 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
31750 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31760 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
31770 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31780 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58      if( len>PROX
31790 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20 74  Y_PATHINDEX && t
317a0 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52  Buf[0]==(char)PR
317b0 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
317c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
317d0 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20  don't break the 
317e0 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74  lock if the host
317f0 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   id doesn't matc
31800 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  h */.          i
31810 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42  f( 0!=memcmp(&tB
31820 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  uf[PROXY_HEADERL
31830 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50  EN], myHostID, P
31840 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
31850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
31860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
31870 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  Y;.          }. 
31880 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31890 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74          /* don't
318a0 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
318b0 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72  on short read or
318c0 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61   a version misma
318d0 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
318e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
318f0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  USY;.        }. 
31900 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30         usleep(10
31910 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74  000000); /* wait
31920 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
31930 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a  the lock again *
31940 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
31950 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ue; .      }.   
31960 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74     .      assert
31970 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20  ( nTries==3 );. 
31980 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78       if( 0==prox
31990 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
319a0 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29  pFile, myHostID)
319b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
319c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
319d0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
319e0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
319f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31a00 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
31a10 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
31a20 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
31a30 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
31a40 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20  CK);          . 
31a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31a60 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
31a70 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
31a80 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
31a90 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
31aa0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
31ab0 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ockType);.      
31ac0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31ad0 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d  }.  } while( rc=
31ae0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
31af0 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20  nTries<3 );.  . 
31b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31b10 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63  * Takes the conc
31b20 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68  h by taking a sh
31b30 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65  ared lock and re
31b40 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ad the contents 
31b50 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f  conch, if .** lo
31b60 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55  ckPath is non-NU
31b70 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20  LL, the host ID 
31b80 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
31b90 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20  th must match.  
31ba0 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50  A NULL .** lockP
31bb0 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ath means that t
31bc0 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74  he lockPath in t
31bd0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
31be0 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ll be used if th
31bf0 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d  e .** host IDs m
31c00 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c  atch, or a new l
31c10 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
31c20 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d   generated autom
31c30 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64  atically .** and
31c40 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
31c50 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73  conch file..*/.s
31c60 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
31c70 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  akeConch(unixFil
31c80 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f  e *pFile){.  pro
31c90 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31ca0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
31cb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
31cc0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
31cd0 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28  ntext; .  .  if(
31ce0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
31cf0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
31d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
31d10 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
31d20 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
31d30 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
31d40 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f  .    uuid_t myHo
31d50 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45  stID;.    int pE
31d60 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68  rror = 0;.    ch
31d70 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59  ar readBuf[PROXY
31d80 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
31d90 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68     char lockPath
31da0 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
31db0 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b    char *tempLock
31dc0 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Path = NULL;.   
31dd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31de0 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65  _OK;.    int cre
31df0 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20  ateConch = 0;.  
31e00 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63    int hostIdMatc
31e10 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  h = 0;.    int r
31e20 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  eadLen = 0;.    
31e30 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61  int tryOldLockPa
31e40 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  th = 0;.    int 
31e50 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
31e60 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f   = 0;.    .    O
31e70 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e  STRACE(("TAKECON
31e80 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69  CH  %d for %s pi
31e90 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d=%d\n", conchFi
31ea0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
31eb0 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50      (pCtx->lockP
31ec0 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d  roxyPath ? pCtx-
31ed0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a  >lockProxyPath :
31ee0 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
31ef0 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20  id()));..    rc 
31f00 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  = proxyGetHostID
31f10 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72  (myHostID, &pErr
31f20 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  or);.    if( (rc
31f30 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49  &0xff)==SQLITE_I
31f40 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46  OERR ){.      pF
31f50 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
31f60 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67   pError;.      g
31f70 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
31f80 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  h;.    }.    rc 
31f90 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  = proxyConchLock
31fa0 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
31fb0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
31fc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31fd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
31fe0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
31ff0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  h;.    }.    /* 
32000 72 65 61 64 20 74 68 65 20 65 78 69 73 74 69 6e  read the existin
32010 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  g conch file */.
32020 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65      readLen = se
32030 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46  ekAndRead((unixF
32040 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
32050 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58  0, readBuf, PROX
32060 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a  Y_MAXCONCHLEN);.
32070 20 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c      if( readLen<
32080 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f  0 ){.      /* I/
32090 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72  O error: lastErr
320a0 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
320b0 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70  dRead */.      p
320c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
320d0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73  = conchFile->las
320e0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
320f0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
32100 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f  READ;.      goto
32110 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
32120 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
32130 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45  adLen<=(PROXY_HE
32140 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
32150 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20  STIDLEN) || .   
32160 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42 75            readBu
32170 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58  f[0]!=(char)PROX
32180 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29  Y_CONCHVERSION )
32190 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f  {.      /* a sho
321a0 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73 69  rt read or versi
321b0 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74  on format mismat
321c0 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  ch means we need
321d0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
321e0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68   .      ** conch
321f0 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f   file. .      */
32200 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e  .      createCon
32210 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ch = 1;.    }.  
32220 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74    /* if the host
32230 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20   id matches and 
32240 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c  the lock path al
32250 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
32260 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a  the conch.    **
32270 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73   we'll try to us
32280 65 20 74 68 65 20 70 61 74 68 20 74 68 65 72 65  e the path there
32290 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70  , if we can't op
322a0 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77 65  en that path, we
322b0 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72  'll .    ** retr
322c0 79 20 77 69 74 68 20 61 20 6e 65 77 20 61 75 74  y with a new aut
322d0 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74 68  o-generated path
322e0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20   .    */.    do 
322f0 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20  { /* in case we 
32300 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67 61 69  need to try agai
32310 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20  n for an :auto: 
32320 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20  named lock file 
32330 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63  */..      if( !c
32340 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66  reateConch && !f
32350 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
32360 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49  ){.        hostI
32370 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70  dMatch = !memcmp
32380 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f  (&readBuf[PROXY_
32390 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
323a0 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20  stID, .         
323b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323c0 20 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48           PROXY_H
323d0 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
323e0 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e     /* if the con
323f0 63 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70  ch has data comp
32400 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
32410 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
32420 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
32430 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
32440 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61    /* for auto-na
32450 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  med local lock f
32460 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20  ile, just check 
32470 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
32480 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  we'll.          
32490 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61   ** use the loca
324a0 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
324b0 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79 20   that's already 
324c0 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  in there.       
324d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
324e0 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
324f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32500 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
32510 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58   (readLen - PROX
32520 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20  Y_PATHINDEX);.  
32530 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
32540 20 20 20 20 20 20 20 69 66 28 20 70 61 74 68 4c         if( pathL
32550 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  en>=MAXPATHLEN )
32560 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32570 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c  pathLen=MAXPATHL
32580 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  EN-1;.          
32590 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
325a0 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c  memcpy(lockPath,
325b0 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f   &readBuf[PROXY_
325c0 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68  PATHINDEX], path
325d0 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Len);.          
325e0 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c    lockPath[pathL
325f0 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  en] = 0;.       
32600 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
32610 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
32620 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64            tryOld
32630 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20  LockPath = 1;.  
32640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65            /* cre
32650 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
32660 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74  e lock path if t
32670 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
32680 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
32690 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
326a0 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nch;.          }
326b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
326c0 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20  f( hostIdMatch. 
326d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
326e0 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
326f0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26  lockProxyPath, &
32700 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
32710 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20  THINDEX],.      
32720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32730 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f       readLen-PRO
32740 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20  XY_PATHINDEX).  
32750 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
32760 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74     /* conch host
32770 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d   and lock path m
32780 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
32790 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
327a0 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d  onch; .        }
327b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
327c0 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
327d0 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74  conch isn't writ
327e0 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74  able and doesn't
327f0 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74   match, we can't
32800 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20   take it */.    
32810 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65    if( (conchFile
32820 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44  ->openFlags&O_RD
32830 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  WR) == 0 ){.    
32840 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32850 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f  BUSY;.        go
32860 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
32870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32880 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72  .      /* either
32890 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27   the conch didn'
328a0 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65  t match or we ne
328b0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
328c0 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  ew one */.      
328d0 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
328e0 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
328f0 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b      proxyGetLock
32900 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74  Path(pCtx->dbPat
32910 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  h, lockPath, MAX
32920 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
32930 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d    tempLockPath =
32940 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20   lockPath;.     
32950 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63     /* create a c
32960 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  opy of the lock 
32970 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74  path _only_ if t
32980 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
32990 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  n */.      }.   
329a0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64     .      /* upd
329b0 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68  ate conch with h
329c0 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68  ost and path (th
329d0 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20  is will fail if 
329e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
329f0 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61      ** has a sha
32a00 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79  red lock already
32a10 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ), if the host i
32a20 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74  d matches, use t
32a30 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20  he big.      ** 
32a40 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stick..      */.
32a50 20 20 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f        futimes(co
32a60 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c  nchFile->h, NULL
32a70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73  );.      if( hos
32a80 74 49 64 4d 61 74 63 68 20 26 26 20 21 63 72 65  tIdMatch && !cre
32a90 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20  ateConch ){.    
32aa0 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c      if( conchFil
32ab0 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e  e->pInode && con
32ac0 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  chFile->pInode->
32ad0 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
32ae0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
32af0 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
32b00 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
32b10 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
32b20 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   in this.       
32b30 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
32b40 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
32b50 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
32b60 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
32b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
32b80 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  Y;.        } els
32b90 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20  e {          .  
32ba0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
32bb0 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  xyConchLock(pFil
32bc0 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43  e, myHostID, EXC
32bd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
32be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
32bf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
32c00 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
32c10 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
32c20 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
32c30 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f  File, EXCLUSIVE_
32c40 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
32c50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32c60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32c70 20 20 63 68 61 72 20 77 72 69 74 65 42 75 66 66    char writeBuff
32c80 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  er[PROXY_MAXCONC
32c90 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69  HLEN];.        i
32ca0 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30  nt writeSize = 0
32cb0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
32cc0 20 20 20 77 72 69 74 65 42 75 66 66 65 72 5b 30     writeBuffer[0
32cd0 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f  ] = (char)PROXY_
32ce0 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20  CONCHVERSION;.  
32cf0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72        memcpy(&wr
32d00 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
32d10 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
32d20 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
32d30 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  IDLEN);.        
32d40 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
32d50 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b  oxyPath!=NULL ){
32d60 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63  .          strlc
32d70 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
32d80 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
32d90 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  , pCtx->lockProx
32da0 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  yPath, MAXPATHLE
32db0 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  N);.        }els
32dc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  e{.          str
32dd0 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  lcpy(&writeBuffe
32de0 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  r[PROXY_PATHINDE
32df0 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  X], tempLockPath
32e00 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
32e10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32e20 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f   writeSize = PRO
32e30 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73  XY_PATHINDEX + s
32e40 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66  trlen(&writeBuff
32e50 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
32e60 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 6f  EX]);.        ro
32e70 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 63  bust_ftruncate(c
32e80 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69  onchFile->h, wri
32e90 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  teSize);.       
32ea0 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28   rc = unixWrite(
32eb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
32ec0 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65  conchFile, write
32ed0 42 75 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a  Buffer, writeSiz
32ee0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  e, 0);.        f
32ef0 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  sync(conchFile->
32f00 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  h);.        /* I
32f10 66 20 77 65 20 63 72 65 61 74 65 64 20 61 20 6e  f we created a n
32f20 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e  ew conch file (n
32f30 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65 64 20  ot just updated 
32f40 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32f50 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76  a .         ** v
32f60 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29  alid conch file)
32f70 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  , try to match t
32f80 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
32f90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
32fa0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
32fb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32fc0 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43  TE_OK && createC
32fd0 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  onch ){.        
32fe0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
32ff0 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  f;.          int
33000 20 65 72 72 20 3d 20 6f 73 46 73 74 61 74 28 70   err = osFstat(p
33010 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  File->h, &buf);.
33020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
33030 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
33040 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65      mode_t cmode
33050 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28   = buf.st_mode&(
33060 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20  S_IRUSR|S_IWUSR 
33070 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52  | S_IRGRP|S_IWGR
33080 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  P |.            
33090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330a0 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49 52              S_IR
330b0 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20  OTH|S_IWOTH);.  
330c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79            /* try
330d0 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61   to match the da
330e0 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57 20  tabase file R/W 
330f0 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e  permissions, ign
33100 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23  ore failure */.#
33110 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52  ifndef SQLITE_PR
33120 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20  OXY_DEBUG.      
33130 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 63        osFchmod(c
33140 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f  onchFile->h, cmo
33150 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  de);.#else.     
33160 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
33170 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6f 73           rc = os
33180 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65  Fchmod(conchFile
33190 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 20 20 20  ->h, cmode);.   
331a0 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28           }while(
331b0 20 72 63 3d 3d 28 2d 31 29 20 26 26 20 65 72 72   rc==(-1) && err
331c0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
331d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
331e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
331f0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65      int code = e
33200 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
33210 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
33220 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 46  rr, "fchmod %o F
33230 41 49 4c 45 44 20 77 69 74 68 20 25 64 20 25 73  AILED with %d %s
33240 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
33250 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f 64 65             cmode
33260 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72  , code, strerror
33270 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 20  (code));.       
33280 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
33290 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
332a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 68  ntf(stderr, "fch
332b0 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44 5c  mod %o SUCCEDED\
332c0 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20  n",cmode);.     
332d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
332e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
332f0 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d        int code =
33300 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
33310 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
33320 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45 44  rr, "STAT FAILED
33330 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25 73 5c  [%d] with %d %s\
33340 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
33350 20 20 20 20 20 20 20 20 20 65 72 72 2c 20 63 6f           err, co
33360 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
33370 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  e));.#endif.    
33380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33390 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
333a0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
333b0 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
333c0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
333d0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43  File, SHARED_LOC
333e0 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 65  K);.      .    e
333f0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20 20  nd_takeconch:.  
33400 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52      OSTRACE(("TR
33410 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45 20  ANSPROXY: CLOSE 
33420 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
33430 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
33440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
33450 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
33460 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
33470 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
33480 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
33490 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
334a0 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
334b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
334c0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
334d0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 64  ;.        int fd
334e0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
334f0 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  Ctx->dbPath, pFi
33500 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20  le->openFlags,. 
33510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33520 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
33530 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
33540 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20 4f  IONS);.        O
33550 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
33560 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22  OXY: OPEN  %d\n"
33570 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20  , fd));.        
33580 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
33590 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
335a0 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  = fd;.        }e
335b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
335c0 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  c=SQLITE_CANTOPE
335d0 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54  N_BKPT; /* SQLIT
335e0 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b  E_BUSY? proxyTak
335f0 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20  eConch called.  
33600 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67 20           during 
33610 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
33620 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33640 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c  E_OK && !pCtx->l
33650 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  ockProxy ){.    
33660 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d      char *path =
33670 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20   tempLockPath ? 
33680 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70  tempLockPath : p
33690 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
336a0 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  th;.        rc =
336b0 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
336c0 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78  File(path, &pCtx
336d0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b  ->lockProxy, 1);
336e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
336f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
33700 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26  !=SQLITE_NOMEM &
33710 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68  & tryOldLockPath
33720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
33730 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65   we couldn't cre
33740 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  ate the proxy lo
33750 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ck file with the
33760 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   old lock file p
33770 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ath.           *
33780 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76  * so try again v
33790 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a  ia auto-naming .
337a0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
337b0 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77          forceNew
337c0 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20  LockPath = 1;.  
337d0 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f          tryOldLo
337e0 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
337f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
33800 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68  /* go back to th
33810 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74  e do {} while st
33820 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61  art point, try a
33830 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
33840 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
33850 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33860 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
33870 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63  Need to make a c
33880 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66 20 77  opy of path if w
33890 65 20 65 78 74 72 61 63 74 65 64 20 74 68 65 20  e extracted the 
338a0 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a  value.         *
338b0 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68  * from the conch
338c0 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74   file or the pat
338d0 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  h was allocated 
338e0 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20  on the stack.   
338f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
33900 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74   if( tempLockPat
33910 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  h ){.          p
33920 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
33930 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
33940 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b  rDup(0, tempLock
33950 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  Path);.         
33960 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
33970 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
33980 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
33990 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
339a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
339b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
339c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
339d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  K ){.        pCt
339e0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31  x->conchHeld = 1
339f0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
33a00 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
33a10 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20  kProxy->pMethod 
33a20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
33a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
33a40 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
33a50 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20  *afpCtx;.       
33a60 20 20 20 61 66 70 43 74 78 20 3d 20 28 61 66 70     afpCtx = (afp
33a70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
33a80 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  )pCtx->lockProxy
33a90 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
33aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43  ;.          afpC
33ab0 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74  tx->dbPath = pCt
33ac0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
33ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33ae0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
33af0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
33b00 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
33b10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
33b20 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  nchFile, NO_LOCK
33b30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33b40 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43   OSTRACE(("TAKEC
33b50 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20  ONCH  %d %s\n", 
33b60 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
33b70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 3d               rc=
33b80 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a  =SQLITE_OK?"ok":
33b90 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
33ba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
33bb0 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a   } while (1); /*
33bc0 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64   in case we need
33bd0 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61   to retry the :a
33be0 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d  uto: lock file -
33bf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
33c00 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
33c10 6e 65 76 65 72 20 67 65 74 20 68 65 72 65 20 65  never get here e
33c20 78 63 65 70 74 20 76 69 61 20 74 68 65 20 27 63  xcept via the 'c
33c30 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a  ontinue' call. *
33c40 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  /.  }.}../*.** I
33c50 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20  f pFile holds a 
33c60 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20  lock on a conch 
33c70 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61  file, then relea
33c80 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f  se that lock..*/
33c90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
33ca0 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e  yReleaseConch(un
33cb0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
33cc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33cd0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
33ce0 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   Subroutine retu
33cf0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f  rn code */.  pro
33d00 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
33d10 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20   *pCtx;  /* The 
33d20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
33d30 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  for the proxy lo
33d40 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ck */.  unixFile
33d50 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
33d60 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
33d70 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
33d80 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78  ..  pCtx = (prox
33d90 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
33da0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
33db0 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68  Context;.  conch
33dc0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
33dd0 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43  chFile;.  OSTRAC
33de0 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E(("RELEASECONCH
33df0 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
33e00 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
33e10 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
33e20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
33e30 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
33e40 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
33e50 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20  uto:"), .       
33e60 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
33e70 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
33e80 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72  hHeld>0 ){.    r
33e90 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
33ea0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
33eb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
33ec0 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
33ed0 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e  K);.  }.  pCtx->
33ee0 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20  conchHeld = 0;. 
33ef0 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41   OSTRACE(("RELEA
33f00 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  SECONCH  %d %s\n
33f10 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
33f20 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d  .           (rc=
33f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
33f40 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b  " : "failed")));
33f50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33f60 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
33f70 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
33f80 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74  ase file, comput
33f90 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74  e the name of it
33fa0 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a  s conch file..**
33fb0 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68   Store the conch
33fc0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d   filename in mem
33fd0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
33fe0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
33ff0 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f  ()..** Make *pCo
34000 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f  nchPath point to
34010 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20   the new name.  
34020 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
34030 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
34040 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
34050 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61  f unable to obta
34060 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  in memory..**.**
34070 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
34080 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
34090 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
340a0 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
340b0 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76  y.** space is ev
340c0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a  entually freed..
340d0 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74  **.** *pConchPat
340e0 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  h is set to NULL
340f0 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
34100 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
34110 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
34120 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43  int proxyCreateC
34130 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61  onchPathname(cha
34140 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
34150 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20  **pConchPath){. 
34160 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
34170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34180 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
34190 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69  /.  int len = (i
341a0 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
341b0 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20  ); /* Length of 
341c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
341d0 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20  e - dbPath */.  
341e0 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b  char *conchPath;
341f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34200 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   buffer in which
34210 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f   to construct co
34220 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f  nch name */..  /
34230 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
34240 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66   for the conch f
34250 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74  ilename and init
34260 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20  ialize the name 
34270 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  to.  ** the name
34280 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
34290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
342a0 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61  */  .  *pConchPa
342b0 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d  th = conchPath =
342c0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
342d0 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29  _malloc(len + 8)
342e0 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74  ;.  if( conchPat
342f0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  h==0 ){.    retu
34300 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
34310 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f  .  }.  memcpy(co
34320 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c  nchPath, dbPath,
34330 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a   len+1);.  .  /*
34340 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e   now insert a ".
34350 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  " before the las
34360 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f  t / character */
34370 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31  .  for( i=(len-1
34380 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a  ); i>=0; i-- ){.
34390 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74      if( conchPat
343a0 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[i]=='/' ){.   
343b0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72     i++;.      br
343c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
343d0 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e   conchPath[i]='.
343e0 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c  ';.  while ( i<l
343f0 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50  en ){.    conchP
34400 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b  ath[i+1]=dbPath[
34410 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  i];.    i++;.  }
34420 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68  ..  /* append th
34430 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69  e "-conch" suffi
34440 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  x to the file */
34450 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68  .  memcpy(&conch
34460 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e  Path[i+1], "-con
34470 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72  ch", 7);.  asser
34480 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63  t( (int)strlen(c
34490 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e  onchPath) == len
344a0 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  +7 );..  return 
344b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
344c0 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20  * Takes a fully 
344d0 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79  configured proxy
344e0 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75   locking-style u
344f0 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69  nix file and swi
34500 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63  tches.** the loc
34510 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
34520 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h .*/.static int
34530 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
34540 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  Path(unixFile *p
34550 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
34560 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
34570 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34580 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
34590 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
345a0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
345b0 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64  ext;.  char *old
345c0 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
345d0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e  kProxyPath;.  in
345e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
345f0 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ;..  if( pFile->
34600 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
34610 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
34620 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
34630 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e  }  ..  /* nothin
34640 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70  g to do if the p
34650 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75  ath is NULL, :au
34660 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74  to: or matches t
34670 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  he existing path
34680 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20   */.  if( !path 
34690 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
346a0 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
346b0 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20  , ":auto:") ||. 
346c0 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21     (oldPath && !
346d0 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c  strncmp(oldPath,
346e0 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45   path, MAXPATHLE
346f0 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  N)) ){.    retur
34700 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
34710 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
34720 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  le *lockProxy = 
34730 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
34740 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
34750 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70  roxy=NULL;.    p
34760 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
34770 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   0;.    if( lock
34780 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20  Proxy!=NULL ){. 
34790 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78       rc=lockProx
347a0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
347b0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
347c0 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20   *)lockProxy);. 
347d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
347e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
347f0 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
34800 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20  Proxy);.    }.  
34810 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f    sqlite3_free(o
34820 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74  ldPath);.    pCt
34830 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
34840 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
34850 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d  up(0, path);.  }
34860 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
34870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20  .}../*.** pFile 
34880 69 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  is a file that h
34890 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62  as been opened b
348a0 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20  y a prior xOpen 
348b0 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a  call.  dbPath.**
348c0 20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66   is a string buf
348d0 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58  fer at least MAX
348e0 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63  PATHLEN+1 charac
348f0 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ters in size..**
34900 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
34910 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61   find the filena
34920 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  me associated wi
34930 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69  th pFile and wri
34940 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62  tes it.** int db
34950 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Path..*/.static 
34960 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61  int proxyGetDbPa
34970 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e  thForUnixFile(un
34980 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
34990 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69  har *dbPath){.#i
349a0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
349b0 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65  E__).  if( pFile
349c0 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
349d0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
349e0 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b    /* afp style k
349f0 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65  eeps a reference
34a00 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20   to the db path 
34a10 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20  in the filePath 
34a20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66  field .    ** of
34a30 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20   the struct */. 
34a40 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29     assert( (int)
34a50 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
34a60 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34a70 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
34a80 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
34a90 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63  dbPath, ((afpLoc
34aa0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
34ab0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34ac0 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41  ext)->dbPath, MA
34ad0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65  XPATHLEN);.  } e
34ae0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  lse.#endif.  if(
34af0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
34b00 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
34b10 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64  hods ){.    /* d
34b20 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73  ot lock style us
34b30 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
34b40 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
34b50 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20  the dot lock.   
34b60 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   ** file path */
34b70 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73  .    int len = s
34b80 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46  trlen((char *)pF
34b90 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
34ba0 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f  ext) - strlen(DO
34bb0 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20  TLOCK_SUFFIX);. 
34bc0 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68     memcpy(dbPath
34bd0 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
34be0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
34bf0 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c   len + 1);.  }el
34c00 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f  se{.    /* all o
34c10 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20  ther styles use 
34c20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
34c30 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
34c40 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   db file path */
34c50 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72  .    assert( str
34c60 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
34c70 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
34c80 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
34c90 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50  .    strlcpy(dbP
34ca0 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
34cb0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34cc0 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  xt, MAXPATHLEN);
34cd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
34ce0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
34cf0 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61  * Takes an alrea
34d00 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69  dy filled in uni
34d10 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72  x file and alter
34d20 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65  s it so all file
34d30 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c   locking .** wil
34d40 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  l be performed o
34d50 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78  n the local prox
34d60 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68  y lock file.  Th
34d70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
34d80 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72  ds.** are preser
34d90 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ved in the locki
34da0 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68  ng context so th
34db0 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
34dc0 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20  estored and .** 
34dd0 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75  the unix structu
34de0 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61  re properly clea
34df0 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20  ned up at close 
34e00 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b  time:.**  ->lock
34e10 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d  ingContext.**  -
34e20 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74  >pMethod.*/.stat
34e30 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
34e40 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
34e50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
34e60 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
34e70 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   {.  proxyLockin
34e80 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
34e90 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41    char dbPath[MA
34ea0 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20  XPATHLEN+1];    
34eb0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
34ec0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34ed0 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
34ee0 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  ath=NULL;.  int 
34ef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34f00 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e    .  if( pFile->
34f10 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
34f20 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
34f30 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
34f40 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50 61  }.  proxyGetDbPa
34f50 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46  thForUnixFile(pF
34f60 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  ile, dbPath);.  
34f70 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74  if( !path || pat
34f80 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73  h[0]=='\0' || !s
34f90 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75  trcmp(path, ":au
34fa0 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63  to:") ){.    loc
34fb0 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65  kPath=NULL;.  }e
34fc0 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74  lse{.    lockPat
34fd0 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a  h=(char *)path;.
34fe0 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45    }.  .  OSTRACE
34ff0 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25  (("TRANSPROXY  %
35000 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
35010 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
35020 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50 61           (lockPa
35030 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20  th ? lockPath : 
35040 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69  ":auto:"), getpi
35050 64 28 29 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d  d()));..  pCtx =
35060 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
35070 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
35080 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20  ;.  if( pCtx==0 
35090 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
350a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
350b0 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30    memset(pCtx, 0
350c0 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29  , sizeof(*pCtx))
350d0 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43  ;..  rc = proxyC
350e0 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61  reateConchPathna
350f0 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43 74 78  me(dbPath, &pCtx
35100 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
35110 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
35120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
35130 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
35140 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63  xFile(pCtx->conc
35150 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78  hFilePath, &pCtx
35160 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b  ->conchFile, 0);
35170 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35180 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20  ITE_CANTOPEN && 
35190 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  ((pFile->openFla
351a0 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29  gs&O_RDWR) == 0)
351b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
351c0 28 61 29 20 74 68 65 20 6f 70 65 6e 20 66 6c 61  (a) the open fla
351d0 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44 57  gs are not O_RDW
351e0 52 2c 20 28 62 29 20 74 68 65 20 63 6f 6e 63 68  R, (b) the conch
351f0 20 69 73 6e 27 74 20 74 68 65 72 65 2c 20 61 6e   isn't there, an
35200 64 0a 20 20 20 20 20 20 2a 2a 20 28 63 29 20 74  d.      ** (c) t
35210 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 69  he file system i
35220 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65  s read-only, the
35230 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b  n enable no-lock
35240 69 6e 67 20 61 63 63 65 73 73 2e 0a 20 20 20 20  ing access..    
35250 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65 20    ** Ugh, since 
35260 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30 30  O_RDONLY==0x0000
35270 20 77 65 20 74 65 73 74 20 66 6f 72 20 21 4f 5f   we test for !O_
35280 52 44 57 52 20 73 69 6e 63 65 20 75 6e 69 78 4f  RDWR since unixO
35290 70 65 6e 20 61 73 73 65 72 74 73 0a 20 20 20 20  pen asserts.    
352a0 20 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46 6c    ** that openFl
352b0 61 67 73 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e  ags will have on
352c0 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e  ly one of O_RDON
352d0 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20 20  LY or O_RDWR..  
352e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
352f0 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
35300 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
35310 73 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a  stat conchInfo;.
35320 20 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b        int goLock
35330 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20  less = 0;..     
35340 20 69 66 28 20 6f 73 53 74 61 74 28 70 43 74 78   if( osStat(pCtx
35350 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c  ->conchFilePath,
35360 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d 20   &conchInfo) == 
35370 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  -1 ) {.        i
35380 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
35390 20 20 20 20 20 20 20 20 69 66 28 20 28 65 72 72          if( (err
353a0 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73 74  ==ENOENT) && (st
353b0 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 66 73  atfs(dbPath, &fs
353c0 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b 0a  Info) != -1) ){.
353d0 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63 6b            goLock
353e0 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e 66  less = (fsInfo.f
353f0 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c  _flags&MNT_RDONL
35400 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59  Y) == MNT_RDONLY
35410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35420 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 6f    }.      if( go
35430 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20 20  Lockless ){.    
35440 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
35450 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65 61  eld = -1; /* rea
35460 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c  d only FS/ lockl
35470 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ess */.        r
35480 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
35490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
354a0 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
354b0 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61  ITE_OK && lockPa
354c0 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  th ){.    pCtx->
354d0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
354e0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
354f0 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  0, lockPath);.  
35500 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
35510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
35520 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c  tx->dbPath = sql
35530 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
35540 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  dbPath);.    if(
35550 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d 4e   pCtx->dbPath==N
35560 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ULL ){.      rc 
35570 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
35580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
35590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
355a0 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f  .    /* all memo
355b0 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ry is allocated,
355c0 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65 61   proxys are crea
355d0 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65 64  ted and assigned
355e0 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63 68  , .    ** switch
355f0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
35600 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64  text and pMethod
35610 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20   then return..  
35620 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e 6f    */.    pCtx->o
35630 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
35640 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   = pFile->lockin
35650 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46  gContext;.    pF
35660 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
35670 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20 20  ext = pCtx;.    
35680 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64  pCtx->pOldMethod
35690 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
356a0 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d  d;.    pFile->pM
356b0 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f  ethod = &proxyIo
356c0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
356d0 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  {.    if( pCtx->
356e0 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20 20  conchFile ){ .  
356f0 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46      pCtx->conchF
35700 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
35710 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
35720 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68  le *)pCtx->conch
35730 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  File);.      sql
35740 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
35750 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
35760 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
35770 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63  ree(0, pCtx->loc
35780 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20  kProxyPath);.   
35790 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
357a0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
357b0 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33  h); .    sqlite3
357c0 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d  _free(pCtx);.  }
357d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41  .  OSTRACE(("TRA
357e0 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e  NSPROXY  %d %s\n
357f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
35800 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c          (rc==SQL
35810 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
35820 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72  "failed")));.  r
35830 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
35840 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
35850 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33   handles sqlite3
35860 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20  _file_control() 
35870 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73  calls that are s
35880 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72  pecific.** to pr
35890 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  oxy locking..*/.
358a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
358b0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
358c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
358d0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
358e0 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
358f0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
35900 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
35910 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
35920 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
35930 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
35940 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
35950 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
35960 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  yIoMethods ){.  
35970 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
35980 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
35990 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
359a0 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
359b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
359c0 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65         proxyTake
359d0 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
359e0 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
359f0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
35a00 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
35a10 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
35a20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
35a30 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
35a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
35a50 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
35a60 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28  pArg = ":auto: (
35a70 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20  not held)";.    
35a80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
35a90 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  se {.        *(c
35aa0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
35ab0 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
35ac0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
35ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
35ae0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
35af0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
35b00 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
35b10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
35b20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
35b30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35b40 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
35b50 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28  isProxyStyle = (
35b60 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
35b70 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
35b80 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  s);.      if( pA
35b90 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e  rg==NULL || (con
35ba0 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d  st char *)pArg==
35bb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
35bc0 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
35bd0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
35be0 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
35bf0 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f  king - not suppo
35c00 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  rted */.        
35c10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
35c20 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f  ROR /*SQLITE_PRO
35c30 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49  TOCOL? SQLITE_MI
35c40 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20  SUSE?*/;.       
35c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35c60 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
35c70 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c  oxy locking - al
35c80 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50  ready off - NOOP
35c90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
35ca0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
35cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
35cc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
35cd0 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61  st char *proxyPa
35ce0 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  th = (const char
35cf0 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20   *)pArg;.       
35d00 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c   if( isProxyStyl
35d10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
35d20 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35d30 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20  xt *pCtx = .    
35d40 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f          (proxyLo
35d50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
35d60 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
35d70 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ext;.          i
35d80 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c  f( !strcmp(pArg,
35d90 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20   ":auto:") .    
35da0 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d         || (pCtx-
35db0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26  >lockProxyPath &
35dc0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
35dd0 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
35de0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70  lockProxyPath, p
35df0 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
35e00 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20  HLEN)).         
35e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35e30 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
35e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
35e50 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  = switchLockProx
35e60 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f  yPath(pFile, pro
35e70 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
35e80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
35e90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
35ea0 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66   turn on proxy f
35eb0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ile locking */. 
35ec0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
35ed0 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
35ee0 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78  File(pFile, prox
35ef0 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  yPath);.        
35f00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35f10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
35f20 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
35f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
35f40 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20  );  /* The call 
35f50 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c  assures that onl
35f60 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20  y valid opcodes 
35f70 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20  are sent */.    
35f80 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
35f90 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20  CHED*/.  return 
35fa0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
35fb0 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  ./*.** Within th
35fc0 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65  is division (the
35fd0 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
35fe0 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
35ff0 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 73  ) the procedures
36000 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70  .** above this p
36010 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69  oint are all uti
36020 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63  lities.  The loc
36030 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64  k-related method
36040 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78  s of the.** prox
36050 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  y-locking sqlite
36060 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65  3_io_method obje
36070 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a  ct follow..*/...
36080 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
36090 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
360a0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
360b0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
360c0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
360d0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
360e0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
360f0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
36100 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
36110 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
36120 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
36130 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
36140 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
36150 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
36160 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
36170 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
36180 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
36190 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
361a0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
361b0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
361c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
361d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
361e0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
361f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
36200 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
36210 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
36220 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
36230 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
36240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36250 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
36260 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
36270 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
36280 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
36290 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
362a0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
362b0 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  eld>0 ){.      u
362c0 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
362d0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
362e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
362f0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
36300 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
36310 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
36320 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29  )proxy, pResOut)
36330 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a 20  ;.    }else{ /* 
36340 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
36350 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
36360 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20 20     pResOut=0;.  
36370 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36380 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
36390 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
363a0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
363b0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
363c0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
363d0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
363e0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
363f0 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
36400 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
36410 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
36420 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
36430 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
36440 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
36450 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
36460 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
36470 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
36480 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
36490 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
364a0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
364b0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
364c0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
364d0 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
364e0 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
364f0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
36500 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
36510 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
36520 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
36530 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
36540 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
36550 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
36560 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
36570 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
36580 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
36590 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
365a0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
365b0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
365c0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
365d0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
365e0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
365f0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
36600 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
36610 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
36620 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
36630 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
36640 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
36650 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
36660 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
36670 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
36680 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
36690 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
366a0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
366b0 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
366c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
366d0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
366e0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
366f0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
36700 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
36710 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  = proxyTakeConch
36720 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
36730 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36740 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
36750 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
36760 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
36770 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
36780 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
36790 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
367a0 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20  hHeld>0 ){.     
367b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79   unixFile *proxy
367c0 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
367d0 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  xy;.      rc = p
367e0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
367f0 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
36800 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c 65  le*)proxy, eFile
36810 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46 69  Lock);.      pFi
36820 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
36830 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b  proxy->eFileLock
36840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36850 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20     /* conchHeld 
36860 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20  < 0 is lockless 
36870 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
36880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
36890 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
368a0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
368b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
368c0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
368d0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
368e0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
368f0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
36900 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
36910 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
36920 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
36930 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
36940 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
36950 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
36960 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
36970 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
36980 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
36990 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
369a0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
369b0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
369c0 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
369d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
369e0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
369f0 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
36a00 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
36a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36a20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
36a30 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36a40 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36a50 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
36a60 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
36a70 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
36a80 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
36a90 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
36aa0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
36ab0 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20  Proxy;.      rc 
36ac0 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
36ad0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
36ae0 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
36af0 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  eFileLock);.    
36b00 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
36b10 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c  ck = proxy->eFil
36b20 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  eLock;.    }else
36b30 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68  {.      /* conch
36b40 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b  Held < 0 is lock
36b50 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  less */.    }.  
36b60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
36b70 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
36b80 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20 70  file that uses p
36b90 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73  roxy locks..*/.s
36ba0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
36bb0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
36bc0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
36bd0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
36be0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
36bf0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70 72  File*)id;.    pr
36c00 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36c10 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
36c20 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
36c30 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
36c40 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78  ontext;.    unix
36c50 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20  File *lockProxy 
36c60 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
36c70 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  y;.    unixFile 
36c80 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
36c90 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
36ca0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36cb0 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20 69  E_OK;.    .    i
36cc0 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a  f( lockProxy ){.
36cd0 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50        rc = lockP
36ce0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
36cf0 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
36d00 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c  file*)lockProxy,
36d10 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
36d20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
36d30 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
36d40 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
36d50 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
36d60 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72  te3_file*)lockPr
36d70 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oxy);.      if( 
36d80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
36d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
36da0 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  ee(lockProxy);. 
36db0 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50       pCtx->lockP
36dc0 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  roxy = 0;.    }.
36dd0 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c      if( conchFil
36de0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
36df0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 29  Ctx->conchHeld )
36e00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
36e10 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
36e20 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
36e30 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
36e40 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
36e50 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
36e60 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
36e70 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
36e80 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20  *)conchFile);.  
36e90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36ea0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
36eb0 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63 68  lite3_free(conch
36ec0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
36ed0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
36ee0 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  , pCtx->lockProx
36ef0 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  yPath);.    sqli
36f00 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63  te3_free(pCtx->c
36f10 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20  onchFilePath);. 
36f20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
36f30 28 30 2c 20 70 43 74 78 2d 3e 64 62 50 61 74 68  (0, pCtx->dbPath
36f40 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f 72  );.    /* restor
36f50 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c  e the original l
36f60 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61  ocking context a
36f70 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20  nd pMethod then 
36f80 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  close it */.    
36f90 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
36fa0 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f 6c  ntext = pCtx->ol
36fb0 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
36fc0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  .    pFile->pMet
36fd0 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c 64  hod = pCtx->pOld
36fe0 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c 69  Method;.    sqli
36ff0 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
37000 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65      return pFile
37010 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
37020 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
37030 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37040 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ....#endif /* de
37050 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
37060 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
37070 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
37080 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  */./*.** The pro
37090 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  xy locking style
370a0 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72   is intended for
370b0 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66 69   use with AFP fi
370c0 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e  lesystems..** An
370d0 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20 6f  d since AFP is o
370e0 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  nly supported on
370f0 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72 6f   MacOSX, the pro
37100 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 6c  xy locking is al
37110 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65 64  so.** restricted
37120 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a   to MacOSX..** .
37130 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
37140 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
37150 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d 70  e proxy lock imp
37160 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
37170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37180 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
37190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
371d0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
371e0 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69  lize the operati
371f0 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
37200 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ace..**.** This 
37210 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
37220 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d  s all VFS implem
37230 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e  entations for un
37240 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e  ix-like operatin
37250 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20 54  g.** systems.  T
37260 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64  his routine, and
37270 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f   the sqlite3_os_
37280 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74 68  end() routine th
37290 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73  at follows,.** s
372a0 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c  hould be the onl
372b0 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68  y routines in th
372c0 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  is file that are
372d0 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74   visible from ot
372e0 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a  her.** files..**
372f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
37300 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   is called once 
37310 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69 6e  during SQLite in
37320 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64  itialization and
37330 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20   by a.** single 
37340 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65 6d  thread.  The mem
37350 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
37360 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
37370 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a 20  ems have not.** 
37380 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65 6e  necessarily been
37390 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
373a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
373b0 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f  s called, and so
373c0 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
373d0 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  not be used..*/.
373e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
373f0 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a  nit(void){ .  /*
37400 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f   .  ** The follo
37410 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69 6e  wing macro defin
37420 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  es an initialize
37430 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33  r for an sqlite3
37440 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20 2a  _vfs object..  *
37450 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
37460 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20 20  e VFS is NAME.  
37470 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73 20  The pAppData is 
37480 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  a pointer to a p
37490 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74  ointer.  ** to t
374a0 68 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  he "finder" func
374b0 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74 61  tion.  (pAppData
374c0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
374d0 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61 75   a pointer becau
374e0 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43 39  se.  ** silly C9
374f0 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69 74  0 rules prohibit
37500 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62 65   a void* from be
37510 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66 75  ing cast to a fu
37520 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a 20  nction pointer. 
37530 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68 61   ** and so we ha
37540 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67 68  ve to go through
37550 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
37560 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f  e pointer to avo
37570 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a  id problems.  **
37580 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
37590 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
375a0 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a 20  rrors on GCC.). 
375b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49 4e   **.  ** The FIN
375c0 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74 6f  DER parameter to
375d0 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 74   this macro is t
375e0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70  he name of the p
375f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20  ointer to the.  
37600 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ** finder-functi
37610 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72 2d  on.  The finder-
37620 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
37630 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
37640 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69 6f  e.  ** sqlite_io
37650 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
37660 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
37670 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63 6b  the desired lock
37680 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69 6f  ing.  ** behavio
37690 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69 76  rs.  See the div
376a0 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61 74  ision above that
376b0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4f   contains the IO
376c0 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61 63  METHODS.  ** mac
376d0 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 20  ro for addition 
376e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 66  information on f
376f0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73 2e  inder-functions.
37700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20  .  **.  ** Most 
37710 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20 72  finders simply r
37720 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
37730 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
37740 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20 20  e3_io_methods.  
37750 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20  ** object.  But 
37760 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f 46  the "autolockIoF
37770 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c 65  inder" available
37780 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73 20   on MacOSX does 
37790 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f  a little.  ** mo
377a0 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69 74  re than that; it
377b0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
377c0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74 68  lesystem type th
377d0 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20 20  at hosts the .  
377e0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
377f0 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63 68   and tries to ch
37800 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67 20  oose an locking 
37810 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69 61  method appropria
37820 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61 74  te for.  ** that
37830 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d 65   filesystem time
37840 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ..  */.  #define
37850 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d 45   UNIXVFS(VFSNAME
37860 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20 20  , FINDER) {     
37870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37880 20 20 20 5c 0a 20 20 20 20 33 2c 20 20 20 20 20     \.    3,     
37890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
378a0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
378b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378c0 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75 6e   \.    sizeof(un
378d0 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  ixFile),     /* 
378e0 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20 20  szOsFile */     
378f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37900 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d  .    MAX_PATHNAM
37910 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78  E,         /* mx
37920 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20  Pathname */     
37930 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37940 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
37950 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
37960 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  t */            
37970 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37980 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20 20   VFSNAME,       
37990 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
379a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
379b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 28           \.    (
379c0 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20 20  void*)&FINDER,  
379d0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
379e0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
379f0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37a00 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  xOpen,          
37a10 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20 20     /* xOpen */  
37a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a30 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
37a40 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
37a50 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20 20   /* xDelete */  
37a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a70 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63 63     \.    unixAcc
37a80 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ess,           /
37a90 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20 20  * xAccess */    
37aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ab0 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c 50   \.    unixFullP
37ac0 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
37ad0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
37ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37af0 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c  .    unixDlOpen,
37b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
37b10 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20  lOpen */        
37b20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37b30 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c 20     unixDlError, 
37b40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
37b50 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rror */         
37b60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37b70 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20   unixDlSym,     
37b80 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
37b90 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37ba0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37bb0 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  nixDlClose,     
37bc0 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
37bd0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37be0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37bf0 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  xRandomness,    
37c00 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
37c10 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
37c20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53       \.    unixS
37c30 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
37c40 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20 20   /* xSleep */   
37c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c60 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72     \.    unixCur
37c70 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
37c80 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
37c90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
37ca0 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c 61   \.    unixGetLa
37cb0 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  stError,     /* 
37cc0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
37cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37ce0 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74  .    unixCurrent
37cf0 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
37d00 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
37d10 2a 2f 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20  */           \. 
37d20 20 20 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d     unixSetSystem
37d30 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
37d40 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20  SystemCall */   
37d50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37d60 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61   unixGetSystemCa
37d70 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
37d80 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20 20  stemCall */     
37d90 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37da0 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
37db0 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
37dc0 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20  temCall */      
37dd0 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20         \.  }..  
37de0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61  /*.  ** All defa
37df0 75 6c 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e  ult VFSes for un
37e00 69 78 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  ix are contained
37e10 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
37e20 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20  g array..  **.  
37e30 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
37e40 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65   sqlite3_vfs.pNe
37e50 78 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  xt field of the 
37e60 56 46 53 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f  VFS object is mo
37e70 64 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 74  dified.  ** by t
37e80 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77  he SQLite core w
37e90 68 65 6e 20 74 68 65 20 56 46 53 20 69 73 20 72  hen the VFS is r
37ea0 65 67 69 73 74 65 72 65 64 2e 20 20 53 6f 20 74  egistered.  So t
37eb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
37ec0 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62  * array cannot b
37ed0 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20  e const..  */.  
37ee0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
37ef0 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69  fs aVfs[] = {.#i
37f00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
37f10 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
37f20 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c 20   (OS_VXWORKS || 
37f30 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
37f40 5f 29 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28  _)).    UNIXVFS(
37f50 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20  "unix",         
37f60 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
37f70 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55  r ),.#else.    U
37f80 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20  NIXVFS("unix",  
37f90 20 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f 46          posixIoF
37fa0 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
37fb0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
37fc0 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c  x-none",     nol
37fd0 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20  ockIoFinder ),. 
37fe0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
37ff0 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c  -dotfile",  dotl
38000 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20  ockIoFinder ),. 
38010 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
38020 2d 65 78 63 6c 22 2c 20 20 20 20 20 70 6f 73 69  -excl",     posi
38030 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  xIoFinder ),.#if
38040 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
38050 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61  UNIXVFS("unix-na
38060 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69  medsem", semIoFi
38070 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23  nder ),.#endif.#
38080 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
38090 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
380a0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
380b0 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69  -posix",    posi
380c0 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  xIoFinder ),.#if
380d0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20   !OS_VXWORKS.   
380e0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66   UNIXVFS("unix-f
380f0 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49  lock",    flockI
38100 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
38110 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  f.#endif.#if SQL
38120 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
38130 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
38140 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
38150 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
38160 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66 70 49  -afp",      afpI
38170 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
38180 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 66 73  NIXVFS("unix-nfs
38190 22 2c 20 20 20 20 20 20 6e 66 73 49 6f 46 69 6e  ",      nfsIoFin
381a0 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56  der ),.    UNIXV
381b0 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c  FS("unix-proxy",
381c0 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65      proxyIoFinde
381d0 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b  r ),.#endif.  };
381e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
381f0 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
38200 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
38210 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63    /* Double-chec
38220 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63  k that the aSysc
38230 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20  all[] array has 
38240 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
38250 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e  .  ** correctly.
38260 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62    See ticket [bb
38270 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d  3a86e890c8e96ab]
38280 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72   */.  assert( Ar
38290 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
382a0 29 3d 3d 31 38 20 29 3b 0a 0a 20 20 2f 2a 20 52  )==18 );..  /* R
382b0 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65  egister all VFSe
382c0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
382d0 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f   aVfs[] array */
382e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73  .  for(i=0; i<(s
382f0 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65  izeof(aVfs)/size
38300 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29  of(sqlite3_vfs))
38310 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
38320 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
38330 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29  (&aVfs[i], i==0)
38340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
38350 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
38360 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
38370 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
38380 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  m interface..**.
38390 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  ** Some operatin
383a0 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20  g systems might 
383b0 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20  need to do some 
383c0 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20  cleanup in this 
383d0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72  routine,.** to r
383e0 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c  elease dynamical
383f0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a  ly allocated obj
38400 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f  ects.  But not o
38410 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20  n unix..** This 
38420 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
38430 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  op for unix..*/.
38440 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
38450 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74  nd(void){ .  ret
38460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
38470 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }. .#endif /* SQ
38480 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a  LITE_OS_UNIX */.