/ Hex Artifact Content
Login

Artifact b7267d7fa3b77306bcebcd6bb2a322ebf06e4d21:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1600: 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  ences */.typedef
1610: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1620: 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20  unixShm;        
1630: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1640: 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  tion shared memo
1650: 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ry */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1670: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20   unixShmNode;   
1680: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1690: 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f  mory instance */
16a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e  unixInodeInfo un
16c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f  ixInodeInfo;   /
16d0: 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74  * An i-node */.t
16e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
16f0: 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55  ixUnusedFd UnixU
1700: 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20  nusedFd;     /* 
1710: 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  An unused file d
1720: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a  escriptor */../*
1730: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61  .** Sometimes, a
1740: 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64  fter a file hand
1750: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  le is closed by 
1760: 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65  SQLite, the file
1770: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63   descriptor.** c
1780: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  annot be closed 
1790: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
17a0: 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73  these cases, ins
17b0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
17c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
17d0: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
17e0: 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
17f0: 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65  descriptor while
1800: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a   waiting for an.
1810: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
1820: 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f  o either close o
1830: 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73  r reuse it..*/.s
1840: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1850: 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  Fd {.  int fd;  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1880: 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  tor to close */.
1890: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18b0: 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64  lags this file d
18c0: 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70  escriptor was op
18d0: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55  ened with */.  U
18e0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
18f0: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
1900: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1910: 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20  criptor on same 
1920: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
1930: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
1940: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
1950: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
1960: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f  file specific to
1970: 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53   the unix.** VFS
1980: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1990: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
19a0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69  uct unixFile uni
19b0: 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e  xFile;.struct un
19c0: 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74  ixFile {.  sqlit
19d0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
19e0: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
19f0: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
1a00: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e  st entry */.  un
1a10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1a20: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1a30: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
1a40: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
1a50: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ode */.  int h; 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1a90: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  tor */.  int dir
1aa0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1ad0: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
1ae0: 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
1af0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
1b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b10: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
1b20: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1b30: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e  /.  int lastErrn
1b40: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1b60: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c  nix errno from l
1b70: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1b80: 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67  .  void *locking
1b90: 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20  Context;        
1ba0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e         /* Lockin
1bb0: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
1bc0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78   state */.  Unix
1bd0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1be0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1bf0: 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64  /* Pre-allocated
1c00: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f   UnixUnusedFd */
1c10: 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73  .  int fileFlags
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c30: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1c40: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1c60: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1c70: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1c90: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1cc0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1cd0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 53  rmation */.#if S
1ce0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1cf0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
1d00: 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20   openFlags;     
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70   /* The flags sp
1d30: 65 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28  ecified at open(
1d40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1d50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d60: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64  CKING_STYLE || d
1d70: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1d80: 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46  ).  unsigned fsF
1d90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1da0: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65          /* cache
1db0: 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73  d details from s
1dc0: 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69  tatfs() */.#endi
1dd0: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
1de0: 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b  .  int isDelete;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
1e10: 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
1e20: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  e */.  struct vx
1e30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1e40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1e50: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1e60: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e  #endif.#ifndef N
1e70: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e80: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e90: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1ea0: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1eb0: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1ec0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ed0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1ee0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1ef0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1f00: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1f10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1f20: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1f30: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1f40: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1f50: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1f60: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f70: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f90: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1fa0: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1fb0: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1fc0: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1fd0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1fe0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1ff0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2000: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2010: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
2020: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2030: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2040: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2050: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2060: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2070: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2080: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2090: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
20a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
20b0: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
20c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
20d0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
20e0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64  peration */.#end
20f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2100: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2110: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2120: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2130: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2140: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2150: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2160: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2170: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2180: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2190: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
21a0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
21b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
21c0: 77 69 6e 67 20 6d 61 63 72 6f 73 20 64 65 66 69  wing macros defi
21d0: 6e 65 20 62 69 74 73 20 69 6e 20 75 6e 69 78 46  ne bits in unixF
21e0: 69 6c 65 2e 66 69 6c 65 46 6c 61 67 73 0a 2a 2f  ile.fileFlags.*/
21f0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
2200: 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49  WHOLE_FILE_LOCKI
2210: 4e 47 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20  NG  0x0001   /* 
2220: 55 73 65 20 77 68 6f 6c 65 2d 66 69 6c 65 20 6c  Use whole-file l
2230: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2240: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2250: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
2260: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
2270: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
2280: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
2290: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
22a0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
22b0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
22c0: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
22d0: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
22e0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
22f0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2310: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2320: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2330: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2340: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2350: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
2360: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
2370: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
2380: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
2390: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c  The DJGPP compil
23c0: 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c  er environment l
23d0: 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65  ooks mostly like
23e0: 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a   Unix, but it.**
23f0: 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c   lacks the fcntl
2400: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
2410: 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e   So redefine fcn
2420: 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74  tl() to be somet
2430: 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77  hing.** that alw
2440: 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54  ays succeeds.  T
2450: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c  his means that l
2460: 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  ocking does not 
2470: 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44  occur under.** D
2480: 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73  JGPP.  But it is
2490: 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20   DOS - what did 
24a0: 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23  you expect?.*/.#
24b0: 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  ifdef __DJGPP__.
24c0: 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41  # define fcntl(A
24d0: 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,B,C) 0.#endif..
24e0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
24f0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2500: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2510: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
2520: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2530: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2540: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2550: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2560: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2570: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2580: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2590: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  adid 0.#endif...
25a0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
25b0: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
25c0: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
25d0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
25e0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
25f0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
2600: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
2610: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
2620: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
2630: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
2640: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
2650: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
2660: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
2670: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
2680: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
2690: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
26a0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
26b0: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
26c0: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
26d0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
26e0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
26f0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
2700: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
2710: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
2720: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
2730: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
2740: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
2750: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
2760: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
2770: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
2780: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
2790: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
27a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
27b0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
27c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
27d0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
27e0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
27f0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2800: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2810: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2820: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2830: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2840: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
2850: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2860: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
2870: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
2880: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
2890: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
28b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
28c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
28d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
28e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
28f0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
2900: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
2910: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
2920: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
2930: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
2940: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
2950: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
2960: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
2970: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
2980: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
2990: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
29a0: 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b  char *azFileLock
29b0: 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b  (int eFileLock){
29c0: 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65  .  switch( eFile
29d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
29e0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
29f0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
2a00: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2a10: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2a20: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
2a30: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
2a40: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
2a50: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
2a60: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
2a70: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
2a80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
2a90: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
2aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
2ab0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
2ac0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
2ad0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
2ae0: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
2af0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
2b00: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
2b10: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
2b20: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2b30: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
2b40: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
2b50: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
2b60: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
2b70: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
2b80: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
2b90: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
2ba0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2bb0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2bc0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
2bd0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
2be0: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
2bf0: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
2c00: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
2c10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
2c20: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
2c30: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
2c40: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
2c50: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
2c60: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
2c70: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
2c80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c90: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
2ca0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
2cb0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2cc0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2cd0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
2ce0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2cf0: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
2d00: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
2d10: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
2d20: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
2d30: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
2d40: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2d50: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
2d60: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2d70: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
2d80: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2d90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2da0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2db0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
2dc0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
2dd0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2de0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2df0: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
2e00: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
2e10: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2e20: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
2e30: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
2e40: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2e50: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
2e60: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
2e70: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
2e80: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
2e90: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
2ea0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
2eb0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
2ec0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
2ed0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
2ee0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
2ef0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
2f00: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2f10: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
2f20: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
2f30: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
2f40: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
2f50: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
2f60: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
2f70: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2f80: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
2f90: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2fa0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
2fb0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
2fc0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2fd0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2fe0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
2ff0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
3000: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3010: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
3020: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3030: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
3040: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
3050: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
3060: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
3070: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
3080: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
3090: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
30a0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
30b0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
30c0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
30d0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
30e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30f0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
3100: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
3110: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
3120: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
3130: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
3140: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
3150: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
3160: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
3170: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
3180: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
3190: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
31a0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
31b0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
31c0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
31d0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
31e0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
31f0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
3200: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
3210: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
3220: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
3230: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
3240: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
3250: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
3260: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
3270: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
3280: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
3290: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
32a0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
32b0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
32c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
32d0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
32e0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
32f0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
3300: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
3310: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
3320: 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  {.  case 0: .   
3330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3340: 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  K;.    .  case E
3350: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
3360: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
3370: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
3380: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
3390: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
33a0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
33b0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
33c0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
33d0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
33e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
33f0: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
3400: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3410: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
3420: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3430: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
3440: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
3450: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
3460: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
3470: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
3480: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
3490: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
34a0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
34b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
34c0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
34d0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
34e0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
34f0: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
3510: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
3520: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3530: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
3540: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
3550: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3560: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
3570: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
3580: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
3590: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
35a0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
35b0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41      .  case EDEA
35c0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
35d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
35e0: 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45  CKED;.    .#if E
35f0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
3600: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
3610: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
3620: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
3630: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
3640: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3650: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3660: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3670: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
3680: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
3690: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
36a0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
36b0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
36c0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
36d0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
36e0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
36f0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
3700: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3710: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
3720: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3730: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
3740: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
3750: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
3760: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
3770: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
3780: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
3790: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
37a0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73  se ENOENT:.  cas
37b0: 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65  e ESTALE:.  case
37c0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
37d0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
37e0: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
37f0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3800: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
3810: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
3820: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
3830: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
3840: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3890: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
38a0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
38b0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
38c0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
38d0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
38e0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
38f0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
3900: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
3910: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
3920: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
3930: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
3940: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
3950: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
3960: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
3970: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
3980: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
3990: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
39a0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
39b0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
39c0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
39d0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
39e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
39f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3a00: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
3a10: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
3a20: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
3a30: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
3a40: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
3a50: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3a60: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
3a70: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
3a80: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
3a90: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
3aa0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
3ab0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
3ac0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
3ad0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
3ae0: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
3af0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
3b00: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
3b10: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
3b20: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
3b30: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
3b40: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
3b50: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
3b60: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
3b70: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
3b80: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
3b90: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
3ba0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
3bb0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3bc0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
3bd0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
3be0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
3bf0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
3c00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3c30: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3c40: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
3c50: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
3c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3c70: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
3c80: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
3c90: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
3ca0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
3cb0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
3cc0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
3cd0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
3ce0: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
3cf0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
3d00: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
3d10: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
3d20: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
3d30: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
3d40: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3d50: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
3d60: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
3d70: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
3d80: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
3d90: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
3da0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
3db0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
3dc0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
3dd0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
3de0: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
3df0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
3e00: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
3e10: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
3e20: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
3e30: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
3e40: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
3e50: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3e60: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
3e70: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
3e80: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
3e90: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
3ea0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
3eb0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
3ec0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
3ed0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
3ee0: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
3f00: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
3f10: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
3f20: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3f30: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
3f40: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
3f50: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
3f60: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3f70: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3f80: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
3f90: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
3fa0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
3fb0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
3fc0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
3fd0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
3fe0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
3ff0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
4000: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
4010: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
4020: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
4030: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
4040: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
4050: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
4060: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
4070: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
4080: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
4090: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
40a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
40b0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
40c0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
40d0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
40e0: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
40f0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
4100: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
4110: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
4120: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
4130: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4140: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
4150: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
4160: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
4170: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
4180: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
4190: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
41a0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
41b0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
41c0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
41d0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
41e0: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
41f0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
4200: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
4210: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
4220: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
4230: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
4240: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4250: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4260: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
4270: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
4280: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
4290: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
42a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
42b0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
42c0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
42d0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
42e0: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
42f0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
4300: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
4310: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
4320: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
4330: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
4340: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
4350: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4380: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
4390: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
43a0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
43b0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
43c0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
43d0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
43e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
43f0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
4400: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
4410: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4420: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4430: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4440: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
4450: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
4460: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4470: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
4480: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
4490: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
44a0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
44b0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
44c0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
44d0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
44e0: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
44f0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
4500: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
4510: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
4520: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4530: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
4540: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
4550: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
4560: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
4570: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
4580: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
4590: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
45a0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
45b0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
45c0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
45d0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
45e0: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
45f0: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
4600: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
4610: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
4620: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
4630: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
4640: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
4650: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
4660: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
4670: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
4680: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
4690: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
46b0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
46c0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
46d0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
46e0: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
46f0: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
4700: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
4710: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
4720: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
4730: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
4740: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
4750: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
4760: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
4770: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
4780: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
4790: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
47a0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
47b0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
47c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
47d0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
47e0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
47f0: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
4800: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
4810: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
4820: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
4830: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
4840: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
4850: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
4860: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
4870: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
4880: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
4890: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
48a0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
48b0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
48c0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
48d0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
48e0: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
48f0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
4900: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4910: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
4920: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
4930: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
4940: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
4950: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4960: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
4970: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
4980: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
49f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
4a60: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
4a70: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a90: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
4aa0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
4ab0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
4ac0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
4ad0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
4ae0: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
4af0: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
4b00: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
4b10: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
4b20: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
4b30: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
4b40: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
4b50: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
4b60: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
4b70: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4b80: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
4b90: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
4ba0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
4bb0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
4bc0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
4bd0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4be0: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
4bf0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4c00: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
4c10: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
4c20: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
4c30: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
4c40: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
4c50: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
4c60: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4c70: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
4c80: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
4c90: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
4ca0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
4cb0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
4cc0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
4cd0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
4ce0: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
4cf0: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
4d00: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
4d10: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
4d20: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
4d30: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
4d40: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
4d50: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
4d60: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
4d70: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
4d80: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
4d90: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
4da0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
4db0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
4dc0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4dd0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
4de0: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
4df0: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
4e00: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
4e10: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
4e20: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
4e30: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
4e40: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
4e50: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
4e60: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
4e70: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
4e80: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
4e90: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
4ea0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
4eb0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
4ec0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
4ed0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
4ee0: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
4ef0: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
4f00: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
4f10: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
4f20: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
4f30: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
4f40: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
4f50: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
4f60: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
4f70: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
4f80: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4f90: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4fa0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
4fb0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
4fc0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
4fd0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
4fe0: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
4ff0: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
5000: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
5010: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
5020: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
5030: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
5040: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
5050: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
5060: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
5070: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
5080: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
5090: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
50a0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
50b0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
50c0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
50d0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
50e0: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
50f0: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
5100: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
5110: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
5120: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
5130: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
5140: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
5150: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
5160: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
5170: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
5180: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
5190: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
51a0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
51b0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
51c0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
51d0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
51e0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
51f0: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
5200: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
5210: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
5220: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
5230: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
5240: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
5250: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
5260: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
5270: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
5280: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
5290: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
52a0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
52b0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
52c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
52d0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
52e0: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
52f0: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
5300: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
5310: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
5320: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5330: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
5340: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
5350: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
5360: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
5370: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
5380: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
5390: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
53a0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
53b0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
53c0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
53d0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
53e0: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
53f0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5400: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
5410: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
5420: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
5430: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
5440: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
5450: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
5460: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
5470: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
5480: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
5490: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
54a0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
54b0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
54c0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
54d0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
54e0: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
54f0: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
5500: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
5510: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
5520: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
5530: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
5540: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
5550: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
5560: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
5570: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
5580: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
5590: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
55a0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
55b0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
55c0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
55d0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
55e0: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
55f0: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
5600: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
5610: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
5620: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
5630: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
5640: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
5650: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
5660: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
5670: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
5680: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
5690: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
56a0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
56b0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
56c0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
56d0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
56e0: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
56f0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5700: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
5710: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
5720: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
5730: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
5740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
5750: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
5760: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
5770: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
5780: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
5790: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
57a0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
57b0: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
57c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
57d0: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
57e0: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
57f0: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
5800: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5810: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
5820: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
5830: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
5840: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
5850: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
5860: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
5870: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
5880: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
5890: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
58a0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
58b0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
58c0: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
58d0: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
58e0: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
58f0: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
5900: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
5910: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
5920: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
5930: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
5940: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
5950: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
5960: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
5970: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
5980: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
5990: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
59a0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
59b0: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
59c0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
59d0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
59e0: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
59f0: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
5a00: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
5a10: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
5a20: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
5a30: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
5a40: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
5a50: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
5a60: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
5a70: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
5a80: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
5a90: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
5aa0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
5ab0: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
5ac0: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
5ad0: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
5ae0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
5af0: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
5b00: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
5b10: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
5b20: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
5b30: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
5b40: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
5b50: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
5b60: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
5b70: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
5b80: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
5b90: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
5ba0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
5bb0: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
5bc0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
5bd0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5be0: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
5bf0: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
5c00: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
5c10: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
5c20: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
5c30: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
5c40: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
5c50: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
5c60: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
5c70: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
5c80: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
5c90: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
5ca0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
5cb0: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
5cc0: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
5cd0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
5ce0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
5cf0: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
5d00: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
5d10: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
5d20: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
5d30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
5d40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
5d50: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
5d60: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
5d70: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
5d80: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
5d90: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
5da0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
5db0: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
5dc0: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
5dd0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
5de0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
5df0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
5e00: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
5e10: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
5e20: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
5e30: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
5e40: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e60: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
5e70: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5e80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5e90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
5ea0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
5eb0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
5ec0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
5ed0: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
5ee0: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
5ef0: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
5f00: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
5f10: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
5f20: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
5f30: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
5f40: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
5f50: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
5f60: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
5f70: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
5f80: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
5fa0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
5fb0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
5fc0: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
5fd0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
5fe0: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
5ff0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
6000: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
6010: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
6020: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
6030: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
6040: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
6050: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6080: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
6090: 64 20 2a 2f 0a 20 20 69 6e 74 20 65 46 69 6c 65  d */.  int eFile
60a0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
60b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
60c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
60d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
60e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6110: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
6120: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
6130: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
6140: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
6150: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
6160: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
6170: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
6180: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
61b0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
61c0: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
61d0: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
61e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
61f0: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
6200: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
6210: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
6220: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6230: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
6240: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
6250: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
6260: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
6270: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
6280: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
6290: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
62a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62b0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
62c0: 59 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65 64 20  YLE).  unsigned 
62d0: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
62e0: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
62f0: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
6300: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
6310: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
6320: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
6350: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
6360: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
6370: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
6380: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
6390: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
63a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
63b0: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
63c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
63d0: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
63e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
63f0: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
6400: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
6410: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
6420: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
6430: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
6440: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  pUnused list..**
6450: 20 49 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c   If all such fil
6460: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 72  e descriptors ar
6470: 65 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74  e closed without
6480: 20 65 72 72 6f 72 2c 20 74 68 65 20 6c 69 73 74   error, the list
6490: 20 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61   is.** cleared a
64a0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
64b0: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  urned..**.** Oth
64c0: 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
64d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
64e0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c   successfully cl
64f0: 6f 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  osed file descri
6500: 70 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ptor.** entries 
6510: 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  are removed from
6520: 20 74 68 65 20 6c 69 73 74 2c 20 61 6e 64 20 53   the list, and S
6530: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
6540: 45 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  E returned. .** 
6550: 6e 6f 74 20 64 65 6c 65 74 65 64 20 61 6e 64 20  not deleted and 
6560: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
6570: 53 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20  SE returned..*/ 
6580: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
6590: 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78  ePendingFds(unix
65a0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
65b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
65c0: 4f 4b 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  OK;.  unixInodeI
65d0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
65e0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
65f0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 45 72  nixUnusedFd *pEr
6600: 72 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  ror = 0;.  UnixU
6610: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
6620: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
6630: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
6640: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
6650: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
6660: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
6670: 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e     if( close(p->
6680: 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  fd) ){.      pFi
6690: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
66a0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
66b0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
66c0: 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70  LOSE;.      p->p
66d0: 4e 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20  Next = pError;. 
66e0: 20 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b       pError = p;
66f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6700: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6710: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
6720: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
6730: 20 70 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72   pError;.  retur
6740: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6750: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f  elease a unixIno
6760: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
6770: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
6780: 63 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f  cated by findIno
6790: 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20  deInfo()..**.** 
67a0: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
67b0: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
67c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
67d0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
67e0: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
67f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6800: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
6810: 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  id releaseInodeI
6820: 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nfo(unixFile *pF
6830: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
6840: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
6850: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
6860: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
6870: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
6880: 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ( pInode ){.    
6890: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
68a0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
68b0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
68c0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
68d0: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
68e0: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
68f0: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
6900: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
6910: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
6920: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
6930: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
6940: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
6950: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
6960: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
6970: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
6980: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
6990: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70  rt( inodeList==p
69a0: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
69b0: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
69c0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
69d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
69e0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  node->pNext ){. 
69f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6a00: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
6a10: 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  rev==pInode );. 
6a20: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
6a30: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  Next->pPrev = pI
6a40: 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20  node->pPrev;.   
6a50: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
6a60: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
6a70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
6a80: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
6a90: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
6aa0: 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ate the unixInod
6ab0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  eInfo object tha
6ac0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
6ad0: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
6ae0: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
6af0: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
6b00: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
6b10: 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20  urn value might 
6b20: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
6b30: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
6b40: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
6b50: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
6b60: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
6b70: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
6b80: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
6b90: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
6ba0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
6bb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
6bc0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
6bd0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
6be0: 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e   int findInodeIn
6bf0: 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  fo(.  unixFile *
6c00: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
6c10: 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c       /* Unix fil
6c20: 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63  e with file desc
6c30: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
6c40: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
6c50: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20  nfo **ppInode   
6c60: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
6c70: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
6c80: 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a   object here */.
6c90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
6cc0: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
6cd0: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
6d00: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
6d10: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
6d20: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
6d30: 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  d;      /* Looku
6d40: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
6d50: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20  ixInodeInfo */. 
6d60: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
6d70: 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  tbuf;           
6d80: 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
6d90: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
6da0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
6db0: 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20   *pInode = 0;   
6dc0: 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75    /* Candidate u
6dd0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
6de0: 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ect */..  assert
6df0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
6e00: 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c  ) );..  /* Get l
6e10: 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61  ow-level informa
6e20: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
6e30: 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20  ile that we can 
6e40: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  used to.  ** cre
6e50: 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d  ate a unique nam
6e60: 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  e for the file..
6e70: 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c    */.  fd = pFil
6e80: 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 66 73 74  e->h;.  rc = fst
6e90: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
6ea0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
6eb0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
6ec0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
6ed0: 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a  ifdef EOVERFLOW.
6ee0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
6ef0: 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  astErrno==EOVERF
6f00: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
6f10: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
6f20: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
6f30: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
6f40: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
6f50: 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e  .  /* On OS X on
6f60: 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79   an msdos filesy
6f70: 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20  stem, the inode 
6f80: 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74  number is report
6f90: 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63  ed.  ** incorrec
6fa0: 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a  tly for zero-siz
6fb0: 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69  e files.  See ti
6fc0: 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20  cket #3260.  To 
6fd0: 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64  work.  ** around
6fe0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77   this problem (w
6ff0: 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20  e consider it a 
7000: 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74  bug in OS X, not
7010: 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65   SQLite).  ** we
7020: 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65   always increase
7030: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74   the file size t
7040: 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61  o 1 by writing a
7050: 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a   single byte.  *
7060: 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73  * prior to acces
7070: 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e  sing the inode n
7080: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20  umber.  The one 
7090: 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a  byte written is.
70a0: 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53    ** an ASCII 'S
70b0: 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  ' character whic
70c0: 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74  h also happens t
70d0: 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62  o be the first b
70e0: 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  yte.  ** in the 
70f0: 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20  header of every 
7100: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
7110: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
7120: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  f there.  ** is 
7130: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
7140: 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68   such that anoth
7150: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c  er thread has al
7160: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a  ready populated.
7170: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70    ** the first p
7180: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
7190: 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69  ase, no damage i
71a0: 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  s done..  */.  i
71b0: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  f( statbuf.st_si
71c0: 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  ze==0 && (pFile-
71d0: 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
71e0: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
71f0: 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  OS)!=0 ){.    rc
7200: 20 3d 20 77 72 69 74 65 28 66 64 2c 20 22 53 22   = write(fd, "S"
7210: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
7220: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=1 ){.      pFi
7230: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
7240: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
7250: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
7260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
7270: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
7280: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
7290: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=0 ){.      pFi
72a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
72b0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
72c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
72d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
72e0: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  if..  memset(&fi
72f0: 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  leId, 0, sizeof(
7300: 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65  fileId));.  file
7310: 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  Id.dev = statbuf
7320: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
7330: 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64  VXWORKS.  fileId
7340: 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49  .pId = pFile->pI
7350: 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49  d;.#else.  fileI
7360: 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  d.ino = statbuf.
7370: 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  st_ino;.#endif. 
7380: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
7390: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
73a0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
73b0: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
73c0: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
73d0: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
73e0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
73f0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
7400: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
7410: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
7420: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
7430: 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20  of(*pInode) );. 
7440: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30     if( pInode==0
7450: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7460: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7470: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
7480: 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  pInode, 0, sizeo
7490: 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20  f(*pInode));.   
74a0: 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d   memcpy(&pInode-
74b0: 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64  >fileId, &fileId
74c0: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
74d0: 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  );.    pInode->n
74e0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e  Ref = 1;.    pIn
74f0: 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f  ode->pNext = ino
7500: 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f  deList;.    pIno
7510: 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  de->pPrev = 0;. 
7520: 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74     if( inodeList
7530: 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50   ) inodeList->pP
7540: 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  rev = pInode;.  
7550: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
7560: 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  node;.  }else{. 
7570: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b     pInode->nRef+
7580: 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64  +;.  }.  *ppInod
7590: 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65  e = pInode;.  re
75a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
75b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
75c0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
75d0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
75e0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
75f0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
7600: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
7610: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
7620: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
7630: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
7640: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
7650: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
7660: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
7670: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
7680: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
7690: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
76a0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
76b0: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
76c0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
76d0: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
76e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
76f0: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
7700: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
7710: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
7720: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
7730: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
7740: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
7750: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
7760: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
7770: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
7780: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
7790: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
77a0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
77b0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
77c0: 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
77d0: 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
77e0: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
77f0: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
7800: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
7810: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
7820: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
7830: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
7840: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
7850: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
7860: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
7870: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
7880: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
7890: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
78a0: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
78b0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
78c0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
78d0: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
78e0: 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73  eserved ){.    s
78f0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
7900: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
7910: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
7920: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
7930: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
7940: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
7950: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
7960: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
7970: 0a 20 20 20 20 69 66 20 28 2d 31 20 3d 3d 20 66  .    if (-1 == f
7980: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
7990: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20  _GETLK, &lock)) 
79a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
79b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
79c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
79d0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
79e0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
79f0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
7a00: 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
7a10: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
7a20: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
7a30: 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c   else if( lock.l
7a40: 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29  _type!=F_UNLCK )
7a50: 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  {.      reserved
7a60: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
7a70: 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78  #endif.  .  unix
7a80: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
7a90: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
7aa0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
7ab0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
7ac0: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
7ad0: 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
7ae0: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
7af0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7b00: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
7b10: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
7b20: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
7b30: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
7b40: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
7b50: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
7b60: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
7b70: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
7b80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
7b90: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
7ba0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
7bb0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
7bc0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
7bd0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
7be0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
7bf0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
7c00: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
7c10: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
7c20: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
7c30: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
7c40: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
7c50: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
7c60: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
7c70: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
7c80: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
7c90: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
7ca0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
7cb0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
7cc0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
7cd0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
7ce0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
7cf0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
7d00: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
7d10: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
7d20: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
7d30: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
7d40: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
7d50: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
7d60: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
7d70: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
7d80: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
7d90: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
7da0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
7db0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7dc0: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
7dd0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
7de0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
7df0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
7e00: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
7e10: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
7e20: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
7e30: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
7e40: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
7e50: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
7e60: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
7e70: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
7e80: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
7e90: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
7ea0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
7eb0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
7ec0: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
7ed0: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
7ee0: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
7ef0: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
7f00: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
7f10: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
7f20: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
7f30: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
7f40: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
7f50: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
7f60: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
7f70: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
7f80: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
7f90: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
7fa0: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
7fb0: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
7fc0: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
7fd0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
7fe0: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
7ff0: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
8000: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
8010: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
8020: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
8030: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
8040: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
8050: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
8060: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
8070: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
8080: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
8090: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
80a0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
80b0: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
80c0: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
80d0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
80e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
80f0: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
8100: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
8110: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
8120: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
8130: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
8140: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
8150: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
8160: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
8170: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
8180: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
8190: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
81a0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
81b0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
81c0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
81d0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
81e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
81f0: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
8200: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
8210: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
8220: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
8230: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
8240: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
8250: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
8260: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
8270: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
8280: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
8290: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
82a0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
82b0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
82c0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
82d0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
82e0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
82f0: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
8300: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
8310: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
8320: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
8330: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
8340: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
8350: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
8360: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
8370: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
8380: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
8390: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
83a0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
83b0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
83c0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
83d0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
83e0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
83f0: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
8400: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
8410: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
8420: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
8430: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
8440: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
8450: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
8460: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
8470: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
8480: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
8490: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
84a0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
84b0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
84c0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
84d0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
84e0: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
84f0: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
8500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
8510: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
8520: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
8530: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
8540: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
8550: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
8560: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
8570: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
8580: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
8590: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
85a0: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
85b0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
85c0: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
85d0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
85e0: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
85f0: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
8600: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
8610: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
8620: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
8630: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
8640: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
8650: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
8660: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
8670: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
8680: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
8690: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
86a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
86b0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
86c0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
86d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
86e0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
86f0: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
8700: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
8710: 20 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 74 45   s = 0;.  int tE
8720: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
8730: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
8740: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
8750: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
8760: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
8770: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
8780: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
8790: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
87a0: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
87b0: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
87c0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
87d0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
87e0: 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
87f0: 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
8800: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
8810: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
8820: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
8830: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
8840: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
8850: 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
8860: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
8870: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
8880: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
8890: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
88a0: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
88b0: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
88c0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
88d0: 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
88e0: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
88f0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
8900: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
8910: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
8920: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
8930: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
8940: 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
8950: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8960: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
8970: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
8980: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
8990: 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57  ect..  **  (1) W
89a0: 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
89b0: 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
89c0: 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
89d0: 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
89e0: 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
89f0: 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
8a00: 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
8a10: 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
8a20: 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
8a30: 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
8a40: 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
8a50: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
8a60: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
8a70: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
8a80: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
8a90: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
8aa0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
8ab0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
8ac0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
8ad0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
8ae0: 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
8af0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
8b00: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
8b10: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
8b20: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
8b30: 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
8b40: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
8b50: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
8b60: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
8b70: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
8b80: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
8b90: 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
8ba0: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
8bb0: 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
8bc0: 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
8bd0: 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
8be0: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
8bf0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
8c00: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
8c10: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
8c20: 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
8c30: 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
8c40: 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
8c50: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
8c60: 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
8c70: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
8c80: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
8c90: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  .  ){.    rc = S
8ca0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
8cb0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
8cc0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48   }..  /* If a SH
8cd0: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
8ce0: 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
8cf0: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
8d00: 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
8d10: 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
8d20: 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
8d30: 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
8d40: 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
8d50: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
8d60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
8d70: 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
8d80: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
8d90: 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64  && .      (pInod
8da0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
8db0: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
8dc0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
8dd0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
8de0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
8df0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
8e00: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
8e10: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
8e20: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
8e30: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
8e40: 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
8e50: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
8e60: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
8e70: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
8e80: 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
8e90: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
8ea0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
8eb0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44   }...  /* A PEND
8ec0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
8ed0: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
8ee0: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
8ef0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
8f00: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
8f10: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
8f20: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
8f30: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
8f40: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
8f50: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c  leased..  */.  l
8f60: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
8f70: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
8f80: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66  = SEEK_SET;.  if
8f90: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
8fa0: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
8fb0: 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
8fc0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
8fd0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
8fe0: 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
8ff0: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
9000: 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63  type = (eFileLoc
9010: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  k==SHARED_LOCK?F
9020: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
9030: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
9040: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
9050: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
9060: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
9070: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
9080: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
9090: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
90a0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
90b0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
90c0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
90d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
90e0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
90f0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
9100: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
9110: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
9120: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
9130: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
9140: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
9150: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
9160: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
9170: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
9180: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
9190: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
91a0: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
91b0: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
91c0: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
91d0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
91e0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
91f0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
9200: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
9210: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
9220: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
9230: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
9240: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
9250: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
9260: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
9270: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
9280: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
9290: 45 3b 0a 20 20 20 20 69 66 28 20 28 73 20 3d 20  E;.    if( (s = 
92a0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
92b0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29  F_SETLK, &lock))
92c0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
92d0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
92e0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
92f0: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
9300: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
9310: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9320: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
9330: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
9340: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
9350: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
9360: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
9370: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
9380: 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20  , &lock)!=0 ){. 
9390: 20 20 20 20 20 69 66 28 20 73 20 21 3d 20 2d 31       if( s != -1
93a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
93b0: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
93c0: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
93d0: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  mount */.       
93e0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
93f0: 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73   .        rc = s
9400: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9410: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9420: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
9430: 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20  LOCK); .        
9440: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
9450: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
9460: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9470: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
9480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9490: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
94a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
94b0: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
94c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
94d0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
94e0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
94f0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
9500: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
9510: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
9520: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
9530: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
9540: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
9550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
9560: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
9570: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
9580: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
9590: 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
95a0: 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
95b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
95c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
95d0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
95e0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
95f0: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
9600: 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
9610: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
9620: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
9630: 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  in this.    ** s
9640: 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
9650: 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
9660: 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
9670: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
9680: 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
9690: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
96a0: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
96b0: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
96c0: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
96d0: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
96e0: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
96f0: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
9700: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
9710: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
9720: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
9730: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
9740: 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f  leLock );.    lo
9750: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
9760: 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28  LCK;.    switch(
9770: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
9780: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
9790: 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  D_LOCK:.        
97a0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
97b0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
97c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
97d0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
97e0: 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  E_LOCK:.        
97f0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
9800: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
9810: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
9820: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
9830: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9840: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9850: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
9860: 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63      }.    s = fc
9870: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
9880: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
9890: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
98a0: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
98b0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
98c0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
98d0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
98e0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
98f0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
9900: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
9910: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
9920: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
9930: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
9940: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
9950: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
9960: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
9970: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
9980: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
9990: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
99a0: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
99b0: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
99c0: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
99d0: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
99e0: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
99f0: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
9a00: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
9a10: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
9a20: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
9a30: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
9a40: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
9a50: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
9a60: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
9a70: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
9a80: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
9a90: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
9aa0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
9ab0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
9ac0: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
9ad0: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
9ae0: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
9af0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
9b00: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
9b10: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
9b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
9b30: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
9b40: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
9b50: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
9b60: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
9b70: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
9b80: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
9b90: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
9ba0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
9bb0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
9bc0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
9bd0: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
9be0: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
9bf0: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
9c00: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
9c10: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
9c20: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
9c30: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
9c40: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
9c50: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
9c60: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
9c70: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
9c80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
9c90: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
9ca0: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
9cb0: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
9cc0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
9cd0: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
9ce0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
9cf0: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
9d00: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
9d10: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
9d20: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
9d30: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
9d40: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
9d50: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
9d60: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
9d70: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
9d80: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
9d90: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
9da0: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
9db0: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
9dc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
9dd0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
9de0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
9df0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
9e00: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
9e10: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
9e20: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
9e30: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
9e40: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
9e50: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
9e60: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
9e70: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
9e80: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
9e90: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
9ea0: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
9eb0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
9ec0: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
9ed0: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
9ee0: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
9ef0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
9f00: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
9f10: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
9f20: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
9f30: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
9f40: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
9f50: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
9f60: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
9f70: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
9f80: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
9f90: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
9fa0: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
9fb0: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
9fc0: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
9fd0: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
9fe0: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
9ff0: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
a000: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
a010: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
a020: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
a030: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
a040: 74 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73  t _posixUnlock(s
a050: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
a060: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20   int eFileLock, 
a070: 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  int handleNFSUnl
a080: 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ock){.  unixFile
a090: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
a0a0: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
a0b0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a0c0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
a0d0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
a0e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
a0f0: 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74 45 72 72  nt h;.  int tErr
a100: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
a110: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
a120: 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
a130: 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
a140: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  /..  assert( pFi
a150: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
a160: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
a170: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
a180: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
a190: 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
a1a0: 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65  ock,.      pFile
a1b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
a1c0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
a1d0: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
a1e0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
a1f0: 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
a200: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
a210: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
a220: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
a230: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
a240: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
a250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a260: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
a270: 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70  Mutex();.  h = p
a280: 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64  File->h;.  pInod
a290: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
a2a0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
a2b0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
a2c0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
a2d0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
a2e0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
a2f0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
a300: 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
a310: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
a320: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
a330: 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69  enign(1);.    Si
a340: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
a350: 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75  =(-1) ).    Simu
a360: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
a370: 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  n(0);..#ifndef N
a380: 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
a390: 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
a3a0: 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
a3b0: 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
a3c0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
a3d0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
a3e0: 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
a3f0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
a400: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
a410: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
a420: 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
a430: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
a440: 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
a450: 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
a460: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
a470: 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
a480: 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
a490: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
a4a0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
a4b0: 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
a4c0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
a4d0: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
a4e0: 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
a4f0: 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
a500: 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
a510: 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
a520: 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
a530: 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
a540: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
a550: 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a  n..    */.#if 0.
a560: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
a570: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
a580: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
a590: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
a5a0: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
a5b0: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
a5c0: 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66  hng==1 );.#endif
a5d0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
a5e0: 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
a5f0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f  endif..    /* do
a600: 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73  wngrading to a s
a610: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46  hared lock on NF
a620: 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72  S involves clear
a630: 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ing the write lo
a640: 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ck.    ** before
a650: 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68   establishing th
a660: 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20  e readlock - to 
a670: 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e  avoid a race con
a680: 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72  dition we downgr
a690: 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  ade.    ** the l
a6a0: 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c  ock in 2 blocks,
a6b0: 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66   so that part of
a6c0: 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20   the range will 
a6d0: 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  be covered by a 
a6e0: 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f  .    ** write lo
a6f0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73  ck until the res
a700: 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20  t is covered by 
a710: 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20  a read lock:.   
a720: 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57   **  1:   [WWWWW
a730: 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b  ].    **  2:   [
a740: 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33  ....W].    **  3
a750: 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20  :   [RRRRW].    
a760: 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d  **  4:   [RRRR.]
a770: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
a780: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
a790: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
a7a0: 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
a7b0: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  ock ){.        o
a7c0: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
a7d0: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
a7e0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
a7f0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
a800: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
a810: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
a820: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
a830: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a840: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
a850: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
a860: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
a870: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
a880: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
a890: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
a8a0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
a8b0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
a8c0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
a8d0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
a8e0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
a8f0: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
a900: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
a910: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
a920: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
a930: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
a940: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
a950: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
a960: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
a970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
a980: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
a990: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
a9a0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
a9b0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
a9c0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
a9d0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
a9e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
a9f0: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
aa00: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
aa10: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
aa20: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
aa30: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
aa40: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
aa50: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
aa60: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
aa70: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
aa80: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
aa90: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
aaa0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
aab0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
aac0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
aad0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
aae0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
aaf0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
ab00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
ab10: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
ab20: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
ab30: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
ab40: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
ab50: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
ab60: 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
ab70: 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
ab80: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
ab90: 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
aba0: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
abb0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
abc0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
abd0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
abe0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
abf0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ac00: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ac10: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ac20: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
ac30: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
ac40: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
ac50: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
ac60: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
ac70: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
ac80: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
ac90: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
aca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
acb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  se{.        lock
acc0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
acd0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
ace0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
acf0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
ad00: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ad10: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
ad20: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
ad30: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
ad40: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c      if( fcntl(h,
ad50: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ad60: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ad70: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
ad80: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
ad90: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
ada0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
adb0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
adc0: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
add0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ade0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
adf0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ae00: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ae10: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ae20: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ae30: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ae40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ae50: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
ae60: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
ae70: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
ae80: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
ae90: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
aea0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
aeb0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
aec0: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
aed0: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
aee0: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
aef0: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
af00: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
af10: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  -1) ){.      pIn
af20: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
af30: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
af40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
af50: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
af60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
af70: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
af80: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
af90: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
afa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
afb0: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
afc0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
afd0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
afe0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
aff0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
b000: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
b010: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
b020: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
b030: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
b040: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
b050: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
b060: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
b070: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
b080: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
b090: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
b0a0: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
b0b0: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
b0c0: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
b0d0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
b0e0: 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
b0f0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
b100: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
b110: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
b120: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
b130: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
b140: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
b150: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
b160: 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75  = 0L;.      Simu
b170: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
b180: 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
b190: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
b1a0: 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
b1b0: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
b1c0: 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
b1d0: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
b1e0: 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29  , &lock)!=(-1) )
b1f0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
b200: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
b210: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
b220: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72 72  se{.        tErr
b230: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
b240: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
b250: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
b260: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
b270: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
b280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
b290: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
b2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
b2b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b2c0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  Errno;.        }
b2d0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
b2e0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
b2f0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
b300: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
b310: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
b320: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
b330: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
b340: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
b350: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
b360: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
b370: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
b380: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
b390: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
b3a0: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
b3b0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
b3c0: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
b3d0: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
b3e0: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
b3f0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
b400: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
b410: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
b420: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
b430: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
b440: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
b450: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
b460: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
b470: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b480: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
b490: 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
b4a0: 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e    }.  }...end_un
b4b0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
b4c0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
b4d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
b4e0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
b4f0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
b500: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b510: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
b520: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
b530: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
b540: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
b550: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
b560: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b570: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
b580: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
b590: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
b5a0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
b5b0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
b5c0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
b5d0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
b5e0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
b5f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
b600: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
b610: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
b620: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
b630: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
b640: 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70  ck){.  return _p
b650: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
b660: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
b670: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b680: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
b690: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
b6a0: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
b6b0: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
b6c0: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
b6d0: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
b6e0: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
b6f0: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
b700: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
b710: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
b720: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
b730: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
b740: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
b750: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
b760: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
b770: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
b780: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
b790: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
b7a0: 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
b7b0: 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
b7c0: 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
b7d0: 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
b7e0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
b7f0: 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
b800: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
b810: 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
b820: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
b830: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
b840: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
b850: 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20    if( pFile ){. 
b860: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69     if( pFile->di
b870: 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rfd>=0 ){.      
b880: 69 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28  int err = close(
b890: 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20  pFile->dirfd);. 
b8a0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
b8b0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
b8c0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
b8d0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
b8e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
b8f0: 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d  R_CLOSE;.      }
b900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
b910: 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20  ile->dirfd=-1;. 
b920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b930: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
b940: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
b950: 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  r = close(pFile-
b960: 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  >h);.      if( e
b970: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  rr ){.        pF
b980: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
b990: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
b9a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
b9b0: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  ERR_CLOSE;.     
b9c0: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 4f 53 5f   }.    }.#if OS_
b9d0: 56 58 57 4f 52 4b 53 0a 20 20 20 20 69 66 28 20  VXWORKS.    if( 
b9e0: 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
b9f0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
ba00: 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  sDelete ){.     
ba10: 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d     unlink(pFile-
ba20: 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
ba30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
ba40: 20 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65       vxworksRele
ba50: 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
ba60: 3e 70 49 64 29 3b 0a 20 20 20 20 20 20 70 46 69  >pId);.      pFi
ba70: 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 20  le->pId = 0;.   
ba80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 4f 53   }.#endif.    OS
ba90: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20  TRACE(("CLOSE   
baa0: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
bab0: 68 29 29 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  h));.    OpenCou
bac0: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20 73 71  nter(-1);.    sq
bad0: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
bae0: 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20  ->pUnused);.    
baf0: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
bb00: 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
bb10: 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
bb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bb30: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
bb40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
bb50: 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74   unixClose(sqlit
bb60: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
bb70: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bb80: 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
bb90: 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
bba0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
bbb0: 2a 29 69 64 3b 0a 20 20 20 20 75 6e 69 78 55 6e  *)id;.    unixUn
bbc0: 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
bbd0: 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
bbe0: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
bbf0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26   pFile->pInode &
bc00: 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
bc10: 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  >nLock ){.      
bc20: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
bc30: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
bc40: 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
bc50: 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
bc60: 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e just.      ** 
bc70: 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
bc80: 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
bc90: 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
bca0: 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
bcb0: 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
bcc0: 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
bcd0: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
bce0: 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
bcf0: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
bd00: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
bd10: 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
bd20: 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
bd30: 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
bd40: 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
bd50: 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  }.    releaseIno
bd60: 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
bd70: 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
bd80: 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
bd90: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
bda0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bdb0: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
bdc0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
bdd0: 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
bde0: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
bdf0: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
be00: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
be10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bea0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
beb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bec0: 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
bed0: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
bee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bef0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
bf00: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
bf10: 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
bf20: 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
bf30: 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
bf40: 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
bf50: 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
bf60: 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
bf70: 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
bf80: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
bf90: 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
bfa0: 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
bfb0: 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
bfc0: 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
bfd0: 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
bfe0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
bff0: 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
c000: 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
c010: 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
c020: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
c030: 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
c040: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
c050: 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
c060: 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
c070: 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
c080: 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
c090: 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
c0a0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
c0b0: 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
c0c0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
c0d0: 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
c0e0: 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
c0f0: 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
c100: 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
c110: 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
c120: 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
c130: 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
c140: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
c150: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c160: 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
c170: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
c180: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
c190: 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
c1a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
c1b0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
c1c0: 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
c1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
c1e0: 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
c1f0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
c200: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
c210: 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
c220: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
c230: 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
c240: 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
c250: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
c260: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
c270: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c280: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
c290: 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
c2a0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
c2b0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
c2c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c2d0: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
c2e0: 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
c2f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
c300: 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
c310: 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
c320: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
c330: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
c340: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
c360: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
c370: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
c380: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
c390: 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
c3a0: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
c3b0: 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
c3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
c3d0: 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
c3e0: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
c3f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
c400: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
c410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c450: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
c460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4a0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4c0: 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
c4d0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
c4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4f0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
c500: 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
c510: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
c520: 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61   uses the exista
c530: 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
c540: 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e  lock.** files in
c550: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f   order to contro
c560: 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
c570: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
c580: 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a  works on just.**
c590: 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
c5a0: 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
c5b0: 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
c5c0: 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
c5d0: 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
c5e0: 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
c5f0: 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
c600: 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
c610: 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
c620: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
c630: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
c640: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
c650: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
c660: 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
c670: 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
c680: 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
c690: 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
c6a0: 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
c6b0: 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
c6c0: 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
c6d0: 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
c6e0: 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
c6f0: 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
c700: 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
c710: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
c720: 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
c730: 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
c740: 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
c750: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
c760: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
c770: 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
c780: 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73   a file in the s
c790: 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
c7a0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
c7b0: 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61   and with the sa
c7c0: 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68  me name but with
c7d0: 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e   a ".lock" exten
c7e0: 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54  sion added..** T
c7f0: 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
c800: 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c  a lock file impl
c810: 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
c820: 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
c830: 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20  r lock.** types 
c840: 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
c850: 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
c860: 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
c870: 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
c880: 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
c890: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
c8a0: 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
c8b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
c8c0: 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
c8d0: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
c8e0: 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20   DOTLOCK_SUFFIX 
c8f0: 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54  ".lock"../*.** T
c900: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
c910: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
c920: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
c930: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
c940: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
c950: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
c960: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
c970: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
c980: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
c990: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
c9a0: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
c9b0: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
c9c0: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
c9d0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
c9e0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
c9f0: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
ca00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
ca10: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
ca20: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74  ng..**.** In dot
ca30: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69  file locking, ei
ca40: 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73  ther a lock exis
ca50: 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f  ts or it does no
ca60: 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a  t.  So in this.*
ca70: 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43  * variation of C
ca80: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
ca90: 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20  (), *pResOut is 
caa0: 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  set to true if a
cab0: 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65  ny lock.** is he
cac0: 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61  ld on the file a
cad0: 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
cae0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
caf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cb00: 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
cb10: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
cb20: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
cb30: 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
cb40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cb50: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
cb60: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
cb70: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
cb80: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
cb90: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
cba0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
cbb0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
cbc0: 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
cbd0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
cbe0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
cbf0: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
cc00: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
cc10: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
cc20: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
cc30: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
cc40: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69     /* Either thi
cc50: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  s connection or 
cc60: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
cc70: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d  ction in the sam
cc80: 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  e process.    **
cc90: 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e   holds a lock on
cca0: 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e   the file.  No n
ccb0: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72  eed to check fur
ccc0: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73  ther. */.    res
ccd0: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  erved = 1;.  }el
cce0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c  se{.    /* The l
ccf0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61  ock is held if a
cd00: 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c  nd only if the l
cd10: 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a  ockfile exists *
cd20: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
cd30: 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
cd40: 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65  onst char*)pFile
cd50: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
cd60: 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  ;.    reserved =
cd70: 20 61 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c   access(zLockFil
cd80: 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
cd90: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
cda0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
cdb0: 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
cdc0: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
cdd0: 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
cde0: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
cdf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ce00: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
ce10: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
ce20: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
ce30: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
ce40: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
ce50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
ce60: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
ce70: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
ce80: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
ce90: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
cea0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
ceb0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
cec0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
ced0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
cee0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
cef0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
cf00: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
cf10: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
cf20: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
cf30: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
cf40: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
cf50: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
cf60: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
cf70: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
cf80: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
cf90: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
cfa0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
cfb0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
cfc0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
cfd0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
cfe0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
cff0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
d000: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
d010: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
d020: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
d030: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
d040: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
d050: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
d060: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
d070: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
d080: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
d090: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
d0a0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
d0b0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
d0c0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
d0d0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
d0e0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
d0f0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
d100: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
d110: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
d120: 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
d130: 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
d140: 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
d150: 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
d160: 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
d170: 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
d180: 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
d190: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
d1a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
d1b0: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
d1c0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
d1d0: 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
d1e0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
d1f0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
d200: 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a  int fd;.  char *
d210: 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
d220: 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
d230: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
d240: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d250: 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  ...  /* If we ha
d260: 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65  ve any lock, the
d270: 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  n the lock file 
d280: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
d290: 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   All we have.  *
d2a0: 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73  * to do is adjus
d2b0: 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72  t our internal r
d2c0: 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63  ecord of the loc
d2d0: 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20  k level..  */.  
d2e0: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d2f0: 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29  Lock > NO_LOCK )
d300: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
d310: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
d320: 63 6b 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f  ck;.#if !OS_VXWO
d330: 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79  RKS.    /* Alway
d340: 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d  s update the tim
d350: 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c  estamp on the ol
d360: 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74  d file */.    ut
d370: 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
d380: 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
d390: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d3a0: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
d3b0: 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
d3c0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d  e lock */.  fd =
d3d0: 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c   open(zLockFile,
d3e0: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54  O_RDONLY|O_CREAT
d3f0: 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20  |O_EXCL,0600);. 
d400: 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
d410: 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
d420: 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
d430: 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  le, someone else
d440: 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e   may have stolen
d450: 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
d460: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
d470: 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
d480: 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
d490: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
d4a0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
d4b0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
d4c0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d4d0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d4e0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d4f0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
d500: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
d510: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
d520: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
d530: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
d540: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
d550: 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69 66 28  n rc;.  } .  if(
d560: 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20 20   close(fd) ){.  
d570: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d580: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
d590: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
d5a0: 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20 0a  R_CLOSE;.  }.  .
d5b0: 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
d5c0: 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
d5d0: 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
d5e0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
d5f0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
d600: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d610: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
d620: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
d630: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
d640: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
d650: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
d660: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
d670: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
d680: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
d690: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d6a0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
d6b0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
d6c0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
d6d0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d6e0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
d6f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
d700: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
d710: 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
d720: 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
d730: 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
d740: 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
d750: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
d760: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
d770: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
d780: 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
d790: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d7a0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
d7b0: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
d7c0: 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
d7d0: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
d7e0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
d7f0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
d800: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
d810: 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
d820: 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
d830: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09  >h, eFileLock,..
d840: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
d850: 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
d860: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
d870: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
d880: 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
d890: 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
d8a0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
d8b0: 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
d8c0: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
d8d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
d8e0: 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72  ..  /* To downgr
d8f0: 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73  ade to shared, s
d900: 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72  imply update our
d910: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e   internal notion
d920: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63   of the.  ** loc
d930: 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65  k state.  No nee
d940: 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74  d to mess with t
d950: 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
d960: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
d970: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d980: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
d990: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
d9a0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  RED_LOCK;.    re
d9b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d9c0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66    }.  .  /* To f
d9d0: 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20  ully unlock the 
d9e0: 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65  database, delete
d9f0: 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a   the lock file *
da00: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  /.  assert( eFil
da10: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
da20: 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a  ;.  if( unlink(z
da30: 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20  LockFile) ){.   
da40: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20   int rc = 0;.   
da50: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
da60: 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  rno;.    if( ENO
da70: 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
da80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
da90: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
daa0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
dab0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
dac0: 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  K);.    }.    if
dad0: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
dae0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
daf0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
db00: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
db10: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
db20: 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
db30: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
db40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
db50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
db60: 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
db70: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
db80: 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
db90: 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
dba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
dbb0: 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
dbc0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
dbd0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
dbe0: 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
dbf0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
dc00: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64  xFile*)id;.    d
dc10: 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c  otlockUnlock(id,
dc20: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73   NO_LOCK);.    s
dc30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
dc40: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
dc50: 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  t);.  }.  rc = c
dc60: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
dc70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
dc80: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
dc90: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
dca0: 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
dcb0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
dcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcd0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
dce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
dd20: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd70: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
dd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
dd90: 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
dda0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
ddb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ddc0: 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
ddd0: 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
dde0: 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
ddf0: 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
de00: 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
de10: 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
de20: 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
de30: 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
de40: 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
de50: 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
de60: 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
de70: 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
de80: 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
de90: 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
dea0: 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
deb0: 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
dec0: 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
ded0: 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
dee0: 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
def0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
df00: 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
df10: 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
df20: 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
df30: 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
df40: 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
df50: 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
df60: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
df70: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
df80: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
df90: 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
dfa0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
dfb0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
dfc0: 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66  turned off or if
dfd0: 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  .** compiling fo
dfe0: 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69  r VXWORKS..*/.#i
dff0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e000: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
e010: 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a   !OS_VXWORKS../*
e020: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e030: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
e040: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
e050: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
e060: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
e070: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
e080: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
e090: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
e0a0: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
e0b0: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
e0c0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
e0d0: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
e0e0: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
e0f0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
e100: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
e110: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
e120: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
e130: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
e140: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
e150: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
e160: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
e170: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e180: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
e190: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e1a0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
e1b0: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
e1c0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
e1d0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
e1e0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
e1f0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
e200: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
e210: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
e220: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
e230: 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
e240: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
e250: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
e260: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
e270: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
e280: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
e290: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
e2a0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
e2b0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
e2c0: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
e2d0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
e2e0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
e2f0: 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
e300: 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
e310: 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
e320: 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63 6b 28 70  nt lrc = flock(p
e330: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
e340: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
e350: 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
e360: 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
e370: 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
e380: 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 66 6c 6f  .      lrc = flo
e390: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
e3a0: 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
e3b0: 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
e3c0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
e3d0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rrno;.        /*
e3e0: 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
e3f0: 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
e400: 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71          lrc = sq
e410: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
e420: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
e430: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
e440: 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20 20 69  OCK); .        i
e450: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e460: 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
e470: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e480: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
e490: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
e4a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e4b0: 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
e4c0: 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
e4d0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e4e0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
e4f0: 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
e500: 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
e510: 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
e520: 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
e530: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
e540: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
e550: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
e560: 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
e570: 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
e580: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
e590: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
e5a0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
e5b0: 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
e5c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
e5d0: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
e5e0: 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
e5f0: 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
e600: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
e610: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e620: 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
e630: 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
e640: 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
e650: 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
e660: 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
e670: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65  QLITE_OK;.    re
e680: 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65  served=1;.  }.#e
e690: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
e6a0: 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
e6b0: 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52  _ERRORS */.  *pR
e6c0: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
e6d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e6e0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
e6f0: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
e700: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
e710: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
e720: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
e730: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
e740: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
e750: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
e760: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
e770: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
e780: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
e790: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
e7a0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
e7b0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
e7c0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
e7d0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
e7e0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
e7f0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
e800: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
e810: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
e820: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
e830: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
e840: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
e850: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
e860: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
e870: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
e880: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
e890: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
e8a0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
e8b0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
e8c0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
e8d0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
e8e0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
e8f0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
e900: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
e910: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
e920: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
e930: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
e940: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
e950: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
e960: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
e970: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
e980: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
e990: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
e9a0: 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
e9b0: 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
e9c0: 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
e9d0: 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
e9e0: 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
e9f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
ea00: 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
ea10: 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
ea20: 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
ea30: 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
ea40: 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
ea50: 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
ea60: 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
ea70: 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
ea80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ea90: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
eaa0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
eab0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
eac0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
ead0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
eae0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
eaf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
eb00: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
eb10: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
eb20: 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
eb30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
eb40: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
eb50: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
eb60: 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
eb70: 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
eb80: 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
eb90: 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
eba0: 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
ebb0: 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
ebc0: 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
ebd0: 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
ebe0: 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
ebf0: 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
ec00: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
ec10: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
ec20: 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
ec30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
ec40: 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
ec50: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
ec60: 20 20 0a 20 20 69 66 20 28 66 6c 6f 63 6b 28 70    .  if (flock(p
ec70: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
ec80: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
ec90: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
eca0: 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
ecb0: 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
ecc0: 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
ecd0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
ece0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
ecf0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
ed00: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
ed10: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
ed20: 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
ed30: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
ed40: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  Errno;.    }.  }
ed50: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
ed60: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
ed70: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
ed80: 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
ed90: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
eda0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54  eLock;.  }.  OST
edb0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
edc0: 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c  d %s %s (flock)\
edd0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
ede0: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
edf0: 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ck), .          
ee00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
ee10: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
ee20: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
ee30: 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
ee40: 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
ee50: 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
ee60: 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
ee70: 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
ee80: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
ee90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
eea0: 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
eeb0: 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
eec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
eed0: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
eee0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
eef0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ef00: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
ef10: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
ef20: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
ef30: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
ef40: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
ef50: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
ef60: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
ef70: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
ef80: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
ef90: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
efa0: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
efb0: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
efc0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
efd0: 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
efe0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
eff0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
f000: 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
f010: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
f020: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
f030: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
f040: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
f050: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
f060: 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b  %d pid=%d (flock
f070: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
f080: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
f090: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
f0a0: 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
f0b0: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
f0c0: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
f0d0: 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
f0e0: 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
f0f0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
f100: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
f110: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
f120: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f130: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
f140: 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
f150: 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
f160: 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
f170: 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
f180: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
f190: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
f1a0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
f1b0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
f1c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f1d0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
f1e0: 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b  , really, unlock
f1f0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  . */.  int rc = 
f200: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
f210: 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28  LOCK_UN);.  if (
f220: 72 63 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 2c  rc) {.    int r,
f230: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
f240: 0a 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 45  .    r = sqliteE
f250: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f260: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f270: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
f280: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
f290: 5f 45 52 52 4f 52 28 72 29 20 29 7b 0a 20 20 20  _ERROR(r) ){.   
f2a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f2b0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
f2c0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
f2d0: 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
f2e0: 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 69  OCK_ERRORS.    i
f2f0: 66 28 20 28 72 20 26 20 53 51 4c 49 54 45 5f 49  f( (r & SQLITE_I
f300: 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
f310: 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 72  IOERR ){.      r
f320: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
f330: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
f340: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
f350: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
f360: 2a 2f 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75  */.    .    retu
f370: 72 6e 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn r;.  } else {
f380: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
f390: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
f3a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f3b0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
f3c0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
f3d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f3e0: 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  flockClose(sqlit
f3f0: 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
f400: 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66   if( id ){.    f
f410: 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
f420: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72  O_LOCK);.  }.  r
f430: 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
f440: 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64  ile(id);.}..#end
f450: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
f460: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
f470: 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20  E && !OS_VXWORK 
f480: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
f490: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
f4a0: 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69  the flock lock i
f4b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4d0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f520: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f570: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
f590: 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68  gin Named Semaph
f5a0: 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ore Locking ****
f5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5c0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64  ****.**.** Named
f5d0: 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
f5e0: 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f  ng is only suppo
f5f0: 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  rted on VxWorks.
f600: 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
f610: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
f620: 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c   dot-lock and fl
f630: 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72  ock in that it r
f640: 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75  eally only.** su
f650: 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45  pports EXCLUSIVE
f660: 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20   locking.  Only 
f670: 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
f680: 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69   can read or wri
f690: 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  te.** the databa
f6a0: 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d  se file at a tim
f6b0: 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  e.  This reduces
f6c0: 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75   potential concu
f6d0: 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d  rrency, but.** m
f6e0: 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d  akes the lock im
f6f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63  plementation muc
f700: 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66  h easier..*/.#if
f710: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a   OS_VXWORKS../*.
f720: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f730: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
f740: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
f750: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
f760: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
f770: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
f780: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
f790: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
f7a0: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
f7b0: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
f7c0: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
f7d0: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
f7e0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
f7f0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
f800: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
f810: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
f820: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
f830: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
f840: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
f850: 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65  c int semCheckRe
f860: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
f870: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f880: 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
f890: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f8a0: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
f8b0: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
f8c0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
f8d0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
f8e0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
f8f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f900: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
f910: 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
f920: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
f930: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
f940: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
f950: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
f960: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
f970: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
f980: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
f990: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
f9a0: 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
f9b0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
f9c0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
f9d0: 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
f9e0: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
f9f0: 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
fa00: 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
fa10: 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74  de->pSem;.    st
fa20: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75  ruct stat statBu
fa30: 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f  f;..    if( sem_
fa40: 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
fa50: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  1 ){.      int t
fa60: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
fa70: 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20       if( EAGAIN 
fa80: 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
fa90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
faa0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
fab0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
fac0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
fad0: 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
fae0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
faf0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
fb00: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
fb10: 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e         /* someon
fb20: 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c  e else has the l
fb30: 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20  ock when we are 
fb40: 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  in NO_LOCK */.  
fb50: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
fb60: 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
fb70: 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck < SHARED_LOCK
fb80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fb90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77  else{.      /* w
fba0: 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20  e could have it 
fbb0: 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f  if we want it */
fbc0: 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28  .      sem_post(
fbd0: 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSem);.    }.  }
fbe0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
fbf0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
fc00: 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
fc10: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
fc20: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
fc30: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
fc40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fc50: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
fc60: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
fc70: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
fc80: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
fc90: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
fca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
fcb0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
fcc0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
fcd0: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
fce0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
fcf0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
fd00: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
fd10: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
fd20: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
fd30: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
fd40: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
fd50: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
fd60: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
fd70: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
fd80: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
fd90: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
fda0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
fdb0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
fdc0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
fdd0: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
fde0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
fdf0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
fe00: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
fe10: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
fe20: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
fe30: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
fe40: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
fe50: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
fe60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
fe70: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
fe80: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
fe90: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
fea0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
feb0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
fec0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
fed0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
fee0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
fef0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
ff00: 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  E.**.** Semaphor
ff10: 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61  e locks only rea
ff20: 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
ff30: 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
ff40: 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
ff50: 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
ff60: 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
ff70: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
ff80: 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
ff90: 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
ffa0: 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
ffb0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
ffc0: 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
ffd0: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
ffe0: 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
fff0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
10000 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
10010 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
10020 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
10030 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
10040 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
10050 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
10060 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
10070 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74  nt semLock(sqlit
10080 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
10090 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
100a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
100b0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
100c0 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d  .  int fd;.  sem
100d0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
100e0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
100f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10100 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  E_OK;..  /* if w
10110 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
10120 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
10130 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
10140 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
10150 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
10160 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
10170 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
10180 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
10190 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
101a0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
101b0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
101c0 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  E_OK;.    goto s
101d0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
101e0 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65  .  .  /* lock se
101f0 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20  maphore now but 
10200 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c  bail out when al
10210 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f  ready locked. */
10220 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61  .  if( sem_trywa
10230 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
10240 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10250 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73  BUSY;.    goto s
10260 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
10270 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73  ..  /* got it, s
10280 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
10290 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
102a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
102b0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73  = eFileLock;.. s
102c0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72  em_end_lock:.  r
102d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
102e0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
102f0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
10300 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
10310 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
10320 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
10330 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
10340 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
10350 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
10360 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
10370 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
10380 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
10390 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
103a0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
103b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
103c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
103d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
103e0 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b  ic int semUnlock
103f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10400 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
10410 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
10420 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10430 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  e*)id;.  sem_t *
10440 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
10450 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61  node->pSem;..  a
10460 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
10470 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29    assert( pSem )
10480 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
10490 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
104a0 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c  %d pid=%d (sem)\
104b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
104c0 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69  ileLock,..   pFi
104d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
104e0 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
104f0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
10500 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
10510 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
10520 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
10530 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
10540 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
10550 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10560 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
10570 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
10580 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
10590 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
105a0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
105b0 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
105c0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
105d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
105e0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
105f0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
10600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10610 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20    /* no, really 
10620 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
10630 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29  ( sem_post(pSem)
10640 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
10650 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
10660 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rno;.    rc = sq
10670 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10680 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
106a0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
106b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
106c0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
106d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
106e0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
106f0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
10700 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10710 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
10720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10730 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
10740 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
10750 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28  ic int semClose(
10760 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10770 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
10780 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
10790 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
107a0 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f  )id;.    semUnlo
107b0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
107c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
107d0 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  le );.    unixEn
107e0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
107f0 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
10800 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69  (pFile);.    uni
10810 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
10820 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65     closeUnixFile
10830 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
10840 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10850 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
10860 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e  WORKS */./*.** N
10870 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
10880 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
10890 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f  vailable on VxWo
108a0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  rks..**.********
108b0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
108c0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
108d0 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  re lock implemen
108e0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
108f0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20  ***** Begin AFP 
109c0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
109f0 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65  AFP is the Apple
10a00 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c   Filing Protocol
10a10 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77  .  AFP is a netw
10a20 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66  ork filesystem f
10a30 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65  ound.** on Apple
10a40 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75   Macintosh compu
10a50 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20  ters - both OS9 
10a60 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54  and OSX..**.** T
10a70 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65  hird-party imple
10a80 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46  mentations of AF
10a90 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  P are available.
10aa0 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20    But this code 
10ab0 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72  here.** only wor
10ac0 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23  ks on OSX..*/..#
10ad0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
10ae0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
10af0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
10b00 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  TYLE./*.** The a
10b10 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
10b20 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
10b30 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
10b40 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
10b50 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
10b60 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
10b70 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ext afpLockingCo
10b80 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66  ntext;.struct af
10b90 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
10ba0 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  {.  int reserved
10bb0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10bc0 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
10bd0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
10be0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
10bf0 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
10c00 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
10c10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
10c20 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
10c30 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
10c40 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
10c50 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
10c60 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
10c70 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
10c80 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
10c90 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
10ca0 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
10cb0 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
10cc0 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
10cd0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
10ce0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
10cf0 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
10d00 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
10d10 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
10d20 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
10d30 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
10d40 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
10d50 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
10d60 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
10d70 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
10da0 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
10db0 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
10dc0 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
10dd0 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
10de0 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
10df0 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
10e00 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
10e10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
10e20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65  a utility for se
10e30 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e  tting or clearin
10e40 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f  g a bit-range lo
10e50 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20  ck on an.** AFP 
10e60 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a  filesystem..** .
10e70 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
10e80 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  _OK on success, 
10e90 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66  SQLITE_BUSY on f
10ea0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
10eb0 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b  c int afpSetLock
10ec0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
10ed0 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  path,           
10ee0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
10ef0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  e file to be loc
10f00 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20  ked or unlocked 
10f10 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
10f20 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
10f30 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
10f40 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70   descriptor on p
10f50 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ath */.  unsigne
10f60 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
10f70 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  et,     /* First
10f80 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
10f90 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
10fa0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
10fb0 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  h,     /* Number
10fc0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
10fd0 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f  k */.  int setLo
10fe0 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  ckFlag          
10ff0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
11000 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73   set lock.  Fals
11010 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20  e to clear lock 
11020 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42  */.){.  struct B
11030 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20  yteRangeLockPB2 
11040 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  pb;.  int err;. 
11050 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
11060 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
11070 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
11080 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
11090 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
110a0 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
110b0 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
110c0 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  b.fd = pFile->h;
110d0 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22  .  .  OSTRACE(("
110e0 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20  AFPSETLOCK [%s] 
110f0 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67  for %d%s in rang
11100 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20  e %llx:%llx\n", 
11110 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61  .    (setLockFla
11120 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70  g?"ON":"OFF"), p
11130 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d  File->h, (pb.fd=
11140 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d  =-1?"[testval-1]
11150 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65  ":""),.    offse
11160 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65  t, length));.  e
11170 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c  rr = fsctl(path,
11180 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
11190 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20  ock2FSCTL, &pb, 
111a0 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d  0);.  if ( err==
111b0 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
111c0 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  c;.    int tErrn
111d0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f  o = errno;.    O
111e0 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
111f0 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73  OCK failed to fs
11200 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73  ctl() '%s' %d %s
11210 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11220 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20    path, tErrno, 
11230 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29  strerror(tErrno)
11240 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
11250 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
11260 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20  K_ERRORS.    rc 
11270 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23  = SQLITE_BUSY;.#
11280 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71  else.    rc = sq
11290 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
112a0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a  ixError(tErrno,.
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20      setLockFlag 
112d0 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  ? SQLITE_IOERR_L
112e0 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  OCK : SQLITE_IOE
112f0 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64  RR_UNLOCK);.#end
11300 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
11310 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
11320 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ORS */.    if( I
11330 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
11340 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
11350 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11360 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
11370 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
11380 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
11390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
113a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
113b0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
113c0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
113d0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
113e0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
113f0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
11400 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
11410 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
11420 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
11430 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
11440 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
11450 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
11460 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
11470 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
11480 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
11490 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
114a0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
114b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
114c0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
114d0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68  static int afpCh
114e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
114f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11500 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
11510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11520 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
11530 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
11540 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11550 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11560 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11570 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
11580 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
11590 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
115a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
115b0 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67   );.  afpLocking
115c0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
115d0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
115e0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
115f0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11600 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
11610 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
11620 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
11630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11640 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
11650 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
11660 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
11670 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
11680 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
11690 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
116a0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
116b0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
116c0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
116d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
116e0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
116f0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11700 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
11710 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
11720 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
11730 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
11740 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
11750 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
11760 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
11770 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
11780 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
11790 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
117a0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
117b0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
117c0 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
117d0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
117e0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
117f0 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
11800 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
11810 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
11820 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
11830 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
11840 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
11850 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
11860 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
11870 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
11880 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
11890 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
118a0 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
118b0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
118c0 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
118d0 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
118e0 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
118f0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
11900 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
11910 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
11920 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
11930 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
11940 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
11950 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
11960 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
11970 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
11980 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
11990 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
119a0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
119b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
119c0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
119d0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
119e0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
119f0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
11a00 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
11a10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
11a20 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
11a30 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
11a40 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
11a50 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
11a60 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
11a70 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
11a80 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
11a90 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
11aa0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
11ab0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
11ac0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
11ad0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
11ae0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
11af0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
11b00 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
11b10 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
11b20 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
11b30 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
11b40 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
11b50 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
11b60 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
11b70 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
11b80 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
11b90 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
11ba0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
11bb0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
11bc0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
11bd0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
11be0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
11bf0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
11c00 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
11c10 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
11c20 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
11c30 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
11c40 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
11c50 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
11c60 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
11c70 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
11c80 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
11c90 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
11ca0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
11cb0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
11cc0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
11cd0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
11ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
11cf0 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
11d00 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
11d10 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
11d20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11d30 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11d40 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
11d50 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
11d60 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
11d70 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
11d80 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
11d90 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
11da0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
11db0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11dc0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
11dd0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
11de0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
11df0 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
11e00 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
11e10 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
11e20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
11e30 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
11e40 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
11e50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
11e60 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
11e70 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
11e80 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
11e90 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
11ea0 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
11eb0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
11ec0 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
11ed0 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
11ee0 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
11ef0 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
11f00 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
11f10 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
11f20 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
11f30 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
11f40 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
11f50 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
11f60 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
11f70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
11f80 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
11f90 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
11fa0 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
11fb0 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70  ready held) (afp
11fc0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
11fd0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
11fe0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
11ff0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
12000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
12010 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
12020 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
12030 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
12040 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
12050 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
12060 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
12070 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
12080 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
12090 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
120a0 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
120b0 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
120c0 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
120d0 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
120e0 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
120f0 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
12100 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
12110 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12120 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
12130 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
12140 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
12150 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
12160 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
12170 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
12180 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
12190 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
121a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
121b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
121c0 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
121d0 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
121e0 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
121f0 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
12200 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
12210 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
12220 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
12230 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
12240 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
12250 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
12260 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
12270 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
12280 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
12290 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
122a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
122b0 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
122c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
122d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
122e0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
122f0 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
12300 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
12310 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
12320 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
12330 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
12340 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12350 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
12360 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
12370 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
12380 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
12390 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
123a0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
123b0 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
123c0 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
123d0 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
123e0 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
123f0 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
12400 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
12410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
12420 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
12430 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
12440 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
12450 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
12460 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
12470 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
12480 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
12490 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
124a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
124b0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
124c0 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
124d0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
124e0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
124f0 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
12500 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12510 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
12520 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
12530 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
12540 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
12550 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
12560 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
12570 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
12580 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
12590 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
125a0 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
125b0 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
125c0 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
125d0 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
125e0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
125f0 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
12600 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
12610 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
12620 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
12630 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
12640 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
12650 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
12660 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
12670 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
12680 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
12690 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
126a0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
126b0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
126c0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
126d0 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
126e0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
126f0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
12700 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
12710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
12720 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
12730 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
12740 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
12750 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
12760 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
12770 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
12780 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
12790 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
127a0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
127b0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
127c0 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
127d0 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e  c1Errno;.    lon
127e0 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20  g lk, mask;.    
127f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
12800 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
12810 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12820 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
12830 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a  ==0 );.        .
12840 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65      mask = (size
12850 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c  of(long)==8) ? L
12860 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30  ARGEST_INT64 : 0
12870 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f  x7fffffff;.    /
12880 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
12890 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c  ad-lock SHARED_L
128a0 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f  OCK */.    /* no
128b0 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c  te that the qual
128c0 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f  ity of the rando
128d0 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61  mness doesn't ma
128e0 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a  tter that much *
128f0 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f  /.    lk = rando
12900 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65  m(); .    pInode
12910 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28  ->sharedByte = (
12920 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52  lk & mask)%(SHAR
12930 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
12940 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c    lrc1 = afpSetL
12950 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
12960 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
12970 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
12980 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
12990 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  edByte, 1, 1);. 
129a0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
129b0 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20  RROR(lrc1) ){.  
129c0 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20      lrc1Errno = 
129d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
129e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
129f0 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
12a00 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
12a10 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70  /.    lrc2 = afp
12a20 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
12a30 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
12a40 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
12a50 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66   0);.    .    if
12a60 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12a70 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20  lrc1) ) {.      
12a80 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12a90 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20   = lrc1Errno;.  
12aa0 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
12ab0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
12ac0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
12ad0 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
12ae0 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
12af0 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
12b00 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
12b10 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
12b20 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
12b30 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
12b40 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
12b50 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
12b60 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12b70 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
12b80 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
12b90 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
12ba0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
12bb0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
12bc0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
12bd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
12be0 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
12bf0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
12c00 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
12c10 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
12c20 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
12c30 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
12c40 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
12c50 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
12c60 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
12c70 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
12c80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
12c90 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
12ca0 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
12cb0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
12cc0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
12cd0 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
12ce0 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
12cf0 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
12d00 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
12d10 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
12d20 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
12d30 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
12d40 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
12d50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12d60 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c   );.    if (eFil
12d70 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45  eLock >= RESERVE
12d80 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
12d90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53  >eFileLock < RES
12da0 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
12db0 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
12dc0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
12de0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
12df0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
12e00 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
12e10 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
12e20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29     if( !failed )
12e30 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  {.        contex
12e40 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b  t->reserved = 1;
12e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12e60 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
12e70 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45  & eFileLock == E
12e80 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
12e90 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
12ea0 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
12eb0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
12ec0 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
12ed0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
12ee0 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
12ef0 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
12f00 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
12f10 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
12f20 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
12f30 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
12f40 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20  e  afpUnlock.   
12f50 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
12f60 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65  !(failed = afpSe
12f70 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12f80 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
12f90 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68        pInode->sh
12fc0 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
12fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
12fe0 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
12ff0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
13000 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
13010 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
13020 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
13030 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
13040 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13050 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13060 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
13070 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
130a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
130b0 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
130c0 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
130d0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
130e0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13100 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49  HARED_FIRST + pI
13110 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
13120 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
13130 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
13140 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
13150 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
13160 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
13170 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
13180 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
13190 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
131a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
131b0 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
131c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
131d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
131e0 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
131f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13200 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
13210 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
13220 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
13230 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
13240 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13250 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
13260 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13270 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
13280 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
13290 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
132a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
132b0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
132c0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
132d0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
132e0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
132f0 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
13300 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
13310 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
13320 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13330 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
13340 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
13350 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
13360 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
13370 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
13380 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
13390 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
133a0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
133b0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
133c0 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
133d0 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
133e0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
133f0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
13400 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
13410 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
13420 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
13430 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
13440 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
13450 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
13460 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
13470 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
13480 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
13490 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
134a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
134b0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
134c0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
134d0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
134e0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
134f0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
13500 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
13510 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
13520 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
13530 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13540 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13550 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13560 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
13570 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13580 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
13590 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
135a0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
135b0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
135c0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
135d0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
135e0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
135f0 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
13600 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
13610 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
13620 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
13630 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
13640 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
13650 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
13660 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
13670 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
13680 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
13690 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
136a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
136b0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
136c0 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
136d0 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
136e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74  ,.           get
136f0 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
13700 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
13710 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
13720 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13730 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
13740 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
13760 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
13770 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
13780 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
13790 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
137a0 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
137b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
137c0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
137d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
137e0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
137f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13800 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65   );.    Simulate
13810 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
13820 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
13830 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
13840 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
13850 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
13860 20 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55    .#ifndef NDEBU
13870 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
13880 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
13890 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
138a0 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
138b0 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
138c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
138d0 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
138e0 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
138f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13900 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
13910 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
13920 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
13930 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
13940 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
13950 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
13960 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
13970 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
13980 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
13990 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
139a0 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
139b0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
139c0 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
139d0 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
139e0 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
139f0 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
13a00 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
13a10 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
13a20 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
13a30 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
13a40 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
13a50 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
13a60 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
13a70 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
13a80 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
13a90 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
13aa0 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
13ab0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
13ac0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
13ad0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
13ae0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13af0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
13b00 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
13b10 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
13b20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
13b30 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
13b40 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
13b50 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
13b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13b70 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
13b80 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
13b90 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
13ba0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
13bb0 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
13bc0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
13bd0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
13be0 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
13bf0 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
13c00 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
13c10 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
13c20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
13c30 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
13c40 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
13c50 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
13c60 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
13c70 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
13c80 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
13c90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13ca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13cb0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
13cc0 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
13cd0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13ce0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13cf0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13d00 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
13d10 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
13d20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13d30 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
13d40 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
13d50 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
13d60 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
13d70 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
13d80 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
13d90 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
13da0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
13db0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
13dc0 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
13dd0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
13de0 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
13df0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
13e00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
13e10 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
13e20 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
13e30 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
13e40 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
13e50 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
13e60 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
13e70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13e80 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
13e90 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
13ea0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
13eb0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
13ec0 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
13ed0 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
13ee0 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
13ef0 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
13f00 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
13f10 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
13f20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
13f30 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
13f40 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
13f50 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
13f60 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
13f70 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
13f80 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
13f90 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
13fa0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
13fb0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
13fc0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
13fd0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
13fe0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
13ff0 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
14000 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
14010 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
14020 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
14030 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
14040 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
14050 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14060 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
14070 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
14080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14090 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
140a0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
140b0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
140c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
140d0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
140e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
140f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
14110 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
14120 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
14130 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
14140 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
14150 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
14160 20 20 20 20 20 20 20 72 63 20 3d 20 63 6c 6f 73         rc = clos
14170 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
14180 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
14190 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
141a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
141b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
141c0 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
141d0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
141e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
141f0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
14200 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46  ile & cleanup AF
14210 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  P specific locki
14220 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73  ng context .*/.s
14230 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f  tatic int afpClo
14240 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
14250 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
14260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14270 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
14280 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14290 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
142a0 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20    afpUnlock(id, 
142b0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e  NO_LOCK);.    un
142c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
142d0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
142e0 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e  Inode && pFile->
142f0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
14300 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
14310 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
14320 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
14330 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
14340 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
14350 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
14360 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
14370 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
14380 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
14390 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
143a0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
143b0 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e  Inode->aPending.
143c0 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
143d0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
143e0 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  d when.      ** 
143f0 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
14400 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
14410 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64  */.      setPend
14420 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
14430 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49    }.    releaseI
14440 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
14450 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14460 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
14470 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63  Context);.    rc
14480 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
14490 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  (id);.    unixLe
144a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
144b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
144c0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
144d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
144e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
144f0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
14500 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
14510 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
14520 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
14530 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
14540 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
14550 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
14560 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
14570 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
14580 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
14590 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
145a0 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
145b0 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
145c0 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
145d0 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
145e0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
145f0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
14600 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
14610 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
14620 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14690 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
146a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
146f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14700 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
14710 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
14720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14730 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
14740 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
14750 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
14760 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
14770 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
14780 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
14790 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
147a0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
147b0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
147c0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
147d0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
147e0 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
147f0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
14800 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
14810 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
14820 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
14830 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
14840 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
14850 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
14860 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
14870 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
14880 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
14890 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
148a0 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
148b0 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64   _posixUnlock(id
148c0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
148d0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
148e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
148f0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
14900 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
14910 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
14920 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
14930 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
14940 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
14950 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
14960 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
14970 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
14980 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
14990 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
149a0 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
149b0 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
149c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149d0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
149e0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
149f0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
14a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
14a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
14ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
14ac0 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
14ad0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
14ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
14b00 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
14b10 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
14b20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
14b30 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
14b40 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
14b50 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
14b60 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
14b70 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
14b80 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
14b90 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
14ba0 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
14bb0 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
14bc0 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
14bd0 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
14be0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
14bf0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
14c00 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
14c10 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
14c20 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
14c30 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
14c40 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
14c50 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
14c60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14c70 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
14c80 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
14c90 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
14ca0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
14cb0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
14cc0 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
14cd0 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
14ce0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
14cf0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
14d00 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
14d10 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
14d20 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
14d30 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
14d40 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
14d50 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
14d60 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
14d70 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
14d80 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
14d90 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20  ** any any form 
14da0 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
14db0 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
14dc0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
14dd0 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
14de0 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
14df0 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
14e00 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
14e10 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
14e20 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
14e30 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
14e40 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
14e50 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
14e60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14e70 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
14e80 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
14e90 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
14ea0 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
14eb0 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
14ec0 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
14ed0 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
14ee0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
14ef0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
14f00 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
14f10 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
14f20 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
14f30 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28  ).  got = pread(
14f40 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
14f50 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d  , offset);.  Sim
14f60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
14f70 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
14f80 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
14f90 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  D64).  got = pre
14fa0 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
14fb0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
14fc0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14fd0 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
14fe0 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
14ff0 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
15000 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
15010 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
15020 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
15030 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  - );.  if( newOf
15040 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
15050 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
15060 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
15070 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
15080 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
15090 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rno;.    }else{.
150a0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
150b0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
150c0 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20   = 0;....    }. 
150d0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
150e0 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
150f0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
15100 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
15110 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
15120 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
15130 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
15140 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
15150 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
15160 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
15170 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
15180 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
15190 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
151a0 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
151b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
151c0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
151d0 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
151e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
151f0 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
15200 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
15210 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
15220 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
15230 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
15240 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15250 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
15260 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
15270 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
15280 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
15290 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
152a0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
152b0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
152c0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f  e *)id;.  int go
152d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
152e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
152f0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
15300 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
15310 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
15320 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
15330 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
15340 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
15350 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
15360 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
15370 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
15380 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
15390 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
153a0 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
153b0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
153c0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
153d0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
153e0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
153f0 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
15400 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
15410 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
15420 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
15430 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15440 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
15450 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
15460 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
15470 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
15480 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
15490 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
154a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
154b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
154c0 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
154d0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
154e0 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
154f0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
15500 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
15510 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
15520 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
15530 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
15540 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15550 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
15560 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
15570 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
15580 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
15590 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
155a0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
155b0 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
155c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
155d0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
155e0 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
155f0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
15600 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
15610 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
15620 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
15630 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
15640 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
15650 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
15660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
15670 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
15680 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
15690 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
156a0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
156b0 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28    int got;.#if (
156c0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
156d0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
156e0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
156f0 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
15700 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
15710 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
15720 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f  (USE_PREAD).  go
15730 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68  t = pwrite(id->h
15740 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
15750 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  set);.#elif defi
15760 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
15770 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36  .  got = pwrite6
15780 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
15790 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
157a0 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  se.  newOffset =
157b0 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
157c0 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
157d0 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
157e0 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
157f0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
15800 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
15810 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
15820 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
15830 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15840 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
15850 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
15860 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
15870 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
15880 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d 3e  got = write(id->
15890 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
158a0 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
158b0 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
158c0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
158d0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
158e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20   = errno;.  }.. 
158f0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
15900 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
15910 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68  d %llu\n", id->h
15920 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54  , got, offset, T
15930 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
15940 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
15950 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
15960 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
15970 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
15980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
15990 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
159a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
159b0 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
159c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
159d0 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
159e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
159f0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
15a00 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
15a10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
15a20 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
15a30 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15a40 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15a50 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
15a60 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
15a70 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
15a80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
15a90 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
15aa0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
15ab0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
15ac0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
15ad0 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
15ae0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
15af0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
15b00 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
15b10 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
15b20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
15b30 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
15b40 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
15b50 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
15b60 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
15b70 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
15b80 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
15b90 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
15ba0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
15bb0 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
15bc0 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
15bd0 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
15be0 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  d to.  ** doing 
15bf0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15c00 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
15c10 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
15c20 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a  ther than a.  **
15c30 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
15c40 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f   file) then reco
15c50 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
15c60 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
15c70 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ** has changed. 
15c80 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
15c90 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d  ion counter is m
15ca0 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20  odified, record 
15cb0 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74  that.  ** fact t
15cc0 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  oo..  */.  if( p
15cd0 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
15ce0 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ite ){.    pFile
15cf0 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20  ->dbUpdate = 1; 
15d00 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
15d10 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
15d20 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  ed */.    if( of
15d30 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73  fset<=24 && offs
15d40 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20  et+amt>=27 ){.  
15d50 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
15d60 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34    char oldCntr[4
15d70 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ];.      Simulat
15d80 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
15d90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
15da0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
15db0 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29   24, oldCntr, 4)
15dc0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
15dd0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
15de0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15df0 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43  4 || memcmp(oldC
15e00 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42  ntr, &((char*)pB
15e10 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20  uf)[24-offset], 
15e20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)!=0 ){.       
15e30 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
15e40 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54  rChng = 1;  /* T
15e50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
15e60 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67  ounter has chang
15e70 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ed */.      }.  
15e80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
15e90 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
15ea0 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
15eb0 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
15ec0 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
15ed0 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
15ee0 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
15ef0 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
15f00 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
15f10 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
15f20 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
15f30 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
15f40 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
15f50 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
15f60 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
15f70 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66  , amt=1 ));.  if
15f80 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
15f90 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20  f( wrote<0 ){.  
15fa0 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
15fb0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
15fc0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
15fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15fe0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
15ff0 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
16000 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
16010 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
16020 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
16030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
16040 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
16050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16060 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
16070 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
16080 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
16090 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
160a0 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
160b0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
160c0 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
160d0 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
160e0 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
160f0 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
16100 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16110 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
16120 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
16130 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
16140 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
16150 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
16160 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
16170 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
16180 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
16190 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
161a0 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
161b0 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
161c0 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20  th the (slower) 
161d0 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79  fsync()..** If y
161e0 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
161f0 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
16200 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
16210 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
16220 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
16230 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
16240 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
16250 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
16260 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 64 65  datasync) && !de
16270 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
16280 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
16290 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
162a0 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
162b0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
162c0 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
162d0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
162e0 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
162f0 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
16300 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
16310 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
16320 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
16330 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
16340 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
16350 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
16360 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
16370 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
16380 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
16390 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
163a0 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
163b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
163c0 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
163d0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
163e0 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
163f0 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
16400 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
16410 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
16420 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
16430 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
16440 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
16450 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
16460 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
16470 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
16480 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
16490 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
164a0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
164b0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
164c0 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
164d0 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
164e0 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
164f0 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
16500 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
16510 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
16520 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
16530 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16540 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
16550 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
16560 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
16570 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
16580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
16590 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
165a0 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
165b0 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
165c0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
165d0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
165e0 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
165f0 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
16600 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
16610 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
16620 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
16630 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
16640 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
16650 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
16660 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
16670 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
16680 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
16690 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
166a0 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
166b0 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
166c0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
166d0 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
166e0 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
166f0 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
16700 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
16710 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
16720 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
16730 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
16740 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
16750 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
16760 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
16770 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
16780 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
16790 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
167a0 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
167b0 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
167c0 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
167d0 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
167e0 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
167f0 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
16800 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
16810 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
16820 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
16830 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
16840 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
16850 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
16860 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
16870 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
16880 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
16890 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
168a0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
168b0 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
168c0 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
168d0 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
168e0 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
168f0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
16900 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
16910 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
16920 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
16930 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
16940 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
16950 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
16960 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
16970 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
16980 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
16990 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
169a0 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
169b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
169c0 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
169d0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
169e0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
169f0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
16a00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
16a10 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
16a20 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
16a30 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
16a40 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
16a50 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
16a60 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
16a70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16a80 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
16a90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
16aa0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
16ab0 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
16ac0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
16ad0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
16ae0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
16af0 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
16b00 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
16b10 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
16b20 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
16b30 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
16b40 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
16b50 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
16b60 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
16b70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16b80 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
16b90 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
16ba0 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
16bb0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
16bc0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
16bd0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
16be0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
16bf0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
16c00 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
16c10 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
16c20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16c30 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
16c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
16c50 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
16c60 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
16c70 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c  {.    rc = fcntl
16c80 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
16c90 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
16ca0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
16cb0 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
16cc0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
16cd0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
16ce0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
16cf0 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
16d00 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
16d10 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
16d20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
16d30 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
16d40 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
16d50 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
16d60 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
16d70 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
16d80 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
16d90 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
16da0 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
16db0 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
16dc0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
16dd0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
16de0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
16df0 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
16e00 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
16e10 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
16e20 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
16e30 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
16e40 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
16e50 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
16e60 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
16e70 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
16e80 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
16e90 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
16ea0 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
16eb0 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
16ec0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
16ed0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
16ee0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
16ef0 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
16f00 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
16f10 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
16f20 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
16f30 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
16f40 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
16f50 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
16f60 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
16f70 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
16f80 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
16f90 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
16fa0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
16fb0 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
16fc0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
16fd0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
16fe0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
16ff0 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
17000 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
17010 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
17020 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
17030 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
17040 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17050 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
17060 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
17070 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
17080 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
17090 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
170a0 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
170b0 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
170c0 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
170d0 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
170e0 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
170f0 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
17100 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
17110 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
17120 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
17130 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
17140 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
17150 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
17160 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
17170 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
17180 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
17190 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
171a0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
171b0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
171c0 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
171d0 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
171e0 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
171f0 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
17200 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
17210 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
17220 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
17230 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
17240 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
17250 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
17260 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
17270 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
17280 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
17290 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
172a0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
172b0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
172c0 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
172d0 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
172e0 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
172f0 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
17300 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
17310 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
17320 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
17330 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
17340 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17350 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
17360 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
17370 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17380 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
17390 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
173a0 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
173b0 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
173c0 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
173d0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
173e0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
173f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
17400 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
17410 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
17420 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
17430 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
17440 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
17450 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
17460 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
17470 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
17480 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
17490 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
174a0 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
174b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
174c0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
174d0 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
174e0 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
174f0 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
17500 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
17510 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
17520 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
17530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
17540 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
17550 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
17560 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
17570 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
17580 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
17590 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
175a0 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
175b0 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
175c0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
175d0 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
175e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
175f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
17600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17610 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d  IOERR_FSYNC;.  }
17620 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
17630 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  rfd>=0 ){.    in
17640 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52 41  t err;.    OSTRA
17650 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE(("DIRSYNC %-3
17660 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  d (have_fullfsyn
17670 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
17680 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72  )\n", pFile->dir
17690 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
176a0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
176b0 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69  isFullsync));.#i
176c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
176d0 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20  ABLE_DIRSYNC.   
176e0 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72   /* The director
176f0 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61  y sync is only a
17700 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c  ttempted if full
17710 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a  _fsync is.    **
17720 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75   turned off or u
17730 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20  navailable.  If 
17740 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63  a full_fsync occ
17750 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20  urred above,.   
17760 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72   ** then the dir
17770 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73  ectory sync is s
17780 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20  uperfluous..    
17790 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41 56  */.    if( (!HAV
177a0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21  E_FULLFSYNC || !
177b0 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66  isFullsync) && f
177c0 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
177d0 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20  >dirfd,0,0) ){. 
177e0 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
177f0 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69  ** We have recei
17800 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70  ved multiple rep
17810 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20  orts of fsync() 
17820 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  returning.      
17830 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20   ** errors when 
17840 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63  applied to direc
17850 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69  tories on certai
17860 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a  n file systems..
17870 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c         ** A fail
17880 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  ed directory syn
17890 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64  c is not a big d
178a0 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d  eal.  So it seem
178b0 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74  s.       ** bett
178c0 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  er to ignore the
178d0 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20   error.  Ticket 
178e0 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a  #1657.       */.
178f0 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d         /* pFile-
17900 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17910 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a  no; */.       /*
17920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17930 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23  OERR; */.    }.#
17940 65 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d 20  endif.    err = 
17950 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
17960 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  fd); /* Only nee
17970 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
17980 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f 0a  so close the */.
17990 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
179a0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  {              /
179b0 2a 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e  * directory when
179c0 20 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a   we are done */.
179d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72        pFile->dir
179e0 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  fd = -1;.    }el
179f0 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
17a00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17a10 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
17a20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
17a30 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CLOSE;.    }.  }
17a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17a50 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
17a60 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
17a70 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
17a80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
17a90 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69  nixTruncate(sqli
17aa0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
17ab0 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  4 nByte){.  int 
17ac0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
17ad0 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
17ae0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
17af0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
17b00 41 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66 74  ATE );.  rc = ft
17b10 72 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69  runcate(((unixFi
17b20 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66  le*)id)->h, (off
17b30 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  _t)nByte);.  if(
17b40 20 72 63 20 29 7b 0a 20 20 20 20 28 28 75 6e 69   rc ){.    ((uni
17b50 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
17b60 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
17b70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17b80 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b  _IOERR_TRUNCATE;
17b90 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65  .  }else{.#ifnde
17ba0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
17bb0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
17bc0 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
17bd0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
17be0 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
17bf0 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
17c00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17c10 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
17c20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
17c30 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
17c40 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
17c50 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
17c60 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
17c70 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
17c80 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
17c90 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
17ca0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
17cb0 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
17cc0 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
17cd0 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
17ce0 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
17cf0 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
17d00 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
17d10 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
17d20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28     */.    if( ((
17d30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 69  unixFile*)id)->i
17d40 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
17d50 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
17d60 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17d70 29 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  )->transCntrChng
17d80 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
17d90 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
17da0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
17db0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
17dc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
17dd0 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
17de0 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
17df0 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
17e00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17e10 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
17e20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
17e30 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
17e40 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
17e50 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46   = fstat(((unixF
17e60 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
17e70 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
17e80 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
17e90 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
17ea0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17eb0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
17ec0 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
17ed0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
17ee0 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
17ef0 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
17f00 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
17f10 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
17f20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
17f30 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
17f40 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
17f50 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
17f60 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
17f70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
17f80 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
17f90 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
17fa0 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
17fb0 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
17fc0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
17fd0 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
17fe0 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
17ff0 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
18000 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
18010 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
18020 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
18030 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
18040 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
18050 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
18060 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
18070 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
18080 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18090 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
180a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
180b0 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
180c0 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
180d0 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
180e0 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
180f0 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
18100 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
18110 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
18120 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
18130 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
18140 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
18150 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28  );.#endif..#if (
18160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
18170 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
18180 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18190 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
181a0 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a 23 69  e3_private.h".#i
181b0 6e 63 6c 75 64 65 20 3c 63 6f 70 79 66 69 6c 65  nclude <copyfile
181c0 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .h>.static int g
181d0 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
181e0 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
181f0 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74  ile, char *dbPat
18200 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  h);.#endif../*.*
18210 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
18220 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
18230 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
18240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18250 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
18260 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18270 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
18280 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  pArg){.  switch(
18290 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
182a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
182b0 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
182c0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
182d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 65  unixFile*)id)->e
182e0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  FileLock;.      
182f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18300 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18310 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
18320 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
18330 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78  t*)pArg = ((unix
18340 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18350 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
18360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18370 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
18380 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
18390 49 4e 54 3a 20 7b 0a 23 69 66 20 30 20 2f 2a 20  INT: {.#if 0 /* 
183a0 4e 6f 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  No performance a
183b0 64 76 61 6e 74 61 67 65 20 73 65 65 6e 20 6f 6e  dvantage seen on
183c0 20 4c 69 6e 75 78 20 2a 2f 0a 20 20 20 20 20 20   Linux */.      
183d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
183e0 46 69 6c 65 20 3d 20 2a 28 73 71 6c 69 74 65 33  File = *(sqlite3
183f0 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20  _int64*)pArg;.  
18400 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
18410 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
18420 29 69 64 3b 0a 20 20 20 20 20 20 66 74 72 75 6e  )id;.      ftrun
18430 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 73  cate(pFile->h, s
18440 7a 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zFile);.#endif. 
18450 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18460 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
18470 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
18480 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
18490 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
184a0 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
184b0 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
184c0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
184d0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
184e0 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
184f0 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
18500 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
18510 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
18520 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
18530 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
18540 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
18550 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
18560 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
18570 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
18580 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18590 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
185a0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
185b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
185c0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
185d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
185e0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
185f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
18600 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
18610 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
18620 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18630 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
18640 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
18650 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
18660 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
18670 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
18680 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
18690 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
186a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
186b0 5f 29 20 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54  _) */.#if (SQLIT
186c0 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
186d0 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
186e0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
186f0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 55 4e  case SQLITE_TRUN
18700 43 41 54 45 5f 44 41 54 41 42 41 53 45 3a 20 7b  CATE_DATABASE: {
18710 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
18720 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
18730 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e  le*)id;.      in
18740 74 20 74 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  t trc = SQLITE_O
18750 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 46 69  K;.      int eFi
18760 6c 65 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  leLock = pFile->
18770 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
18780 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18790 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 68 61 72 20  _OK;.      char 
187a0 6a 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  jPath[MAXPATHLEN
187b0 2b 39 5d 3b 0a 20 20 20 20 20 20 73 69 7a 65 5f  +9];.      size_
187c0 74 20 6a 4c 65 6e 3b 0a 20 20 20 20 20 20 0a 20  t jLen;.      . 
187d0 20 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f       if( eFileLo
187e0 63 6b 3c 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53  ck<SQLITE_LOCK_S
187f0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20  HARED ){.       
18800 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65   rc = pFile->pMe
18810 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20  thod->xLock(id, 
18820 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
18830 45 44 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ED);.      }.   
18840 20 20 20 69 66 28 20 21 72 63 20 26 26 20 65 46     if( !rc && eF
18850 69 6c 65 4c 6f 63 6b 3c 53 51 4c 49 54 45 5f 4c  ileLock<SQLITE_L
18860 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  OCK_EXCLUSIVE ){
18870 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 46  .        rc = pF
18880 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
18890 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c  ock(id, SQLITE_L
188a0 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  OCK_EXCLUSIVE);.
188b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
188c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
188d0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
188e0 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
188f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
18900 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
18910 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
18920 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ock);.        }.
18930 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18940 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
18950 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65   rc = pFile->pMe
18960 74 68 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65 28  thod->xTruncate(
18970 69 64 2c 20 28 28 70 46 69 6c 65 2d 3e 66 73 46  id, ((pFile->fsF
18980 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
18990 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20  FLAGS_IS_MSDOS) 
189a0 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29  != 0) ? 1L : 0L)
189b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  ;.      if( !rc 
189c0 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 3d 3d 67  && (SQLITE_OK==g
189d0 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
189e0 69 6c 65 28 70 46 69 6c 65 2c 20 6a 50 61 74 68  ile(pFile, jPath
189f0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 4c  )) ){.        jL
18a00 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6a 50 61  en = strlcat(jPa
18a10 74 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  th, "-journal", 
18a20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20  MAXPATHLEN+9);. 
18a30 20 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e 20         if( jLen 
18a40 3c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 20 29  < MAXPATHLEN+9 )
18a50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
18a60 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68  jfd = open(jPath
18a70 2c 20 4f 5f 54 52 55 4e 43 29 3b 0a 20 20 20 20  , O_TRUNC);.    
18a80 20 20 20 20 20 20 69 66 28 20 28 6a 66 64 20 3d        if( (jfd =
18a90 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  = -1) ){.       
18aa0 20 20 20 20 20 69 66 20 28 20 65 72 72 6e 6f 21       if ( errno!
18ab0 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
18ac0 20 20 20 20 20 20 20 20 20 70 65 72 72 6f 72 28           perror(
18ad0 6a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  jPath);.        
18ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18af0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
18b00 20 20 20 20 20 66 73 79 6e 63 28 6a 66 64 29 3b       fsync(jfd);
18b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f  .            clo
18b20 73 65 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  se(jfd);.       
18b30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
18b40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18b50 20 20 20 20 74 72 63 3d 72 63 3b 0a 20 20 20 20      trc=rc;.    
18b60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 74    }.      if( !t
18b70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74 72  rc ){.        tr
18b80 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
18b90 6f 64 2d 3e 78 53 79 6e 63 28 69 64 2c 20 53 51  od->xSync(id, SQ
18ba0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b  LITE_SYNC_FULL);
18bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18bc0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
18bd0 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20  ock > eFileLock 
18be0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75  ){.        int u
18bf0 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d  nlockRC = pFile-
18c00 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
18c10 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  k(id, SQLITE_LOC
18c20 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 20 20 20  K_SHARED);.     
18c30 20 20 20 69 66 20 28 21 72 63 29 20 72 63 20 3d     if (!rc) rc =
18c40 20 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20 20 20 20   unlockRC;.     
18c50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 69   }.      if( pFi
18c60 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
18c70 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
18c80 20 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63 6b 52       int unlockR
18c90 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  C = pFile->pMeth
18ca0 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  od->xUnlock(id, 
18cb0 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45  SQLITE_LOCK_NONE
18cc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21  );.        if (!
18cd0 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52  rc) rc = unlockR
18ce0 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  C;.      }.     
18cf0 20 69 66 28 20 74 72 63 20 29 7b 0a 20 20 20 20   if( trc ){.    
18d00 20 20 20 20 72 65 74 75 72 6e 20 74 72 63 3b 0a      return trc;.
18d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18d20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18d30 20 20 20 20 20 0a 20 20 20 20 63 61 73 65 20 53       .    case S
18d40 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f 44 41  QLITE_REPLACE_DA
18d50 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  TABASE: {.      
18d60 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
18d70 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
18d80 0a 20 20 20 20 20 20 69 6e 74 20 74 72 63 20 3d  .      int trc =
18d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18da0 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20    int eFileLock 
18db0 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  = pFile->eFileLo
18dc0 63 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ck;.      int rc
18dd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18de0 20 20 20 20 63 68 61 72 20 6a 50 61 74 68 5b 4d      char jPath[M
18df0 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20  AXPATHLEN+9];.  
18e00 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b      size_t jLen;
18e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
18e20 73 72 63 64 62 20 3d 20 28 73 71 6c 69 74 65 33  srcdb = (sqlite3
18e30 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 42   *)pArg;.      B
18e40 74 72 65 65 20 2a 70 53 72 63 42 74 72 65 65 20  tree *pSrcBtree 
18e50 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 69 6e  = NULL;.      in
18e60 74 20 65 53 72 63 46 69 6c 65 4c 6f 63 6b 20 3d  t eSrcFileLock =
18e70 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e   SQLITE_LOCK_NON
18e80 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 72 63  E;.      int src
18e90 4c 6f 63 6b 52 43 20 3d 20 2d 31 3b 0a 20 20 20  LockRC = -1;.   
18ea0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
18eb0 2a 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c  *src_file = NULL
18ec0 3b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  ;.      unixFile
18ed0 20 2a 70 53 72 63 46 69 6c 65 20 3d 20 4e 55 4c   *pSrcFile = NUL
18ee0 4c 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  L;.      .      
18ef0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
18f00 74 79 43 68 65 63 6b 4f 6b 28 73 72 63 64 62 29  tyCheckOk(srcdb)
18f10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
18f20 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
18f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18f40 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 53 51  if( eFileLock<SQ
18f50 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
18f60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18f70 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
18f80 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54  >xLock(id, SQLIT
18f90 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a  E_LOCK_SHARED);.
18fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18fb0 28 20 21 72 63 20 26 26 20 65 46 69 6c 65 4c 6f  ( !rc && eFileLo
18fc0 63 6b 3c 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  ck<SQLITE_LOCK_E
18fd0 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
18fe0 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e      rc = pFile->
18ff0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69  pMethod->xLock(i
19000 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
19010 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 20  XCLUSIVE);.     
19020 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63   }.      if( !rc
19030 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 67   ){.        /* g
19040 65 74 20 74 68 65 20 73 72 63 20 66 69 6c 65 20  et the src file 
19050 64 65 73 63 72 69 70 74 6f 72 20 61 64 68 65 72  descriptor adher
19060 69 6e 67 20 74 6f 20 74 68 65 20 64 62 20 73 74  ing to the db st
19070 72 75 63 74 20 61 63 63 65 73 73 20 72 75 6c 65  ruct access rule
19080 73 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s .         ** t
19090 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 65  his code is mode
190a0 6c 65 64 20 61 66 74 65 72 20 73 71 6c 69 74 65  led after sqlite
190b0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29  3_file_control()
190c0 20 69 6e 20 6d 61 69 6e 2e 63 0a 20 20 20 20 20   in main.c.     
190d0 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20      */ .        
190e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
190f0 74 65 72 28 73 72 63 64 62 2d 3e 6d 75 74 65 78  ter(srcdb->mutex
19100 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
19110 72 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20  rcdb->nDb>0 ){. 
19120 20 20 20 20 20 20 20 20 20 70 53 72 63 42 74 72           pSrcBtr
19130 65 65 20 3d 20 73 72 63 64 62 2d 3e 61 44 62 5b  ee = srcdb->aDb[
19140 30 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20  0].pBt;.        
19150 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  }.        if( pS
19160 72 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20  rcBtree ){.     
19170 20 20 20 20 20 50 61 67 65 72 20 2a 70 53 72 63       Pager *pSrc
19180 50 61 67 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Pager;.         
19190 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
191a0 65 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20  er(pSrcBtree);. 
191b0 20 20 20 20 20 20 20 20 20 70 53 72 63 50 61 67           pSrcPag
191c0 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
191d0 65 50 61 67 65 72 28 70 53 72 63 42 74 72 65 65  ePager(pSrcBtree
191e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
191f0 65 72 74 28 20 70 53 72 63 50 61 67 65 72 21 3d  ert( pSrcPager!=
19200 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  0 );.          s
19210 72 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69 74 65  rc_file = sqlite
19220 33 50 61 67 65 72 46 69 6c 65 28 70 53 72 63 50  3PagerFile(pSrcP
19230 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
19240 20 61 73 73 65 72 74 28 20 73 72 63 5f 66 69 6c   assert( src_fil
19250 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  e!=0 );.        
19260 20 20 69 66 28 20 73 72 63 5f 66 69 6c 65 2d 3e    if( src_file->
19270 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
19280 20 20 20 20 20 20 20 20 70 53 72 63 46 69 6c 65          pSrcFile
19290 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73   = (unixFile *)s
192a0 72 63 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 20  rc_file;.       
192b0 20 20 20 20 20 65 53 72 63 46 69 6c 65 4c 6f 63       eSrcFileLoc
192c0 6b 20 3d 20 70 53 72 63 46 69 6c 65 2d 3e 65 46  k = pSrcFile->eF
192d0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ileLock;.       
192e0 20 20 20 20 20 69 66 28 20 65 53 72 63 46 69 6c       if( eSrcFil
192f0 65 4c 6f 63 6b 3c 53 51 4c 49 54 45 5f 4c 4f 43  eLock<SQLITE_LOC
19300 4b 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  K_SHARED ){.    
19310 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
19320 53 72 63 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  SrcFile->pMethod
19330 2d 3e 78 4c 6f 63 6b 28 73 72 63 5f 66 69 6c 65  ->xLock(src_file
19340 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48  , SQLITE_LOCK_SH
19350 41 52 45 44 29 3b 0a 20 20 20 20 20 20 20 20 20  ARED);.         
19360 20 20 20 20 20 73 72 63 4c 6f 63 6b 52 43 20 3d       srcLockRC =
19370 20 72 63 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 4f   rc; /* SQLITE_O
19380 4b 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  K means we need 
19390 74 6f 20 75 6e 6c 6f 63 6b 20 6c 61 74 65 72 20  to unlock later 
193a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  */.            }
193b0 20 65 6c 73 65 20 69 66 28 20 65 53 72 63 46 69   else if( eSrcFi
193c0 6c 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 4c  leLock==SQLITE_L
193d0 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  OCK_EXCLUSIVE ){
193e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
193f0 2a 20 69 66 20 74 68 65 20 73 72 63 20 64 61 74  * if the src dat
19400 61 62 61 73 65 20 68 61 73 20 61 6e 20 65 78 63  abase has an exc
19410 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 76 65 72  lusive lock, ver
19420 69 66 79 20 74 68 61 74 20 74 68 65 0a 20 20 20  ify that the.   
19430 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
19440 74 20 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61  t doesn't have a
19450 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
19460 74 68 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  th open transact
19470 69 6f 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ions .          
19480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19490 20 20 20 20 20 20 69 66 28 20 67 65 74 44 62 50        if( getDbP
194a0 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70  athForUnixFile(p
194b0 53 72 63 46 69 6c 65 2c 20 6a 50 61 74 68 29 20  SrcFile, jPath) 
194c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
194d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
194e0 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  NTERNAL;.       
194f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 4c                jL
19510 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6a 50 61  en = strlcat(jPa
19520 74 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  th, "-journal", 
19530 4d 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20  MAXPATHLEN+9);. 
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
19550 66 28 20 6a 4c 65 6e 20 3c 20 4d 41 58 50 41 54  f( jLen < MAXPAT
19560 48 4c 45 4e 2b 39 20 29 7b 0a 20 20 20 20 20 20  HLEN+9 ){.      
19570 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
19580 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68  jfd = open(jPath
19590 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20  , O_RDONLY);.   
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
195b0 66 28 20 6a 66 64 3d 3d 2d 31 20 29 7b 0a 20 20  f( jfd==-1 ){.  
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f    if( errno!=ENO
195e0 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ENT ){.         
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
19600 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
19610 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
19630 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19660 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 20 20 20 2f 2a 20 69 66 20 74 68 65 20 6a 6f 75     /* if the jou
19690 72 6e 61 6c 20 65 78 69 73 74 73 20 65 6e 73 75  rnal exists ensu
196a0 72 65 20 74 68 65 72 65 27 73 20 6e 6f 20 70 65  re there's no pe
196b0 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20  nding .         
196c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
196d0 72 61 6e 73 61 63 74 69 6f 6e 20 62 79 20 63 68  ransaction by ch
196e0 65 63 6b 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  ecking the journ
196f0 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 63 68 61 72 20 6d 61 67 69 63 5b 38 5d 3b 0a   char magic[8];.
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 20 73 73 69 7a 65 5f 74 20 72 6c 65 6e      ssize_t rlen
19740 20 3d 20 70 72 65 61 64 28 6a 66 64 2c 20 6d 61   = pread(jfd, ma
19750 67 69 63 2c 20 38 2c 20 30 29 3b 0a 20 20 20 20  gic, 8, 0);.    
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19770 69 66 28 20 72 6c 65 6e 3c 30 20 29 7b 0a 20 20  if( rlen<0 ){.  
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
197a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
197d0 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20  IOERR;.         
197e0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
197f0 20 69 66 28 20 72 6c 65 6e 3d 3d 38 20 29 7b 0a   if( rlen==8 ){.
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19810 20 20 20 20 20 20 63 68 61 72 20 74 65 73 74 5b        char test[
19820 38 5d 20 3d 20 7b 27 5c 30 27 2c 27 5c 30 27 2c  8] = {'\0','\0',
19830 27 5c 30 27 2c 27 5c 30 27 2c 27 5c 30 27 2c 27  '\0','\0','\0','
19840 5c 30 27 2c 27 5c 30 27 2c 27 5c 30 27 7d 3b 0a  \0','\0','\0'};.
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19860 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
19870 28 6d 61 67 69 63 2c 74 65 73 74 2c 38 29 20 29  (magic,test,8) )
19880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19890 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
198a0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
198b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
198d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
198e0 69 66 28 20 72 6c 65 6e 21 3d 30 20 29 7b 0a 20  if( rlen!=0 ){. 
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19900 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19910 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20  _INTERNAL;.     
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
19930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19940 20 20 20 20 20 63 6c 6f 73 65 28 6a 66 64 29 3b       close(jfd);
19950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19990 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
199a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
199b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49    rc = SQLITE_MI
199c0 53 55 53 45 3b 0a 20 20 20 20 20 20 20 20 20 20  SUSE;.          
199d0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
199e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
199f0 20 20 69 66 28 20 73 72 63 4c 6f 63 6b 52 43 3d    if( srcLockRC=
19a00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19a10 20 20 20 20 20 20 20 20 20 20 20 20 70 53 72 63              pSrc
19a20 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
19a30 55 6e 6c 6f 63 6b 28 73 72 63 5f 66 69 6c 65 2c  Unlock(src_file,
19a40 20 65 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a   eSrcFileLock);.
19a50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
19a60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19a70 33 42 74 72 65 65 4c 65 61 76 65 28 70 53 72 63  3BtreeLeave(pSrc
19a80 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  Btree);.        
19a90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
19aa0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 46 69        if( pSrcFi
19ab0 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 70 53 72  le==NULL || (pSr
19ac0 63 46 69 6c 65 2d 3e 68 3c 30 29 20 29 7b 0a 20  cFile->h<0) ){. 
19ad0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
19ae0 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20  LITE_INTERNAL;. 
19af0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19b00 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72 63  _mutex_leave(src
19b10 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
19b20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
19b30 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
19b40 20 20 20 20 20 20 2f 2a 20 75 6e 72 6f 6c 6c 20        /* unroll 
19b50 73 74 61 74 65 20 63 68 61 6e 67 65 73 20 61 6e  state changes an
19b60 64 20 72 65 74 75 72 6e 20 65 72 72 6f 72 20 63  d return error c
19b70 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ode */.        i
19b80 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
19b90 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20  ock > eFileLock 
19ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
19bb0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
19bc0 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
19bd0 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ck);.        }. 
19be0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19bf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19c00 20 20 20 20 20 20 20 2f 2a 20 62 6f 74 68 20 64         /* both d
19c10 61 74 61 62 61 73 65 73 20 61 72 65 20 6c 6f 63  atabases are loc
19c20 6b 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ked appropriatel
19c30 79 2c 20 63 6f 70 79 20 66 69 6c 65 20 64 61 74  y, copy file dat
19c40 61 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  a.         ** an
19c50 64 20 74 68 65 6e 20 75 6e 72 6f 6c 6c 20 74 68  d then unroll th
19c60 65 20 6c 6f 63 6b 73 20 77 65 20 61 64 64 65 64  e locks we added
19c70 2e 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  . .         */. 
19c80 20 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f         copyfile_
19c90 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 20 20 20  state_t s;.     
19ca0 20 20 20 0a 20 20 20 20 20 20 20 20 73 20 3d 20     .        s = 
19cb0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61  copyfile_state_a
19cc0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
19cd0 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28 70 53  if( fcopyfile(pS
19ce0 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65  rcFile->h, pFile
19cf0 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45  ->h, s, COPYFILE
19d00 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
19d10 20 20 20 73 77 69 74 63 68 28 65 72 72 6e 6f 29     switch(errno)
19d20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   {.            c
19d30 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20  ase ENOMEM:.    
19d40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
19d50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
19d60 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19d70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65  ;.            de
19d80 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
19d90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19da0 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20  _INTERNAL;.     
19db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
19dc0 0a 20 20 20 20 20 20 20 20 63 6f 70 79 66 69 6c  .        copyfil
19dd0 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b  e_state_free(s);
19de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 72 63  .        if( src
19df0 4c 6f 63 6b 52 43 3d 3d 53 51 4c 49 54 45 5f 4f  LockRC==SQLITE_O
19e00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
19e10 53 72 63 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  SrcFile->pMethod
19e20 2d 3e 78 55 6e 6c 6f 63 6b 28 73 72 63 5f 66 69  ->xUnlock(src_fi
19e30 6c 65 2c 20 65 53 72 63 46 69 6c 65 4c 6f 63 6b  le, eSrcFileLock
19e40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
19e50 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19e60 65 4c 65 61 76 65 28 70 53 72 63 42 74 72 65 65  eLeave(pSrcBtree
19e70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19e80 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
19e90 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  rcdb->mutex);.  
19ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
19eb0 20 20 20 69 66 28 20 21 72 63 20 26 26 20 28 53     if( !rc && (S
19ec0 51 4c 49 54 45 5f 4f 4b 3d 3d 67 65 74 44 62 50  QLITE_OK==getDbP
19ed0 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70  athForUnixFile(p
19ee0 46 69 6c 65 2c 20 6a 50 61 74 68 29 29 20 29 7b  File, jPath)) ){
19ef0 0a 20 20 20 20 20 20 20 20 6a 4c 65 6e 20 3d 20  .        jLen = 
19f00 73 74 72 6c 63 61 74 28 6a 50 61 74 68 2c 20 22  strlcat(jPath, "
19f10 2d 6a 6f 75 72 6e 61 6c 22 2c 20 4d 41 58 50 41  -journal", MAXPA
19f20 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 20 20 20 20  THLEN+9);.      
19f30 20 20 69 66 28 20 6a 4c 65 6e 20 3c 20 4d 41 58    if( jLen < MAX
19f40 50 41 54 48 4c 45 4e 2b 39 20 29 7b 0a 20 20 20  PATHLEN+9 ){.   
19f50 20 20 20 20 20 20 20 69 6e 74 20 6a 66 64 20 3d         int jfd =
19f60 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20 4f 5f 54   open(jPath, O_T
19f70 52 55 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 20  RUNC);.         
19f80 20 69 66 28 20 28 6a 66 64 20 3d 3d 20 2d 31 29   if( (jfd == -1)
19f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19fa0 69 66 20 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45  if ( errno!=ENOE
19fb0 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
19fc0 20 20 20 20 70 65 72 72 6f 72 28 6a 50 61 74 68      perror(jPath
19fd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
19fe0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
19ff0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
1a000 66 73 79 6e 63 28 6a 66 64 29 3b 0a 20 20 20 20  fsync(jfd);.    
1a010 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a 66          close(jf
1a020 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
1a030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1a050 72 63 3d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rc=rc;.      }. 
1a060 20 20 20 20 20 69 66 28 20 21 74 72 63 20 29 7b       if( !trc ){
1a070 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 70  .        trc = p
1a080 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
1a090 53 79 6e 63 28 69 64 2c 20 53 51 4c 49 54 45 5f  Sync(id, SQLITE_
1a0a0 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 20 20 20 20  SYNC_FULL);.    
1a0b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
1a0c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
1a0d0 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
1a0e0 20 20 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63 6b        int unlock
1a0f0 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  RC = pFile->pMet
1a100 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c  hod->xUnlock(id,
1a110 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41   SQLITE_LOCK_SHA
1a120 52 45 44 29 3b 0a 20 20 20 20 20 20 20 20 69 66  RED);.        if
1a130 20 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f   (!rc) rc = unlo
1a140 63 6b 52 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ckRC;.      }.  
1a150 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65      if( pFile->e
1a160 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65  FileLock > eFile
1a170 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Lock ){.        
1a180 69 6e 74 20 75 6e 6c 6f 63 6b 52 43 20 3d 20 70  int unlockRC = p
1a190 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
1a1a0 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54  Unlock(id, SQLIT
1a1b0 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20  E_LOCK_NONE);.  
1a1c0 20 20 20 20 20 20 69 66 20 28 21 72 63 29 20 72        if (!rc) r
1a1d0 63 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20  c = unlockRC;.  
1a1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a1f0 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  trc ){.        r
1a200 65 74 75 72 6e 20 74 72 63 3b 0a 20 20 20 20 20  eturn trc;.     
1a210 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1a220 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  rc;.    }.#endif
1a230 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41 42   /* (SQLITE_ENAB
1a240 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
1a250 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1a260 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72  LE__) */.  }.  r
1a270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1a280 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OR;.}../*.** Ret
1a290 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
1a2a0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
1a2b0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
1a2c0 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
1a2d0 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
1a2e0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
1a2f0 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
1a300 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
1a310 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
1a320 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
1a330 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
1a340 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
1a350 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
1a360 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
1a370 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
1a380 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
1a390 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
1a3a0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
1a3b0 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
1a3c0 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
1a3d0 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
1a3e0 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
1a3f0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
1a400 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
1a410 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
1a420 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  t unixSectorSize
1a430 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
1a440 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
1a450 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1a460 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  sed);.  return S
1a470 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
1a480 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
1a490 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1a4a0 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
1a4b0 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69  stics for the fi
1a4c0 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  le. This is alwa
1a4d0 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a 2a  ys 0 for unix..*
1a4e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1a4f0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1a500 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
1a510 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ile *NotUsed){. 
1a520 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a530 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
1a540 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
1a550 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1a560 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  AL.../*.** Objec
1a570 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
1a580 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65  ent an shared me
1a590 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a  mory buffer.  .*
1a5a0 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70  *.** When multip
1a5b0 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
1a5c0 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
1a5d0 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63  e wal-index, eac
1a5e0 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20  h thread.** has 
1a5f0 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20  its own unixShm 
1a600 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
1a610 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20   all point to a 
1a620 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a  single instance.
1a630 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53  ** of this unixS
1a640 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20  hmNode object.  
1a650 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1a660 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69  each wal-index i
1a670 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79  s opened.** only
1a680 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
1a690 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e  s..**.** Each un
1a6a0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1a6b0 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
1a6c0 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e   a single unixIn
1a6d0 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
1a6e0 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c  ** We could coal
1a6f0 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74  esce this object
1a700 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49   into unixInodeI
1a710 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f  nfo, but that wo
1a720 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72  uld mean.** ever
1a730 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74  y open file that
1a740 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68   does not use sh
1a750 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20  ared memory (in 
1a760 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73  other words, mos
1a770 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29  t.** open files)
1a780 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63   would have to c
1a790 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73  arry around this
1a7a0 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
1a7b0 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75  on.  So.** the u
1a7c0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
1a7d0 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ect contains a p
1a7e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75  ointer to this u
1a7f0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1a800 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69  t.** and the uni
1a810 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1a820 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20  is created only 
1a830 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  when needed..**.
1a840 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
1a850 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
1a860 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
1a870 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
1a880 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
1a890 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
1a8a0 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
1a8b0 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
1a8c0 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a  **      nRef.**.
1a8d0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a8e0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1a8f0 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
1a900 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1a910 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
1a920 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
1a930 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
1a940 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75  r unixShmNode.mu
1a950 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
1a960 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e   or unixShmNode.
1a970 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75  nRef==0 and.** u
1a980 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
1a990 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
1a9a0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
1a9b0 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
1a9c0 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
1a9d0 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ure..*/.struct u
1a9e0 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75  nixShmNode {.  u
1a9f0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
1aa00 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69  node;     /* uni
1aa10 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20  xInodeInfo that 
1aa20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f  owns this SHM no
1aa30 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
1aa40 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
1aa50 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
1aa60 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
1aa70 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
1aa80 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
1aa90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1aaa0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1aab0 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aad0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
1aae0 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73  iptor */.  int s
1aaf0 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
1ab00 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1ab10 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1ab20 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1ab30 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
1ab40 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1ab50 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
1ab60 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52   */.  char **apR
1ab70 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1ab80 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70   /* Array of map
1ab90 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ped shared-memor
1aba0 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
1abb0 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1abc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1abd0 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f  ber of unixShm o
1abe0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1abf0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69  to this */.  uni
1ac00 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  xShm *pFirst;   
1ac10 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75          /* All u
1ac20 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
1ac30 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1ac40 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1ac50 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c  _DEBUG.  u8 excl
1ac60 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1ac70 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1ac80 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1ac90 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72  eld */.  u8 shar
1aca0 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1acb0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1acc0 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1acd0 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d   */.  u8 nextShm
1ace0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
1acf0 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
1ad00 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61  le unixShm.id va
1ad10 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
1ad20 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
1ad30 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
1ad40 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
1ad50 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
1ad60 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
1ad70 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
1ad80 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1ad90 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
1ada0 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
1adb0 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
1adc0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
1add0 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
1ade0 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
1adf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53  :.**.**    unixS
1ae00 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75  hm.pFile.**    u
1ae10 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20  nixShm.id.**.** 
1ae20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73  All other fields
1ae30 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
1ae40 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46    The unixShm.pF
1ae50 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ile->mutex must 
1ae60 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
1ae70 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
1ae80 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
1ae90 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
1aea0 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  Shm {.  unixShmN
1aeb0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
1aec0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1aed0 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ying unixShmNode
1aee0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69   object */.  uni
1aef0 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  xShm *pNext;    
1af00 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1af10 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65  unixShm with the
1af20 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64   same unixShmNod
1af30 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
1af40 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1af50 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
1af60 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d  ding the unixShm
1af70 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
1af80 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
1af90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1afa0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1afb0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
1afc0 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
1afd0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1afe0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
1aff0 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65  ks held */.#ifde
1b000 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1b010 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
1b020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b030 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
1b040 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20  tion within its 
1b050 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23  unixShmNode */.#
1b060 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1b070 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
1b080 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
1b090 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42  efine UNIX_SHM_B
1b0a0 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
1b0b0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
1b0c0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
1b0d0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
1b0e0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44  efine UNIX_SHM_D
1b0f0 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f  MS    (UNIX_SHM_
1b100 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
1b110 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
1b120 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
1b130 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20  .** Apply posix 
1b140 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
1b150 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f  or all bytes fro
1b160 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f  m ofst through o
1b170 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c  fst+n-1..**.** L
1b180 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68  ocks block if th
1b190 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c  e mask is exactl
1b1a0 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64  y UNIX_SHM_C and
1b1b0 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e   are non-blockin
1b1c0 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  g.** otherwise..
1b1d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1b1e0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
1b1f0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1b200 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70  pShmNode, /* App
1b210 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
1b220 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
1b230 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
1b240 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
1b250 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c          /* F_UNL
1b260 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20  CK, F_RDLCK, or 
1b270 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  F_WRLCK */.  int
1b280 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
1b290 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
1b2a0 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e of the locking
1b2b0 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20   range */.  int 
1b2c0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1b2d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b2e0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
1b2f0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  .){.  struct flo
1b300 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54  ck f;       /* T
1b310 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
1b320 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  y locking struct
1b330 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ure */.  int rc 
1b340 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
1b350 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
1b360 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20  rm fcntl() */.. 
1b370 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
1b380 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
1b390 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
1b3a0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1b3b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
1b3c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b3d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1b3e0 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ) || pShmNode->n
1b3f0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
1b400 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76  Shared locks nev
1b410 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61  er span more tha
1b420 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20  n one byte */.  
1b430 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
1b440 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43  lockType!=F_RDLC
1b450 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73  K );..  /* Locks
1b460 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
1b470 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
1b480 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f  >=1 && n<SQLITE_
1b490 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SHM_NLOCK );..  
1b4a0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1b4b0 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
1b4c0 74 65 72 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ters */.  memset
1b4d0 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
1b4e0 29 29 3b 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d  ));.  f.l_type =
1b4f0 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c   lockType;.  f.l
1b500 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
1b510 45 54 3b 0a 20 20 66 2e 6c 5f 73 74 61 72 74 20  ET;.  f.l_start 
1b520 3d 20 6f 66 73 74 3b 0a 20 20 66 2e 6c 5f 6c 65  = ofst;.  f.l_le
1b530 6e 20 3d 20 6e 3b 0a 0a 20 20 72 63 20 3d 20 66  n = n;..  rc = f
1b540 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cntl(pShmNode->h
1b550 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a  , F_SETLK, &f);.
1b560 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29    rc = (rc!=(-1)
1b570 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
1b580 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a 20 20  SQLITE_BUSY;..  
1b590 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c  /* Update the gl
1b5a0 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20  obal lock state 
1b5b0 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61  and do debug tra
1b5c0 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53  cing */.#ifdef S
1b5d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20  QLITE_DEBUG.  { 
1b5e0 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52  u16 mask;.  OSTR
1b5f0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22  ACE(("SHM-LOCK "
1b600 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  ));.  mask = (1<
1b610 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
1b620 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63  <ofst);.  if( rc
1b630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b640 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
1b650 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
1b660 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
1b670 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
1b680 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
1b690 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
1b6a0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
1b6b0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1b6c0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
1b6d0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
1b6e0 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
1b6f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
1b700 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  ad-lock %d ok", 
1b710 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
1b720 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1b730 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1b740 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
1b750 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
1b760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b770 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
1b780 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
1b790 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
1b7a0 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  te-lock %d ok", 
1b7b0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
1b7c0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1b7d0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
1b7e0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1b7f0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1b800 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1b810 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
1b820 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
1b830 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
1b840 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
1b850 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st));.    }else 
1b860 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
1b870 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
1b880 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
1b890 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
1b8a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1b8b0 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
1b8c0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
1b8d0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
1b8e0 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  e-lock %d failed
1b8f0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
1b900 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
1b910 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  " - afterwards %
1b920 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
1b930 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1b940 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53  ->sharedMask, pS
1b950 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1b960 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
1b970 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
1b980 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50      .}.../*.** P
1b990 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d  urge the unixShm
1b9a0 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
1b9b0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
1b9c0 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  h unixShmNode.nR
1b9d0 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
1b9e0 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
1b9f0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
1ba00 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
1ba10 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
1ba20 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
1ba30 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
1ba40 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
1ba50 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67  void unixShmPurg
1ba60 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
1ba70 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
1ba80 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65  *p = pFd->pInode
1ba90 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73  ->pShmNode;.  as
1baa0 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
1bab0 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
1bac0 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29   && p->nRef==0 )
1bad0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1bae0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f   assert( p->pIno
1baf0 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20  de==pFd->pInode 
1bb00 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 75  );.    if( p->mu
1bb10 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75  tex ) sqlite3_mu
1bb20 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
1bb30 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  x);.    for(i=0;
1bb40 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
1bb50 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 75 6e 6d 61  ++){.      munma
1bb60 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d  p(p->apRegion[i]
1bb70 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a  , p->szRegion);.
1bb80 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1bb90 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
1bba0 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  on);.    if( p->
1bbb0 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 2d 3e  h>=0 ) close(p->
1bbc0 68 29 3b 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64  h);.    p->pInod
1bbd0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e->pShmNode = 0;
1bbe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1bbf0 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
1bc00 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64  ** Open a shared
1bc10 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
1bc20 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65  ociated with ope
1bc30 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1bc40 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73  pDbFd.  .** This
1bc50 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c   particular impl
1bc60 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
1bc70 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a  mmapped files..*
1bc80 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73  *.** The file us
1bc90 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
1bca0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73  shared-memory is
1bcb0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
1bcc0 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65  ectory.** as the
1bcd0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
1bce0 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20  ile and has the 
1bcf0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
1bd00 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
1bd10 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  * file with the 
1bd20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64  "-shm" suffix ad
1bd30 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ded.  For exampl
1bd40 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  e, if the databa
1bd50 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f  se file.** is "/
1bd60 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
1bd70 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66  g.db" then the f
1bd80 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61  ile that is crea
1bd90 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a  ted and mmapped.
1bda0 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  ** for shared me
1bdb0 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c  mory will be cal
1bdc0 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31  led "/home/user1
1bdd0 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e  /config.db-shm".
1bde0 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72    .**.** Another
1bdf0 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20   approach to is 
1be00 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20  to use files in 
1be10 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76  /dev/shm or /dev
1be20 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f  /tmp or an.** so
1be30 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d  me other tmpfs m
1be40 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66  ount. But if a f
1be50 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65  ile in a differe
1be60 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  nt directory.** 
1be70 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1be80 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20  e file is used, 
1be90 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61  then differing a
1bea0 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
1beb0 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74  s.** or a chroot
1bec0 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  () might cause t
1bed0 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f  wo different pro
1bee0 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61  cesses on the sa
1bef0 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  me.** database t
1bf00 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64  o end up using d
1bf10 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66  ifferent files f
1bf20 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
1bf30 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74   - .** meaning t
1bf40 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  hat their memory
1bf50 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c   would not reall
1bf60 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65  y be shared - re
1bf70 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61  sulting.** in da
1bf80 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1bf90 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  n.  Nevertheless
1bfa0 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c  , this tmpfs fil
1bfb0 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62  e usage.** can b
1bfc0 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  e enabled at com
1bfd0 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20  pile-time using 
1bfe0 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  -DSQLITE_SHM_DIR
1bff0 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d  ECTORY="/dev/shm
1c000 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69  ".** or the equi
1c010 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65  valent.  The use
1c020 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   of the SQLITE_S
1c030 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
1c040 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74  pile-time.** opt
1c050 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ion results in a
1c060 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62  n incompatible b
1c070 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20  uild of SQLite; 
1c080 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74   builds of SQLit
1c090 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64  e.** that with d
1c0a0 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f  iffering SQLITE_
1c0b0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65  SHM_DIRECTORY se
1c0c0 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74  ttings attempt t
1c0d0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d  o use the.** sam
1c0e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c0f0 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
1c100 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  , database corru
1c110 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c  ption will likel
1c120 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65  y.** result. The
1c130 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1c140 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
1c150 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e  me option is con
1c160 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75  sidered.** "unsu
1c170 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79  pported" and may
1c180 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75   go away in a fu
1c190 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65  ture SQLite rele
1c1a0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ase..**.** When 
1c1b0 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
1c1c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1c1d0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
1c1e0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
1c1f0 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
1c200 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
1c210 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
1c220 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
1c230 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
1c240 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
1c250 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
1c260 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
1c270 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
1c280 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1c290 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
1c2a0 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
1c2b0 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
1c2c0 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
1c2d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1c2e0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1c2f0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
1c300 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
1c310 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
1c320 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
1c330 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
1c340 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c360 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1c370 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
1c380 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
1c390 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
1c3a0 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
1c3b0 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c3d0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1c3e0 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
1c3f0 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
1c400 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
1c410 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c420 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
1c430 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
1c440 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1c450 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
1c460 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
1c470 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
1c480 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
1c490 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1c4a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1c4b0 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
1c4c0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
1c4d0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1c4e0 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
1c4f0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1c500 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
1c510 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
1c520 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
1c530 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
1c540 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
1c550 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
1c560 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
1c570 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
1c580 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
1c590 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
1c5a0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
1c5b0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
1c5c0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
1c5d0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1c5e0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
1c5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
1c600 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
1c610 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1c620 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74  .    /* Call fst
1c630 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  at() to figure o
1c640 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ut the permissio
1c650 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ns on the databa
1c660 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20  se file. If.    
1c670 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66  ** a new *-shm f
1c680 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
1c690 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20  an attempt will 
1c6a0 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74  be made to creat
1c6b0 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68  e it.    ** with
1c6c0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
1c6d0 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75 61  sions. The actua
1c6e0 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 68  l permissions th
1c6f0 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  e file is create
1c700 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 72  d.    ** with ar
1c710 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  e subject to the
1c720 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20 73   current umask s
1c730 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  etting..    */. 
1c740 20 20 20 69 66 28 20 66 73 74 61 74 28 70 44 62     if( fstat(pDb
1c750 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  Fd->h, &sStat) )
1c760 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c770 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1c780 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1c790 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1c7a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
1c7b0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
1c7c0 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
1c7d0 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
1c7e0 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
1c7f0 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  0;.#else.    nSh
1c800 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20  mFilename = 5 + 
1c810 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46  (int)strlen(pDbF
1c820 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69  d->zPath);.#endi
1c830 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
1c840 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1c850 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
1c860 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  e) + nShmFilenam
1c870 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  e );.    if( pSh
1c880 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
1c890 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1c8a0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1c8b0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1c8c0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
1c8d0 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  ShmNode, 0, size
1c8e0 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a  of(*pShmNode));.
1c8f0 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
1c900 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
1c910 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
1c920 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
1c930 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
1c940 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
1c950 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
1c960 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
1c970 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1c9a0 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
1c9b0 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
1c9e0 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
1c9f0 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
1ca00 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1ca10 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
1ca20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
1ca30 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
1ca40 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Path);.#endif.  
1ca50 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
1ca60 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70  -1;.    pDbFd->p
1ca70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
1ca80 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20  = pShmNode;.    
1ca90 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
1caa0 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
1cab0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
1cac0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1cad0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1cae0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
1caf0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1cb00 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
1cb10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cb20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1cb30 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1cb40 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 68 6d 4e      }..    pShmN
1cb50 6f 64 65 2d 3e 68 20 3d 20 6f 70 65 6e 28 7a 53  ode->h = open(zS
1cb60 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  hmFilename, O_RD
1cb70 57 52 7c 4f 5f 43 52 45 41 54 2c 20 28 73 53 74  WR|O_CREAT, (sSt
1cb80 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37  at.st_mode & 077
1cb90 37 29 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  7));.    if( pSh
1cba0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
1cbb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cbc0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
1cbd0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1cbe0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
1cbf0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1cc00 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
1cc10 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
1cc20 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
1cc30 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20  itch..    ** If 
1cc40 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68  not, truncate th
1cc50 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
1cc60 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20  ength. .    */. 
1cc70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1cc80 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 53  K;.    if( unixS
1cc90 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1cca0 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20  mNode, F_WRLCK, 
1ccb0 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
1ccc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ccd0 20 20 20 20 20 69 66 28 20 66 74 72 75 6e 63 61       if( ftrunca
1cce0 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
1ccf0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  0) ){.        rc
1cd00 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1cd10 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d  SHMOPEN;.      }
1cd20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1cd30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cd40 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
1cd50 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1cd60 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
1cd70 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
1cd80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cd90 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
1cda0 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  en_err;.  }..  /
1cdb0 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
1cdc0 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
1cdd0 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d  d of the unixShm
1cde0 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
1cdf0 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
1ce00 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1ce10 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
1ce20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
1ce30 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
1ce40 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
1ce50 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
1ce60 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  = p;.  unixLeave
1ce70 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
1ce80 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
1ce90 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
1cea0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1ceb0 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
1cec0 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
1ced0 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65   of the unixEnte
1cee0 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
1cef0 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
1cf00 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
1cf10 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d   (struct unixShm
1cf20 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
1cf30 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
1cf40 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
1cf50 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
1cf60 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
1cf70 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
1cf80 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
1cf90 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
1cfa0 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
1cfb0 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
1cfc0 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
1cfd0 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
1cfe0 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
1cff0 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
1d000 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1d010 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1d020 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
1d030 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1d040 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
1d050 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
1d060 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1d070 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1d080 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d090 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
1d0a0 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
1d0b0 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
1d0c0 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72  rr:.  unixShmPur
1d0d0 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20  ge(pDbFd);      
1d0e0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
1d0f0 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
1d100 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
1d110 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1d120 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1d130 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d140 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1d150 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d160 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
1d170 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
1d180 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
1d190 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1d1a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d1b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d1c0 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
1d1d0 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
1d1e0 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
1d1f0 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
1d200 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
1d210 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
1d220 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
1d230 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1d240 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1d250 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1d260 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1d270 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1d280 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1d290 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45  rwise, if the bE
1d2a0 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20  xtend parameter 
1d2b0 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1d2c0 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1d2d0 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1d2e0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1d2f0 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1d300 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1d310 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1d320 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1d330 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1d340 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1d350 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1d360 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45  urned. If .** bE
1d370 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  xtend is non-zer
1d380 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
1d390 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1d3a0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
1d3b0 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
1d3c0 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
1d3d0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
1d3e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
1d3f0 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
1d400 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
1d410 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
1d420 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
1d430 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
1d440 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
1d450 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
1d460 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
1d470 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1d480 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
1d490 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
1d4a0 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
1d4b0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1d4c0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
1d4d0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
1d4e0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1d4f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1d500 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  nixShmMap(.  sql
1d510 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d530 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
1d540 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1d550 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
1d580 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
1d590 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d5b0 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
1d5c0 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64  */.  int bExtend
1d5d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d5e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1d5f0 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
1d600 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
1d610 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d630 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
1d640 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ory */.){.  unix
1d650 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
1d660 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
1d670 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69  nixShm *p;.  uni
1d680 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
1d690 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
1d6a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1d6b0 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
1d6c0 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f  mory file has no
1d6d0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
1d6e0 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
1d6f0 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e  */.  if( pDbFd->
1d700 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pShm==0 ){.    r
1d710 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  c = unixOpenShar
1d720 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
1d730 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d740 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1d750 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70  rc;.  }..  p = p
1d760 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53  DbFd->pShm;.  pS
1d770 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1d780 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Node;.  sqlite3_
1d790 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1d7a0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1d7b0 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
1d7c0 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
1d7d0 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
1d7e0 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
1d7f0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1d800 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
1d810 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
1d820 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
1d830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d840 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72  ew apRegion[] ar
1d850 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
1d860 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
1d870 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a  1)*szRegion;  /*
1d880 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
1d890 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1d8a0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
1d8b0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
1d8c0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
1d8d0 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20   fstat() */..   
1d8e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
1d8f0 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
1d900 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
1d910 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
1d920 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
1d930 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1d940 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
1d950 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
1d960 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
1d970 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
1d980 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
1d990 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  x file is.    **
1d9a0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
1d9b0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
1d9c0 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
1d9d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
1d9e0 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  stat(pShmNode->h
1d9f0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
1da00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1da10 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
1da20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1da30 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
1da40 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69   if( sStat.st_si
1da50 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  ze<nByte ){.    
1da60 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1da70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1da80 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
1da90 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
1daa0 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  et to.      ** f
1dab0 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
1dac0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
1dad0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1dae0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1daf0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1db00 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
1db10 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73  y, if bExtend is
1db20 20 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e   true, use ftrun
1db30 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
1db40 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
1db50 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1db60 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
1db70 2f 0a 20 20 20 20 20 20 69 66 28 20 21 62 45 78  /.      if( !bEx
1db80 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70  tend ) goto shmp
1db90 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 69  age_out;.      i
1dba0 66 28 20 66 74 72 75 6e 63 61 74 65 28 70 53 68  f( ftruncate(pSh
1dbb0 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29  mNode->h, nByte)
1dbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1dbd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1dbe0 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67  MSIZE;.        g
1dbf0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1dc00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1dc10 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
1dc20 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1dc30 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
1dc40 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1dc50 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
1dc60 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   apNew = (char *
1dc70 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1dc80 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
1dc90 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28  ode->apRegion, (
1dca0 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
1dcb0 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
1dcc0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
1dcd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1dce0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1dcf0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1dd00 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1dd10 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
1dd20 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1dd30 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f      while(pShmNo
1dd40 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1dd50 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69  gion){.      voi
1dd60 64 20 2a 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30  d *pMem = mmap(0
1dd70 2c 20 73 7a 52 65 67 69 6f 6e 2c 20 50 52 4f 54  , szRegion, PROT
1dd80 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45  _READ|PROT_WRITE
1dd90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4d 41 50  , .          MAP
1dda0 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
1ddb0 65 2d 3e 68 2c 20 69 52 65 67 69 6f 6e 2a 73 7a  e->h, iRegion*sz
1ddc0 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 29 3b 0a  Region.      );.
1ddd0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
1dde0 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
1ddf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1de00 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
1de10 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1de20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1de30 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
1de40 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
1de50 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20  egion] = pMem;. 
1de60 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
1de70 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
1de80 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
1de90 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
1dea0 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
1deb0 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
1dec0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
1ded0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
1dee0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1def0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1df00 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1df10 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1df20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1df30 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
1df40 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
1df50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1df60 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
1df70 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
1df80 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
1df90 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
1dfa0 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
1dfb0 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
1dfc0 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
1dfd0 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
1dfe0 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
1dff0 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
1e000 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
1e010 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
1e020 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
1e030 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
1e040 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
1e050 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
1e060 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
1e070 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
1e080 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
1e090 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1e0a0 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
1e0b0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1e0c0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e0d0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
1e0e0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1e0f0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e110 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
1e120 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1e130 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e160 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
1e170 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
1e180 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
1e190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1e1a0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1e1b0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
1e1c0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
1e1d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
1e1e0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1e1f0 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
1e200 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
1e210 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
1e220 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
1e230 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1e240 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
1e250 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
1e260 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1e290 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
1e2a0 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
1e2b0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1e2c0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
1e2d0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1e2e0 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
1e2f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e300 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
1e310 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1e320 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
1e330 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
1e360 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
1e370 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
1e380 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
1e390 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
1e3a0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
1e3b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
1e3c0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
1e3d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
1e3e0 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
1e3f0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
1e400 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
1e410 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1e420 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1e430 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1e440 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1e450 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1e460 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1e470 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
1e480 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
1e490 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1e4a0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1e4b0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1e4c0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1e4d0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1e4e0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1e4f0 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
1e500 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1e510 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1e520 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1e530 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
1e540 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
1e550 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73   (1<<ofst);.  as
1e560 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
1e570 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
1e580 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e590 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1e5a0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
1e5b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1e5c0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
1e5d0 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
1e5e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
1e5f0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1e600 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
1e610 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
1e620 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
1e630 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
1e640 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1e650 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1e660 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1e670 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
1e680 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
1e690 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1e6a0 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
1e6b0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
1e6c0 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
1e6d0 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
1e6e0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
1e6f0 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
1e700 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
1e710 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
1e720 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
1e730 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
1e740 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1e750 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c  (pShmNode, F_UNL
1e760 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
1e770 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1e780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1e790 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1e7a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
1e7b0 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
1e7c0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1e7d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e7e0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
1e7f0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
1e800 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
1e810 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
1e820 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
1e830 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1e840 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
1e850 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
1e860 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
1e870 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
1e880 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
1e890 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
1e8a0 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
1e8b0 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
1e8c0 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
1e8d0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1e8e0 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
1e8f0 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
1e900 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
1e910 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
1e920 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
1e930 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
1e940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1e950 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1e960 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1e970 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1e980 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
1e990 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
1e9a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1e9b0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1e9c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1e9d0 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
1e9e0 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
1e9f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1ea00 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
1ea10 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1ea20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
1ea30 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
1ea40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ea50 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
1ea60 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
1ea70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ea80 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1ea90 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
1eaa0 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
1eab0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1eac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ead0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1eae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1eaf0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
1eb00 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
1eb10 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1eb20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1eb30 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
1eb40 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1eb50 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1eb60 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
1eb70 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1eb80 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
1eb90 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
1eba0 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
1ebb0 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
1ebc0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
1ebd0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
1ebe0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1ebf0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1ec00 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1ec10 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1ec20 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1ec30 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
1ec40 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
1ec50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1ec60 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1ec70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ec80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1ec90 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
1eca0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
1ecb0 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
1ecc0 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
1ecd0 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
1ece0 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
1ecf0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
1ed00 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
1ed10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
1ed20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ed30 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
1ed40 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1ed50 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f  Node, F_WRLCK, o
1ed60 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
1ed70 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
1ed80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ed90 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1eda0 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
1edb0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
1edc0 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
1edd0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1ede0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1edf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1ee00 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
1ee10 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
1ee20 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
1ee30 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
1ee40 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
1ee50 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
1ee60 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61  getpid(), p->sha
1ee70 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
1ee80 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e  Mask));.  return
1ee90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1eea0 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1eeb0 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1eec0 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1eed0 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
1eee0 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
1eef0 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
1ef00 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
1ef10 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
1ef20 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
1ef30 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
1ef40 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
1ef50 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1ef60 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  id unixShmBarrie
1ef70 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
1ef80 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20  e *fd           
1ef90 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1efa0 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
1efb0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1efc0 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
1efd0 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1efe0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1eff0 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
1f000 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
1f010 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
1f020 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
1f030 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
1f040 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
1f050 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
1f060 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
1f070 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
1f080 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
1f090 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f0a0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1f0b0 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
1f0c0 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
1f0d0 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
1f0e0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
1f0f0 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
1f100 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1f110 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1f120 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
1f130 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1f140 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f160 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
1f170 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
1f180 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1f1b0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
1f1c0 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
1f1d0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
1f1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f1f0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
1f200 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
1f210 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
1f220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f230 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1f240 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
1f250 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
1f260 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f280 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1f290 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1f2a0 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
1f2b0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
1f2c0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1f2d0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1f2e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f2f0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
1f300 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
1f310 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
1f320 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
1f330 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
1f340 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
1f350 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
1f360 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
1f370 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
1f380 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
1f390 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
1f3a0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
1f3b0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
1f3c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1f3d0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1f3e0 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
1f3f0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1f400 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
1f410 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
1f420 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
1f430 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
1f440 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
1f450 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1f460 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
1f470 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1f480 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1f490 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1f4a0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
1f4b0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
1f4c0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
1f4d0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1f4e0 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
1f4f0 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
1f500 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1f510 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
1f520 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
1f530 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
1f540 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
1f550 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
1f560 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65  {.    if( delete
1f570 46 6c 61 67 20 29 20 75 6e 6c 69 6e 6b 28 70 53  Flag ) unlink(pS
1f580 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1f590 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50  e);.    unixShmP
1f5a0 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d  urge(pDbFd);.  }
1f5b0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
1f5c0 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
1f5d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65  QLITE_OK;.}...#e
1f5e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
1f5f0 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  xShmMap     0.# 
1f600 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f  define unixShmLo
1f610 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
1f620 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20   unixShmBarrier 
1f630 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
1f640 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
1f650 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
1f660 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
1f670 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
1f680 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
1f690 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
1f6a0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
1f6b0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1f6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
1f6d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
1f6e0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1f6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f700 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1f710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f750 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
1f760 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
1f770 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
1f780 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
1f790 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
1f7a0 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
1f7b0 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
1f7c0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
1f7d0 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
1f7e0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
1f7f0 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
1f800 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
1f810 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
1f820 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
1f830 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
1f840 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1f850 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
1f860 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1f870 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
1f880 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
1f890 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
1f8a0 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
1f8b0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
1f8c0 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
1f8d0 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
1f8e0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
1f8f0 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
1f900 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
1f910 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
1f920 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1f930 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
1f940 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
1f950 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
1f960 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
1f970 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
1f980 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
1f990 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
1f9a0 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
1f9b0 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
1f9c0 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
1f9d0 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
1f9e0 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
1f9f0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
1fa00 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
1fa10 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
1fa20 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
1fa30 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
1fa40 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
1fa50 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
1fa60 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
1fa70 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
1fa80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
1fa90 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
1faa0 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
1fab0 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
1fac0 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
1fad0 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
1fae0 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
1faf0 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
1fb00 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
1fb10 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
1fb20 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
1fb30 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
1fb40 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
1fb50 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
1fb60 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
1fb70 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
1fb80 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
1fb90 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
1fba0 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
1fbb0 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
1fbc0 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
1fbd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
1fbe0 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
1fbf0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1fc00 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
1fc10 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
1fc20 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
1fc30 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
1fc40 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
1fc50 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
1fc60 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
1fc70 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
1fc80 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
1fc90 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
1fca0 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
1fcb0 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
1fcc0 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
1fcd0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
1fce0 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
1fcf0 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
1fd00 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
1fd10 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20  OCK, CKLOCK)    
1fd20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
1fd30 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1fd40 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20   \.   VERSION,  
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd90 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fe10 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fe60 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fe80 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1feb0 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fed0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1ff00 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1ff50 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ff70 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
1ffa0 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
1ffb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1ffc0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
1fff0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
20000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
20010 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
20040 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
20050 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
20060 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
20070 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
20080 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
20090 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
200a0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
200b0 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
200e0 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
200f0 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
20100 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
20130 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20140 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
20150 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20170 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
20180 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
20190 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
201a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c     \.   unixShmL
201d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
201e0 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
201f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20210 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61    \.   unixShmBa
20220 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
20230 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
20240 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d   \.   unixShmUnm
20270 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
20280 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
20290 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20300 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
20310 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
20320 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
20330 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
20340 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
20350 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
20360 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
20370 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
203a0 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
20440 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
20450 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
20460 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
20470 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
20480 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
20490 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
204a0 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
204b0 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
204c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
204d0 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
204e0 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
204f0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
20500 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
20510 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
20520 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
20530 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
20540 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
20550 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
20560 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
20570 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
20580 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
20590 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
205a0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
205b0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
205c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20   name */.  2,   
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
205f0 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64  emory is enabled
20600 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20620 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
20630 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
20660 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20680 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
20690 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
206a0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
206b0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
206c0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
206d0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
206e0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
206f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
20700 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
20710 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
20720 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
20730 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
20740 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
20750 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20770 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
20780 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
20790 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
207b0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
207c0 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
207e0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
207f0 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
20800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20810 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
20820 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
20830 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20  servedLock   /* 
20840 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
20850 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
20860 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
20870 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
20880 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
20890 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
208a0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
208b0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
208c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
208d0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
208e0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20900 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
20910 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
20920 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
20930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
20940 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
20950 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
20960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
20970 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
20980 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
20990 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
209a0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
209b0 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
209c0 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68  rvedLock  /* xCh
209d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
209e0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
209f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
20a00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
20a10 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45  !OS_VXWORKS.IOME
20a20 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
20a30 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
20a40 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
20a50 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
20a60 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
20a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
20a80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
20a90 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
20aa0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
20ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
20ac0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
20ad0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
20ae0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
20af0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
20b00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
20b10 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
20b20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
20b30 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
20b40 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
20b50 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
20b60 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
20b70 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
20b80 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
20b90 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
20ba0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
20bb0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
20bc0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
20bd0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
20be0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
20bf0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
20c00 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
20c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
20c20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
20c30 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
20c40 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c60 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
20c70 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
20c80 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20   semClose,      
20c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
20ca0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
20cb0 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20   semLock,       
20cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
20cd0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
20ce0 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  semUnlock,      
20cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
20d00 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
20d10 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
20d20 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
20d30 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
20d40 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
20d50 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
20d60 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
20d70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
20d80 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
20d90 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
20da0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
20db0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
20dc0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
20dd0 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
20de0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
20df0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
20e00 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
20e10 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
20e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
20e30 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
20e40 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43  sabled */.  afpC
20e50 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
20e60 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
20e70 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
20e80 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
20e90 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
20ea0 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
20eb0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
20ec0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
20ed0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
20ee0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
20ef0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
20f00 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
20f10 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
20f20 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
20f30 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
20f40 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
20f50 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
20f60 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
20f70 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
20f80 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
20f90 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
20fa0 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
20fb0 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
20fc0 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
20fd0 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
20fe0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
20ff0 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
21000 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
21010 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
21020 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
21030 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
21040 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
21050 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
21060 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
21070 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
21080 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
21090 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
210a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
210b0 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
210c0 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
210d0 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
210e0 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
210f0 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
21100 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
21110 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
21120 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
21130 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
21140 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
21150 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
21160 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
21170 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
21180 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
21190 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
211a0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
211b0 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
211c0 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
211d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
211e0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
211f0 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
21200 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
21210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
21220 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
21230 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
21240 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
21250 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
21260 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
21270 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
212a0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
212b0 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
212d0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
212e0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21300 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
21310 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21330 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
21340 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
21350 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
21360 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
21370 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
21380 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c  #endif../* nfs l
21390 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33  ockd on OSX 10.3
213a0 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20  + doesn't clear 
213b0 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e  write locks when
213c0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
213d0 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  set */.#if defin
213e0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
213f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
21400 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
21410 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46  ETHODS(.  nfsIoF
21420 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
21430 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
21440 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
21450 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20    nfsIoMethods, 
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21470 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
21480 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
21490 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
214b0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
214c0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
214d0 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
214e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
214f0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
21500 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21520 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
21530 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20    nfsUnlock,    
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21550 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
21560 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
21570 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
21580 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
21590 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
215a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
215b0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
215c0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
215d0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
215e0 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
215f0 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
21600 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
21610 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
21620 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
21630 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
21640 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
21650 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
21660 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
21670 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
21680 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
21690 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
216a0 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
216b0 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c  s for MacOSX onl
216c0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
216d0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
216e0 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
216f0 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
21700 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
21710 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
21720 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21730 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
21740 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
21750 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20     /* open file 
21760 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64  object for the d
21770 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
21780 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
21790 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67  t struct Mapping
217a0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
217b0 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  r *zFilesystem; 
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
217d0 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  Filesystem type 
217e0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  name */.    cons
217f0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
21800 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20  hods *pMethods; 
21810 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65    /* Appropriate
21820 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
21830 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20  */.  } aMap[] = 
21840 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20  {.    { "hfs",  
21850 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
21860 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  s },.    { "ufs"
21870 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
21880 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61  hods },.    { "a
21890 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  fpfs",  &afpIoMe
218a0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
218b0 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  smbfs",  &afpIoM
218c0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
218d0 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63  "webdav", &noloc
218e0 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  kIoMethods },.  
218f0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
21900 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
21910 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
21920 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
21930 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
21940 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
21950 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
21960 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
21970 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
21980 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
21990 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
219a0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
219b0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
219c0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
219d0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
219e0 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28   }.  if( statfs(
219f0 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66  filePath, &fsInf
21a00 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) != -1 ){.    
21a10 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
21a20 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20  gs & MNT_RDONLY 
21a30 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21a40 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
21a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
21a60 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  i=0; aMap[i].zFi
21a70 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a  lesystem; i++){.
21a80 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
21a90 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
21aa0 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46  name, aMap[i].zF
21ab0 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b  ilesystem)==0 ){
21ac0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21ad0 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73  aMap[i].pMethods
21ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21af0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c    }..  /* Defaul
21b00 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c  t case. Handles,
21b10 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c   amongst others,
21b20 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73   "nfs"..  ** Tes
21b30 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
21b40 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
21b50 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
21b60 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
21b70 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
21b80 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
21b90 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
21ba0 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
21bb0 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
21bc0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
21bd0 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
21be0 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
21bf0 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
21c00 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
21c10 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74  DLCK;.  if( fcnt
21c20 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
21c30 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
21c40 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
21c50 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
21c60 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
21c70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
21c80 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
21c90 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
21ca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
21cb0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
21cc0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
21cd0 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
21ce0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
21cf0 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
21d00 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
21d10 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
21d20 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
21d30 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
21d40 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
21d50 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
21d60 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
21d70 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
21d80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
21d90 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
21da0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
21db0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
21dc0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
21dd0 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
21de0 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
21df0 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
21e00 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
21e10 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
21e20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
21e30 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
21e40 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
21e50 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
21e60 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
21e70 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
21e80 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
21e90 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
21ea0 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
21eb0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
21ec0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
21ed0 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
21ee0 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
21ef0 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
21f00 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
21f10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21f20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
21f30 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
21f40 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
21f50 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
21f60 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
21f70 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
21f80 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
21f90 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
21fa0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
21fb0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
21fc0 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
21fd0 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
21fe0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
21ff0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
22000 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
22010 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
22020 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
22030 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
22040 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
22050 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
22060 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
22070 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
22080 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
22090 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
220a0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
220b0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
220c0 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
220d0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
220e0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
220f0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
22100 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66  F_RDLCK;.  if( f
22110 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
22120 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
22130 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
22140 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
22150 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
22160 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
22170 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
22180 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
22190 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
221a0 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
221b0 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
221c0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
221d0 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
221e0 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
221f0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
22200 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  S && SQLITE_ENAB
22210 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22220 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
22230 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
22240 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49  a pointer to a I
22250 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
22260 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
22270 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
22280 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
22290 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
222a0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
222b0 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
222c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
222d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
222e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
222f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22300 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
22310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22320 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
22330 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
22340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22350 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
22360 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
22370 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
22380 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
22390 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
223a0 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
223b0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
223c0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
223d0 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
223e0 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
223f0 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
22400 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
22410 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
22420 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
22430 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
22440 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
22450 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
22460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
22470 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
22480 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
22490 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
224a0 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20 20  dirfd,          
224b0 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
224c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
224d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
224e0 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
224f0 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
22500 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
22510 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
22520 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
22530 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
22540 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
22550 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  ned */.  int noL
22560 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
22570 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67   /* Omit locking
22580 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
22590 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 20  t isDelete      
225a0 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
225b0 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65  on close if true
225c0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
225d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
225e0 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
225f0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
22600 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
22610 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
22620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
22630 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
22640 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
22650 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 44  /* Parameter isD
22660 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75 73  elete is only us
22670 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45  ed on vxworks. E
22680 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70 6c  xpress this expl
22690 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72  icitly .  ** her
226a0 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d  e to prevent com
226b0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
226c0 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
226d0 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55  meters..  */.  U
226e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
226f0 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20 4f 53  isDelete);..  OS
22700 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
22710 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
22720 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
22730 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
22740 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64  w->dirfd = dirfd
22750 3b 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65 46 6c  ;.  pNew->fileFl
22760 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ags = 0;.  asser
22770 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
22780 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
22790 3d 27 2f 27 20 29 3b 20 20 2f 2a 20 4e 65 76 65  ='/' );  /* Neve
227a0 72 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  r a relative pat
227b0 68 6e 61 6d 65 20 2a 2f 0a 20 20 70 4e 65 77 2d  hname */.  pNew-
227c0 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
227d0 6d 65 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  me;..#if OS_VXWO
227e0 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
227f0 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
22800 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
22810 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
22820 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b  =0 ){.    noLock
22830 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
22840 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
22850 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
22860 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  oLock ){.    pLo
22870 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
22880 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
22890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
228a0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
228b0 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
228c0 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
228d0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
228e0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
228f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
22900 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
22910 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
22920 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
22930 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
22940 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
22950 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
22960 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
22970 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
22980 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
22990 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
229a0 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
229b0 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
229c0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
229d0 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
229e0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
229f0 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
22a00 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
22a10 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
22a20 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
22a30 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
22a40 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
22a50 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
22a60 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
22a70 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
22a80 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
22a90 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
22aa0 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
22ab0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
22ac0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
22ad0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
22ae0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
22af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22b00 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
22b10 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69  or occured in fi
22b20 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63  ndInodeInfo(), c
22b30 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
22b40 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a  scriptor.      *
22b50 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62  * immediately, b
22b60 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20  efore releasing 
22b70 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49  the mutex. findI
22b80 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66  nodeInfo() may f
22b90 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ail.      ** in 
22ba0 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20  two scenarios:. 
22bb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22bc0 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f     (a) A call to
22bd0 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e   fstat() failed.
22be0 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20  .      **   (b) 
22bf0 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e  A malloc failed.
22c00 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22c10 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20  ** Scenario (b) 
22c20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  may only occur i
22c30 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73  f the process is
22c40 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65   holding no othe
22c50 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
22c60 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
22c70 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
22c80 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65  e. If there were
22c90 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20   other file.    
22ca0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73    ** descriptors
22cb0 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74   on this file, t
22cc0 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f  hen no malloc wo
22cd0 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20  uld be required 
22ce0 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64  by.      ** find
22cf0 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20  InodeInfo(). If 
22d00 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
22d10 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61  , it is quite sa
22d20 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20  fe to close.    
22d30 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20    ** handle h - 
22d40 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  as it is guarant
22d50 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69  eed that no posi
22d60 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20  x locks will be 
22d70 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a  released.      *
22d80 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20  * by doing so.. 
22d90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22da0 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29   If scenario (a)
22db0 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f   caused the erro
22dc0 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72  r then things ar
22dd0 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54  e not so safe. T
22de0 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
22df0 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20  icit assumption 
22e00 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20  here is that if 
22e10 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74  fstat() fails, t
22e20 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20  hings are in.   
22e30 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73     ** such bad s
22e40 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69  hape that droppi
22e50 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f  ng a lock or two
22e60 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
22e70 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  much..      */. 
22e80 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20       close(h);. 
22e90 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
22ea0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
22eb0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
22ec0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22ed0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
22ee0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
22ef0 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
22f00 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
22f10 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
22f20 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
22f30 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
22f40 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
22f50 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
22f60 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
22f70 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
22f80 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
22f90 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
22fa0 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
22fb0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
22fc0 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
22fd0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
22fe0 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66  *pCtx) );.    if
22ff0 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
23000 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
23010 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
23020 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
23030 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
23040 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
23050 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
23060 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
23070 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
23080 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
23090 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
230a0 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
230b0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
230c0 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
230d0 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
230e0 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
230f0 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72  e;.      pCtx->r
23100 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20  eserved = 0;.   
23110 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
23120 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
23130 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
23140 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
23150 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
23160 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66  Inode);.      if
23170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23180 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23190 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f  e3_free(pNew->lo
231a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
231b0 20 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b         close(h);
231c0 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  .        h = -1;
231d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
231e0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
231f0 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20          .    }. 
23200 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73   }.#endif..  els
23210 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
23220 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  yle == &dotlockI
23230 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
23240 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  /* Dotfile locki
23250 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
23260 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
23270 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
23280 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   in.    ** the d
23290 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
232a0 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20  text .    */.   
232b0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
232c0 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e  ;.    int nFilen
232d0 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  ame;.    nFilena
232e0 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
232f0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
23300 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
23310 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
23320 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
23330 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
23340 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
23350 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
23360 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
23370 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
23380 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
23390 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
233a0 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
233b0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
233c0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
233d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
233e0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
233f0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
23400 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
23410 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
23420 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
23430 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
23440 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
23450 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
23460 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
23470 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
23480 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
23490 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
234a0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
234b0 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
234c0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
234d0 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
234e0 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
234f0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
23500 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
23510 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
23520 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
23530 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
23540 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
23550 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
23560 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
23570 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
23580 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
23590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
235a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
235b0 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
235c0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
235d0 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
235e0 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
235f0 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
23600 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
23610 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
23620 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
23630 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
23640 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
23650 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
23660 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
23670 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
23680 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
23690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
236a0 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
236b0 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
236c0 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
236d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
236e0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
236f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
23700 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
23710 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57   = 0;.#if OS_VXW
23720 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
23730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23740 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65  if( h>=0 ) close
23750 28 68 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  (h);.    h = -1;
23760 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
23770 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65  ename);.    isDe
23780 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lete = 0;.  }.  
23790 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d  pNew->isDelete =
237a0 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69   isDelete;.#endi
237b0 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
237c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
237d0 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73   dirfd>=0 ) clos
237e0 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c  e(dirfd); /* sil
237f0 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  ent leak if fail
23800 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72  , already in err
23810 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 3e  or */.    if( h>
23820 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a 20  =0 ) close(h);. 
23830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
23840 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
23850 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
23860 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
23870 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
23890 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
238a0 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
238b0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
238c0 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
238d0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
238e0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
238f0 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
23900 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
23910 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
23920 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
23930 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
23940 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
23950 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
23960 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
23970 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
23980 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
23990 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
239a0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
239b0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
239c0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
239d0 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
239e0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
239f0 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
23a00 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
23a10 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
23a20 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
23a30 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
23a40 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
23a50 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
23a60 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
23a70 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
23a80 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
23a90 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
23aa0 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
23ab0 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
23ac0 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
23ad0 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
23ae0 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61  ; ii>1 && zDirna
23af0 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
23b00 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
23b10 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
23b20 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
23b30 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
23b40 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
23b50 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
23b60 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65  ( fd>=0 ){.#ifde
23b70 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20  f FD_CLOEXEC.   
23b80 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53     fcntl(fd, F_S
23b90 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20  ETFD, fcntl(fd, 
23ba0 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
23bb0 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
23bc0 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
23bd0 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
23be0 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
23bf0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
23c00 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72    *pFd = fd;.  r
23c10 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c  eturn (fd>=0?SQL
23c20 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41  ITE_OK:SQLITE_CA
23c30 4e 54 4f 50 45 4e 5f 42 4b 50 54 29 3b 0a 7d 0a  NTOPEN_BKPT);.}.
23c40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
23c50 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  e name of a dire
23c60 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74  ctory in which t
23c70 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20  o put temporary 
23c80 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  files..** If no 
23c90 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61  suitable tempora
23ca0 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72  ry file director
23cb0 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  y can be found, 
23cc0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
23cd0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
23ce0 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44  r *unixTempFileD
23cf0 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ir(void){.  stat
23d00 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
23d10 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
23d20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
23d30 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
23d40 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
23d50 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
23d60 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
23d70 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
23d80 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
23d90 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
23da0 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
23db0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
23dc0 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ..  azDirs[0] = 
23dd0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
23de0 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61  ectory;.  if( !a
23df0 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
23e00 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[1] = getenv("T
23e10 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69  MPDIR");.  for(i
23e20 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
23e30 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
23e40 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44  rs[0]); zDir=azD
23e50 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69  irs[i++]){.    i
23e60 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e  f( zDir==0 ) con
23e70 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
23e80 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
23e90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23ea0 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
23eb0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
23ec0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63  inue;.    if( ac
23ed0 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29  cess(zDir, 07) )
23ee0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62   continue;.    b
23ef0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
23f00 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zDir;.}../*.*
23f10 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
23f20 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
23f30 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
23f40 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
23f50 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
23f60 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75  g process and mu
23f70 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
23f80 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73   to hold at leas
23f90 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74  t.** pVfs->mxPat
23fa0 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a  hname bytes..*/.
23fb0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
23fc0 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
23fd0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
23fe0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
23ff0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
24000 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
24010 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
24020 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
24030 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
24040 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
24050 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
24060 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
24070 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  j;.  const char 
24080 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27  *zDir;..  /* It'
24090 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
240a0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
240b0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
240c0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
240d0 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
240e0 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
240f0 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
24100 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
24110 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
24120 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
24130 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
24140 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
24150 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44  E_IOERR );..  zD
24160 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c  ir = unixTempFil
24170 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44  eDir();.  if( zD
24180 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22  ir==0 ) zDir = "
24190 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  .";..  /* Check 
241a0 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
241b0 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
241c0 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
241d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
241e0 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
241f0 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
24200 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
24210 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
24220 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
24230 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
24240 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d  PREFIX) + 17) >=
24250 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b   (size_t)nBuf ){
24260 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24270 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
24280 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
24290 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
242a0 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  7, zBuf, "%s/"SQ
242b0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
242c0 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
242d0 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    j = (int)strle
242e0 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
242f0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
24300 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
24310 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
24320 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
24330 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
24340 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
24350 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
24360 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
24370 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
24380 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
24390 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
243a0 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
243b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
243c0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
243d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
243e0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
243f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
24400 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
24410 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
24420 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
24430 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
24440 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
24450 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
24460 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
24470 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
24480 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
24490 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
244a0 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
244b0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
244c0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
244d0 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
244e0 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
244f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
24500 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
24510 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
24520 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
24530 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
24540 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
24550 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
24560 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
24570 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
24580 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
24590 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
245a0 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
245b0 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
245c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
245d0 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
245e0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
245f0 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
24600 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
24610 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
24620 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
24630 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
24640 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
24650 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
24660 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
24670 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
24680 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
24690 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
246a0 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
246b0 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
246c0 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
246d0 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
246e0 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
246f0 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
24700 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
24710 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
24720 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
24730 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
24740 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
24750 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
24760 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
24770 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
24780 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
24790 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
247a0 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
247b0 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
247c0 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
247d0 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
247e0 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
247f0 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
24800 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
24810 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
24820 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
24830 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
24840 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
24850 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
24860 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
24870 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
24880 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
24890 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
248a0 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
248b0 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
248c0 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
248d0 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
248e0 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
248f0 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
24900 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
24910 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
24920 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
24930 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
24940 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
24950 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
24960 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
24970 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
24980 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
24990 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
249a0 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
249b0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
249c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
249d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
249e0 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
249f0 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  /..  /* A stat()
24a00 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
24a10 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
24a20 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
24a30 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
24a40 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
24a50 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
24a60 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
24a70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
24a80 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
24a90 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
24aa0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
24ab0 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
24ac0 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
24ad0 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
24ae0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
24af0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
24b00 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
24b10 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
24b20 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
24b30 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
24b40 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
24b50 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
24b60 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
24b70 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
24b80 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
24b90 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
24ba0 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
24bb0 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
24bc0 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20   resusable file 
24bd0 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
24be0 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
24bf0 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68  f( 0==stat(zPath
24c00 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
24c10 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
24c20 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69  pInode;..    uni
24c30 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
24c40 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
24c50 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
24c60 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
24c70 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
24c80 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ca0 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
24cb0 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e  leId.ino!=sStat.
24cc0 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20  st_ino) ){.     
24cd0 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
24ce0 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  e->pNext;.    }.
24cf0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29      if( pInode )
24d00 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
24d10 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
24d20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d   for(pp=&pInode-
24d30 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26  >pUnused; *pp &&
24d40 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66   (*pp)->flags!=f
24d50 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29  lags; pp=&((*pp)
24d60 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
24d70 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a   pUnused = *pp;.
24d80 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65        if( pUnuse
24d90 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  d ){.        *pp
24da0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78   = pUnused->pNex
24db0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
24dc0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
24dd0 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
24de0 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
24df0 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
24e00 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
24e10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24e20 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
24e30 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65  unixOpen() to de
24e40 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
24e50 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
24e60 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69  to create new fi
24e70 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20  les with. If no 
24e80 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
24e90 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
24ea0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
24eb0 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65  a value suitable
24ec0 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20   for passing as 
24ed0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
24ee0 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73  nt to open(2) is
24ef0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
24f00 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20  pMode. If an IO 
24f10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
24f20 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
24f30 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
24f40 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
24f50 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f   of *pMode is no
24f60 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  t modified..**.*
24f70 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 62 65  * If the file be
24f80 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20  ing opened is a 
24f90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20  temporary file, 
24fa0 69 74 20 69 73 20 61 6c 77 61 79 73 20 63 72 65  it is always cre
24fb0 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
24fc0 20 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f   octal permissio
24fd0 6e 73 20 30 36 30 30 20 28 72 65 61 64 2f 77 72  ns 0600 (read/wr
24fe0 69 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20  itable by owner 
24ff0 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69  only). If the fi
25000 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62  le.** is a datab
25010 61 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f  ase or master jo
25020 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69  urnal file, it i
25030 73 20 63 72 65 61 74 65 64 20 77 69 74 68 20 74  s created with t
25040 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  he permissions .
25050 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44  ** mask SQLITE_D
25060 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
25070 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46  ISSIONS..**.** F
25080 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66  inally, if the f
25090 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
250a0 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67   is a WAL or reg
250b0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
250c0 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
250d0 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65   function querie
250e0 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
250f0 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73  m for the permis
25100 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a  sions on the .**
25110 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
25120 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
25130 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20   sets *pMode to 
25140 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
25150 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c  ever .** possibl
25160 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e  e, WAL and journ
25170 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  al files are cre
25180 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ated using the s
25190 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ame permissions 
251a0 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63  .** as the assoc
251b0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
251c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
251d0 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c  nt findCreateFil
251e0 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
251f0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
25200 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
25210 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62   of file (possib
25220 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65  ly) being create
25230 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  d */.  int flags
25240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25250 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
25260 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72  passed as 4th ar
25270 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28  gument to xOpen(
25280 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70  ) */.  mode_t *p
25290 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
252a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
252b0 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70  ermissions to op
252c0 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  en file with */.
252d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
252e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
252f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
25300 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61  ode */.  if( fla
25310 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
25320 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
25330 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
25340 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
25350 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
25360 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
25370 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
25380 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
253b0 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
253c0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
253d0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
253e0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
253f0 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
25400 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
25410 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53    nDb = sqlite3S
25420 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d  trlen30(zPath) -
25430 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
25440 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 3f 20 34 20  E_OPEN_WAL) ? 4 
25450 3a 20 38 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  : 8);.    memcpy
25460 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62  (zDb, zPath, nDb
25470 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20  );.    zDb[nDb] 
25480 3d 20 27 5c 30 27 3b 0a 20 20 20 20 69 66 28 20  = '\0';.    if( 
25490 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26 73 53  0==stat(zDb, &sS
254a0 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  tat) ){.      *p
254b0 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
254c0 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
254d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
254e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
254f0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
25500 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
25510 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
25520 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
25530 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
25540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
25550 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
25560 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
25570 53 53 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 72 65  SSIONS;.  }.  re
25580 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25590 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
255a0 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
255b0 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
255c0 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
255d0 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
255e0 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
255f0 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
25600 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
25610 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
25620 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
25630 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
25640 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
25650 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
25660 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
25670 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
25680 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
25690 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
256a0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
256b0 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
256c0 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
256d0 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
256e0 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
256f0 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
25700 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
25710 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
25720 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
25730 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
25740 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
25750 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
25760 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
25770 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
25780 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
25790 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
257a0 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
257b0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
257c0 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
257d0 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
257e0 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
257f0 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
25800 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
25810 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
25820 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
25830 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
25840 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
25850 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
25860 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
25870 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
25880 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
25890 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
258a0 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
258b0 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
258c0 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
258d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
258e0 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
258f0 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
25900 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
25910 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25920 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
25930 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
25940 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
25950 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
25960 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
25970 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
25980 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
25990 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
259a0 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
259b0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
259c0 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
259d0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
259e0 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
259f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
25a00 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65  unixFile *)pFile
25a10 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
25a40 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62  iptor returned b
25a50 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  y open() */.  in
25a60 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  t dirfd = -1;   
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a80 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
25a90 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
25aa0 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
25ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25ac0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
25ad0 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
25ae0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
25af0 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
25b00 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
25b10 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
25b20 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
25b30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
25b40 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
25b50 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
25b60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25b70 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
25b80 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
25b90 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e  rn Code */..  in
25ba0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
25bb0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25bc0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
25bd0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
25be0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
25bf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
25c00 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
25c10 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
25c20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25c30 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
25c40 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
25c50 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
25c60 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
25c70 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
25c80 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
25c90 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
25ca0 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
25cb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25cc0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
25cd0 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
25ce0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
25cf0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
25d00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
25d10 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
25d20 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
25d30 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
25d40 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
25d50 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
25d60 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
25d70 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
25d80 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
25d90 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
25da0 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
25db0 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
25dc0 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
25dd0 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
25de0 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  )d..  */.  int i
25df0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d  sOpenDirectory =
25e00 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
25e10 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
25e20 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
25e30 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
25e40 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
25e50 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
25e60 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
25e70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
25e80 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
25e90 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
25ea0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
25eb0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
25ec0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
25ed0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
25ee0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
25ef0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
25f00 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
25f10 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
25f20 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
25f30 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20  _PATHNAME+1];.  
25f40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
25f50 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
25f60 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
25f70 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
25f80 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
25f90 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
25fa0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
25fb0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
25fc0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
25fd0 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
25fe0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
25ff0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
26000 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
26010 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
26020 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
26030 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
26040 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
26050 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
26060 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
26070 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
26080 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
26090 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
260a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
260b0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
260c0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
260d0 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
260e0 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
260f0 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
26100 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
26110 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
26120 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
26130 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
26140 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
26150 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
26160 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
26170 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
26180 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
26190 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
261a0 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
261b0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
261c0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
261d0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
261e0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
261f0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
26200 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
26210 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
26220 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
26230 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
26240 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
26250 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
26260 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
26270 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
26280 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
26290 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
262a0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
262b0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
262c0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
262d0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
262e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
262f0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
26300 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
26310 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
26320 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
26330 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
26340 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
26350 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
26360 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
26370 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
26380 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
26390 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
263a0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
263b0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
263c0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
263d0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
263e0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
263f0 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
26400 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
26410 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
26420 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
26430 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
26440 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
26450 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
26460 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
26470 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
26480 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
26490 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
264a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
264b0 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
264c0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
264d0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
264e0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
264f0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
26500 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
26510 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
26520 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
26530 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
26540 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
26550 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
26560 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
26570 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
26580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26590 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
265a0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75     }.    p->pUnu
265b0 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
265c0 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
265d0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
265e0 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
265f0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
26600 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
26610 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
26620 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
26630 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74  && !isOpenDirect
26640 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  ory);.    rc = u
26650 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
26660 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a  AX_PATHNAME+1, z
26670 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
26680 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26690 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
266a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
266b0 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
266c0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
266d0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
266e0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
266f0 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
26700 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
26710 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
26720 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
26730 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
26740 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
26750 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
26760 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
26770 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
26780 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
26790 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
267a0 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
267b0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
267c0 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
267d0 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
267e0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
267f0 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
26800 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
26810 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
26820 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
26830 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
26840 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
26850 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
26860 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
26870 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
26880 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
26890 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
268a0 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
268b0 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
268c0 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
268d0 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
268e0 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
268f0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
26900 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
26910 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
26920 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
26930 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
26940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26950 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55    assert( !p->pU
26960 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61  nused );.      a
26970 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
26980 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c  LITE_OPEN_WAL ||
26990 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
269a0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
269b0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
269c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   rc;.    }.    f
269d0 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  d = open(zName, 
269e0 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
269f0 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ode);.    OSTRAC
26a00 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64  E(("OPENX   %-3d
26a10 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20   %s 0%o\n", fd, 
26a20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
26a30 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  ));.    if( fd<0
26a40 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49   && errno!=EISDI
26a50 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65  R && isReadWrite
26a60 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
26a70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   ){.      /* Fai
26a80 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  led to open the 
26a90 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72  file for read/wr
26aa0 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20  ite access. Try 
26ab0 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  read-only. */.  
26ac0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
26ad0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
26ae0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
26af0 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
26b00 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f  openFlags &= ~(O
26b10 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a  _RDWR|O_CREAT);.
26b20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
26b30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
26b40 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  NLY;.      openF
26b50 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
26b60 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 6f 70 65  ;.      fd = ope
26b70 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
26b80 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
26b90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c     }.    if( fd<
26ba0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
26bb0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
26bc0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
26bd0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
26be0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
26bf0 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
26c00 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
26c10 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
26c20 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
26c30 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b  f( p->pUnused ){
26c40 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
26c50 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
26c60 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  >pUnused->flags 
26c70 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
26c80 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
26c90 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
26ca0 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
26cb0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c 69  ;.#else.    unli
26cc0 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
26cd0 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  f.  }.#if SQLITE
26ce0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
26cf0 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20  STYLE.  else{.  
26d00 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
26d10 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
26d20 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73  #endif..  if( is
26d30 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b  OpenDirectory ){
26d40 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69  .    rc = openDi
26d50 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
26d60 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
26d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26d80 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
26d90 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20 66 64  safe to close fd
26da0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
26db0 62 65 63 61 75 73 65 20 69 74 20 69 73 20 67 75  because it is gu
26dc0 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20 20 20  aranteed not.   
26dd0 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70 65 6e     ** to be open
26de0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   on a database f
26df0 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65 20  ile. If it were 
26e00 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61  open on a databa
26e10 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 2a  se file,.      *
26e20 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62  * it would not b
26e30 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20  e safe to close 
26e40 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20 72 65  as this would re
26e50 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20  lease any locks 
26e60 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  held.      ** on
26e70 20 74 68 65 20 66 69 6c 65 20 62 79 20 74 68 69   the file by thi
26e80 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f 0a 20  s process.  */. 
26e90 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
26ea0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
26eb0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 20  MAIN_DB );.     
26ec0 20 63 6c 6f 73 65 28 66 64 29 3b 20 20 20 20 20   close(fd);     
26ed0 20 20 20 20 20 20 20 20 2f 2a 20 73 69 6c 65 6e          /* silen
26ee0 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  tly leak if fail
26ef0 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65 72 72  , already in err
26f00 6f 72 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f  or */.      goto
26f10 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
26f20 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
26f30 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66  f FD_CLOEXEC.  f
26f40 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
26f50 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  , fcntl(fd, F_GE
26f60 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
26f70 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  EXEC);.#endif.. 
26f80 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21   noLock = eType!
26f90 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
26fa0 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65  N_DB;..  .#if de
26fb0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
26fc0 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
26fd0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
26fe0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
26ff0 66 73 49 6e 66 6f 3b 0a 20 20 69 66 28 20 66 73  fsInfo;.  if( fs
27000 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66  tatfs(fd, &fsInf
27010 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
27020 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
27030 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  e)->lastErrno = 
27040 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 64  errno;.    if( d
27050 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
27060 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  dirfd); /* silen
27070 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  tly leak if fail
27080 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , in error */.  
27090 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20    close(fd); /* 
270a0 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66  silently leak if
270b0 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20   fail, in error 
270c0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
270d0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
270e0 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
270f0 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73  = strncmp("msdos
27100 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
27110 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
27120 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
27130 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
27140 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
27150 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20  IS_MSDOS;.  }.  
27160 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
27170 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f  ("exfat", fsInfo
27180 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
27190 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
271a0 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
271b0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
271c0 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
271d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23  .  }.#endif.  .#
271e0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
271f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
27200 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
27210 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20  _PROXY_LOCKING. 
27220 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31   isAutoProxy = 1
27230 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69  ;.#endif.  if( i
27240 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a  sAutoProxy && (z
27250 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28  Path!=NULL) && (
27260 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73  !noLock) && pVfs
27270 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63  ->xOpen ){.    c
27280 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20  har *envforce = 
27290 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46  getenv("SQLITE_F
272a0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
272b0 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73  NG");.    int us
272c0 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20  eProxy = 0;..   
272d0 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   /* SQLITE_FORCE
272e0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d  _PROXY_LOCKING==
272f0 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c  1 means force al
27300 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20  ways use proxy, 
27310 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20  0 means .    ** 
27320 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c  never use proxy,
27330 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20   NULL means use 
27340 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f  proxy for non-lo
27350 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20  cal files only. 
27360 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66   */.    if( envf
27370 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  orce!=NULL ){.  
27380 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61      useProxy = a
27390 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b  toi(envforce)>0;
273a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
273b0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
273c0 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  fsInfo;.      if
273d0 28 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20  ( statfs(zPath, 
273e0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
273f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20  {.        /* In 
27400 74 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73  theory, the clos
27410 65 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75  e(fd) call is su
27420 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68  b-optimal. If th
27430 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20  e file opened.  
27440 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64        ** with fd
27450 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
27460 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
27470 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  re other connect
27480 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ions open.      
27490 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c    ** on that fil
274a0 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
274b0 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76  ntly holding adv
274c0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69  isory locks on i
274d0 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  t,.        ** th
274e0 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  en the call to c
274f0 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63  lose() will canc
27500 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  el those locks. 
27510 49 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20  In practice,.   
27520 20 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73       ** we're as
27530 73 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74  suming that stat
27540 66 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69  fs() doesn't fai
27550 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74  l very often. At
27560 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a   least.        *
27570 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65  * not while othe
27580 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
27590 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  rs opened by the
275a0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e   same process on
275b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
275c0 73 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f  same file are wo
275d0 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20  rking.  */.     
275e0 20 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20     p->lastErrno 
275f0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
27600 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 7b   if( dirfd>=0 ){
27610 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
27620 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65  (dirfd); /* sile
27630 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
27640 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
27650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27660 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73   close(fd); /* s
27670 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20  ilently leak if 
27680 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a  fail, in error *
27690 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
276a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
276b0 53 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SS;.        goto
276c0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
276d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73        }.      us
276e0 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66  eProxy = !(fsInf
276f0 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f  o.f_flags&MNT_LO
27700 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CAL);.    }.    
27710 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a  if( useProxy ){.
27720 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49        rc = fillI
27730 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
27740 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
27750 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
27760 20 69 73 44 65 6c 65 74 65 29 3b 0a 20 20 20 20   isDelete);.    
27770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27780 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
27790 2a 20 63 61 63 68 65 20 74 68 65 20 70 4d 65 74  * cache the pMet
277a0 68 6f 64 20 69 6e 20 63 61 73 65 20 74 68 65 20  hod in case the 
277b0 74 72 61 6e 73 66 6f 72 6d 20 66 61 69 6c 73 20  transform fails 
277c0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
277d0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
277e0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
277f0 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
27800 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 20 20 72  thods;.        r
27810 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
27820 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78  rmUnixFile((unix
27830 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
27840 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  uto:");.        
27850 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27860 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
27870 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20  * Use unixClose 
27880 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
27890 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20  resources added 
278a0 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  in fillInUnixFil
278b0 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
278c0 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68  and clear all th
278d0 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65  e structure's re
278e0 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69  ferences.  Speci
278f0 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20  fically, .      
27900 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d      ** pFile->pM
27910 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e  ethods will be N
27920 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73  ULL so sqlite3Os
27930 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20  Close will be a 
27940 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20  no-op .         
27950 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
27960 28 20 70 4d 65 74 68 6f 64 21 3d 4e 55 4c 4c 20  ( pMethod!=NULL 
27970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
27980 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 70  Method->xClose(p
27990 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
279a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
279b0 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46      unixClose(pF
279c0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
279d0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  }.          retu
279e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
279f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
27a00 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
27a10 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  d;.    }.  }.#en
27a20 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  dif.  .  rc = fi
27a30 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
27a40 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46  s, fd, dirfd, pF
27a50 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f  ile, zPath, noLo
27a60 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b 0a 6f  ck, isDelete);.o
27a70 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
27a80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27a90 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
27aa0 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64  _free(p->pUnused
27ab0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27ac0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  rc;.}.../*.** De
27ad0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
27ae0 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
27af0 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
27b00 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
27b10 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
27b20 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
27b30 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
27b40 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
27b50 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
27b60 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  fs *NotUsed,    
27b70 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69   /* VFS containi
27b80 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78  ng this as the x
27b90 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f  Delete method */
27ba0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27bb0 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Path,        /* 
27bc0 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
27bd0 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
27be0 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20  int dirSync     
27bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
27c00 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69  true, fsync() di
27c10 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
27c20 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29  leting file */.)
27c30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27c40 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
27c50 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
27c60 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
27c70 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
27c80 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
27c90 45 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b  E);.  if( unlink
27ca0 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26  (zPath)==(-1) &&
27cb0 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29   errno!=ENOENT )
27cc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
27cd0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
27ce0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
27cf0 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
27d00 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72 53 79  SYNC.  if( dirSy
27d10 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64  nc ){.    int fd
27d20 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  ;.    rc = openD
27d30 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
27d40 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
27d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
27d60 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
27d70 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
27d80 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20  )==-1 ).#else.  
27d90 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64      if( fsync(fd
27da0 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ) ).#endif.     
27db0 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
27dc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
27dd0 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a  _FSYNC;.      }.
27de0 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28        if( close(
27df0 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20 20 20  fd)&&!rc ){.    
27e00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27e10 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b  IOERR_DIR_CLOSE;
27e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27e30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
27e40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27e50 54 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e  Test the existan
27e60 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20  ce of or access 
27e70 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66  permissions of f
27e80 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a  ile zPath. The.*
27e90 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64  * test performed
27ea0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
27eb0 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a  value of flags:.
27ec0 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
27ed0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20  _ACCESS_EXISTS: 
27ee0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
27ef0 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20  file exists.**  
27f00 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
27f10 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75  _READWRITE: Retu
27f20 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
27f30 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69   is read and wri
27f40 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51  table..**     SQ
27f50 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
27f60 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69  ONLY: Return 1 i
27f70 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
27f80 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  adable..**.** Ot
27f90 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30  herwise return 0
27fa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27fb0 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71  unixAccess(.  sq
27fc0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
27fd0 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53  ed,   /* The VFS
27fe0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
27ff0 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20   xAccess method 
28000 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
28010 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20  *zPath,      /* 
28020 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65  Path of the file
28030 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20   to examine */. 
28040 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
28050 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
28060 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c   do we want to l
28070 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a  earn about the z
28080 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20  Path file? */.  
28090 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
280a0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
280b0 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20   result boolean 
280c0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
280d0 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e   amode = 0;.  UN
280e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
280f0 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c  otUsed);.  Simul
28100 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
28110 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28120 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69  ACCESS; );.  swi
28130 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
28140 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
28150 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
28160 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b     amode = F_OK;
28170 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28180 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
28190 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
281a0 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f        amode = W_
281b0 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62  OK|R_OK;.      b
281c0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
281d0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
281e0 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  D:.      amode =
281f0 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   R_OK;.      bre
28200 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
28210 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
28220 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
28230 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
28240 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 61 63 63   *pResOut = (acc
28250 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65  ess(zPath, amode
28260 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61  )==0);.  if( fla
28270 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
28280 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65  S_EXISTS && *pRe
28290 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75  sOut ){.    stru
282a0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
282b0 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61   if( 0==stat(zPa
282c0 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66  th, &buf) && buf
282d0 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20  .st_size==0 ){. 
282e0 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20       *pResOut = 
282f0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
28300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28310 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  .}.../*.** Turn 
28320 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
28330 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
28340 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65  pathname. The re
28350 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69  lative path.** i
28360 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75  s stored as a nu
28370 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
28380 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65  ing in the buffe
28390 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  r pointed to by.
283a0 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a  ** zPath. .**.**
283b0 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20   zOut points to 
283c0 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
283d0 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  east sqlite3_vfs
283e0 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65  .mxPathname byte
283f0 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63  s .** (in this c
28400 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d  ase, MAX_PATHNAM
28410 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75  E bytes). The fu
28420 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74  ll-path is writt
28430 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75  en to.** this bu
28440 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75  ffer before retu
28450 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
28460 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74   int unixFullPat
28470 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
28480 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28490 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
284a0 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
284b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
284c0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
284d0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
284e0 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
284f0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74  th */.  int nOut
28500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28510 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
28520 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
28530 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
28540 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20  r *zOut         
28550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
28560 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
28570 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  {..  /* It's odd
28580 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
28590 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
285a0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
285b0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
285c0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
285d0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
285e0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
285f0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
28600 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
28610 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
28620 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
28630 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
28640 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
28650 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
28660 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
28670 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
28680 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
28690 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
286a0 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  R );..  assert( 
286b0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
286c0 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
286d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
286e0 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a  ETER(pVfs);..  z
286f0 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c  Out[nOut-1] = '\
28700 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b  0';.  if( zPath[
28710 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73  0]=='/' ){.    s
28720 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
28730 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22  nOut, zOut, "%s"
28740 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  , zPath);.  }els
28750 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b  e{.    int nCwd;
28760 0a 20 20 20 20 69 66 28 20 67 65 74 63 77 64 28  .    if( getcwd(
28770 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30  zOut, nOut-1)==0
28780 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
28790 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
287a0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
287b0 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72   nCwd = (int)str
287c0 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73  len(zOut);.    s
287d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
287e0 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74  nOut-nCwd, &zOut
287f0 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a  [nCwd], "/%s", z
28800 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Path);.  }.  ret
28810 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28820 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
28830 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
28840 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
28850 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
28860 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
28870 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
28880 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
28890 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
288a0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
288b0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
288c0 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
288d0 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
288e0 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
288f0 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
28900 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73  s *NotUsed, cons
28910 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
28920 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
28930 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
28940 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
28950 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
28960 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
28970 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
28980 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
28990 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
289a0 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
289b0 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
289c0 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
289d0 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
289e0 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
289f0 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
28a00 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
28a10 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
28a20 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
28a30 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
28a40 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
28a50 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
28a60 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
28a70 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
28a80 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
28a90 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
28aa0 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
28ab0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
28ac0 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
28ad0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
28ae0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
28af0 66 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a  fOut){.  char *z
28b00 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Err;.  UNUSED_PA
28b10 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
28b20 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
28b30 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64  ex();.  zErr = d
28b40 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  lerror();.  if( 
28b50 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  zErr ){.    sqli
28b60 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
28b70 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22  f, zBufOut, "%s"
28b80 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75  , zErr);.  }.  u
28b90 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
28ba0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
28bb0 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74  *unixDlSym(sqlit
28bc0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
28bd0 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20   void *p, const 
28be0 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64  char*zSym))(void
28bf0 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43  ){.  /* .  ** GC
28c00 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  C with -pedantic
28c10 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61  -errors says tha
28c20 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61  t C90 does not a
28c30 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20  llow a void* to 
28c40 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74  be.  ** cast int
28c50 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  o a pointer to a
28c60 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20   function.  And 
28c70 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  yet the library 
28c80 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a  dlsym() routine.
28c90 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76    ** returns a v
28ca0 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65  oid* which is re
28cb0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
28cc0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  o a function.  S
28cd0 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a  o how do we.  **
28ce0 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74   use dlsym() wit
28cf0 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
28d00 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  rs?.  **.  ** Va
28d10 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69  riable x below i
28d20 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
28d30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
28d40 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20  unction taking. 
28d50 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76   ** parameters v
28d60 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63  oid* and const c
28d70 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69  har* and returni
28d80 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
28d90 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  a function..  **
28da0 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78   We initialize x
28db0 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74   by assigning it
28dc0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
28dd0 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69  e dlsym() functi
28de0 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61  on..  ** (That a
28df0 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  ssignment requir
28e00 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65  es a cast.)  The
28e10 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75  n we call the fu
28e20 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a  nction that.  **
28e30 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a   x points to.  .
28e40 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77    **.  ** This w
28e50 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e  ork-around is un
28e60 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63  likely to work c
28e70 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20  orrectly on any 
28e80 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a  system where.  *
28e90 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e  * you really can
28ea0 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74  not cast a funct
28eb0 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ion pointer into
28ec0 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65   void*.  But the
28ed0 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f  n, on the.  ** o
28ee0 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d  ther hand, dlsym
28ef0 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  () will not work
28f00 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65   on such a syste
28f10 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20  m either, so we 
28f20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  have.  ** not re
28f30 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69  ally lost anythi
28f40 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20  ng..  */.  void 
28f50 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e  (*(*x)(void*,con
28f60 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
28f70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
28f80 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
28f90 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28   x = (void(*(*)(
28fa0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
28fb0 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b  *))(void))dlsym;
28fc0 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70  .  return (*x)(p
28fd0 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69  , zSym);.}.stati
28fe0 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f  c void unixDlClo
28ff0 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
29000 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
29010 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
29020 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
29030 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28  sed);.  dlclose(
29040 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
29050 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
29060 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
29070 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
29080 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  /.  #define unix
29090 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
290a0 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20  ine unixDlError 
290b0 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
290c0 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
290d0 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20  ine unixDlClose 
290e0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
290f0 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  Write nBuf bytes
29100 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20   of random data 
29110 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
29120 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a  buffer zBuf..*/.
29130 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
29140 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
29150 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
29160 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
29170 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
29180 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
29190 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69  d);.  assert((si
291a0 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65  ze_t)nBuf>=(size
291b0 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f  of(time_t)+sizeo
291c0 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20  f(int)));..  /* 
291d0 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
291e0 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
291f0 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
29200 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
29210 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
29220 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
29230 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
29240 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
29250 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
29260 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
29270 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
29280 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
29290 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
292a0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
292b0 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
292c0 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
292d0 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
292e0 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
292f0 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
29300 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
29310 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
29320 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
29330 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
29340 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
29350 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
29360 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
29370 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
29380 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
29390 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
293a0 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
293b0 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
293c0 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
293d0 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
293e0 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
293f0 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
29400 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
29410 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
29420 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
29430 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
29440 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
29450 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e  Buf);.#if !defin
29460 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
29470 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c    {.    int pid,
29480 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70   fd;.    fd = op
29490 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
294a0 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  ", O_RDONLY);.  
294b0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
294c0 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20      time_t t;.  
294d0 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20      time(&t);.  
294e0 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c      memcpy(zBuf,
294f0 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b   &t, sizeof(t));
29500 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74  .      pid = get
29510 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d  pid();.      mem
29520 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
29530 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  (t)], &pid, size
29540 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20  of(pid));.      
29550 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74  assert( sizeof(t
29560 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28  )+sizeof(pid)<=(
29570 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
29580 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
29590 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70  of(t) + sizeof(p
295a0 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
295b0 20 20 20 20 20 20 6e 42 75 66 20 3d 20 72 65 61        nBuf = rea
295c0 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66  d(fd, zBuf, nBuf
295d0 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66  );.      close(f
295e0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  d);.    }.  }.#e
295f0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42  ndif.  return nB
29600 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c  uf;.}.../*.** Sl
29610 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
29620 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
29630 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
29640 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
29650 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
29660 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
29670 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
29680 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65  to sleep..** The
29690 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
296a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
296b0 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73  icroseconds of s
296c0 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  leep actually.**
296d0 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
296e0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
296f0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c  perating system,
29700 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a   a number which.
29710 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61  ** might be grea
29720 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
29730 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e  l to the argumen
29740 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a  t, but not less.
29750 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75  ** than the argu
29760 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
29770 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71  int unixSleep(sq
29780 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
29790 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  ed, int microsec
297a0 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58  onds){.#if OS_VX
297b0 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
297c0 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73  imespec sp;..  s
297d0 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f  p.tv_sec = micro
297e0 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30  seconds / 100000
297f0 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20  0;.  sp.tv_nsec 
29800 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  = (microseconds 
29810 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30  % 1000000) * 100
29820 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26  0;.  nanosleep(&
29830 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55  sp, NULL);.  UNU
29840 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
29850 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
29860 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
29870 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  elif defined(HAV
29880 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
29890 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
298a0 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  p(microseconds);
298b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
298c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
298d0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
298e0 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  nds;.#else.  int
298f0 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72   seconds = (micr
29900 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29  oseconds+999999)
29910 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65  /1000000;.  slee
29920 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  p(seconds);.  UN
29930 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
29940 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
29950 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
29960 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
29970 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
29980 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
29990 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
299a0 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
299b0 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
299c0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
299d0 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
299e0 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
299f0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
29a00 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
29a10 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
29a20 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
29a30 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
29a40 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
29a50 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
29a60 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
29a70 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
29a80 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
29a90 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
29aa0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
29ab0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
29ac0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
29ad0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
29ae0 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
29af0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
29b00 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
29b10 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
29b20 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
29b30 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
29b40 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
29b50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
29b60 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
29b70 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
29b80 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
29b90 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
29ba0 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
29bb0 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
29bc0 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
29bd0 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
29be0 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
29bf0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20  cess, return 0. 
29c00 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
29c10 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
29c20 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
29c30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
29c40 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
29c50 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
29c60 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33  NotUsed, sqlite3
29c70 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
29c80 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
29c90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
29ca0 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
29cb0 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
29cc0 29 38 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65  )8640000;.#if de
29cd0 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29  fined(NO_GETTOD)
29ce0 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
29cf0 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f  ime(&t);.  *piNo
29d00 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e  w = ((sqlite3_in
29d10 74 36 34 29 69 29 2a 31 30 30 30 20 2b 20 75 6e  t64)i)*1000 + un
29d20 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f  ixEpoch;.#elif O
29d30 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
29d40 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77  ct timespec sNow
29d50 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  ;.  clock_gettim
29d60 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45  e(CLOCK_REALTIME
29d70 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e  , &sNow);.  *piN
29d80 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
29d90 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
29da0 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
29db0 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f   + sNow.tv_nsec/
29dc0 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20  1000000;.#else. 
29dd0 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
29de0 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f  sNow;.  gettimeo
29df0 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a  fday(&sNow, 0);.
29e00 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
29e10 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
29e20 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
29e30 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
29e40 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64  _usec/1000;.#end
29e50 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
29e60 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
29e70 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
29e80 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
29e90 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
29ea0 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
29eb0 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
29ec0 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
29ed0 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
29ee0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
29ef0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
29f00 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
29f10 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
29f20 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
29f30 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
29f40 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
29f50 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
29f60 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
29f70 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
29f80 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
29f90 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
29fa0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
29fb0 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
29fc0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
29fd0 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
29fe0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
29ff0 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
2a000 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
2a010 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55  3_int64 i;.  UNU
2a020 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2a030 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 43 75  tUsed);.  unixCu
2a040 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
2a050 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
2a060 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
2a070 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a080 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68  *.** We added th
2a090 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
2a0a0 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68  ) method with th
2a0b0 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70  e intention of p
2a0c0 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74  roviding.** bett
2a0d0 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72  er low-level err
2a0e0 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e  or messages when
2a0f0 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65   operating-syste
2a100 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20  m problems come 
2a110 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c  up.** during SQL
2a120 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ite operation.  
2a130 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65  But so far, none
2a140 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65   of that has bee
2a150 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
2a160 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53   in the core.  S
2a170 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
2a180 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
2a190 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20   For now, it is 
2a1a0 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63  merely.** a plac
2a1b0 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61  e-holder..*/.sta
2a1c0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
2a1d0 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
2a1e0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2a1f0 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
2a200 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
2a210 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a220 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
2a230 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2a240 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
2a250 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2a260 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
2a270 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  0;.}.../*.******
2a280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a290 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65  ** End of sqlite
2a2a0 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
2a2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2a2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a310 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
2a320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2a370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a380 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78  ***** Begin Prox
2a390 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
2a3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
2a3c0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2a3d0 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e  s a "uber-lockin
2a3e0 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69  g-method" in thi
2a3f0 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65  s sense:  It use
2a400 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c  s the.** other l
2a410 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
2a420 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b  n secondary lock
2a430 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c   files.  Proxy l
2a440 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d  ocking is a.** m
2a450 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74  eta-layer over t
2a460 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74  op of the primit
2a470 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ive locking impl
2a480 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20  emented above.  
2a490 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73  For.** this reas
2a4a0 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
2a4b0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2a4c0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
2a4d0 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a  g is deferred.**
2a4e0 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74   until late in t
2a4f0 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61  he file (here) a
2a500 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
2a510 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64  other I/O method
2a520 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64  s have.** been d
2a530 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74  efined - so that
2a540 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
2a550 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61  ocking methods a
2a560 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  re available.** 
2a570 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68  as services to h
2a580 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70  elp with the imp
2a590 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  lementation of p
2a5a0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  roxy locking..**
2a5b0 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  .****.**.** The 
2a5c0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20  default locking 
2a5d0 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74  schemes in SQLit
2a5e0 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65  e use byte-range
2a5f0 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a   locks on the.**
2a600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2a610 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66  o coordinate saf
2a620 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63  e, concurrent ac
2a630 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2a640 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20   readers.** and 
2a650 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f  writers [http://
2a660 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69  sqlite.org/locki
2a670 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65  ngv3.html].  The
2a680 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69   five file locki
2a690 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e  ng.** states (UN
2a6a0 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c  LOCKED, PENDING,
2a6b0 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
2a6c0 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72  D, EXCLUSIVE) ar
2a6d0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  e implemented.**
2a6e0 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26   as POSIX read &
2a6f0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65   write locks ove
2a700 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c  r fixed set of l
2a710 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73  ocations (via fs
2a720 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20  ctl),.** on AFP 
2a730 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63  and SMB only exc
2a740 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
2a750 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69  e locks are avai
2a760 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a  lable via fsctl.
2a770 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a  ** with _IOWR('z
2a780 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
2a790 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20  teRangeLockPB2) 
2a7a0 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d  to track the sam
2a7b0 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54  e 5 states..** T
2a7c0 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52  o simulate a F_R
2a7d0 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72  DLCK on the shar
2a7e0 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50  ed range, on AFP
2a7f0 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65   a randomly sele
2a800 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20  cted.** address 
2a810 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  in the shared ra
2a820 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
2a830 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
2a840 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68  the entire.** sh
2a850 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2a860 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55  ken for an EXCLU
2a870 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a  SIVE lock):.**.*
2a880 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  *      PENDING_B
2a890 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30  YTE        0x400
2a8a0 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20  00000..   ..**  
2a8b0 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54      RESERVED_BYT
2a8c0 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30  E       0x400000
2a8d0 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45  01.**      SHARE
2a8e0 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30  D_RANGE        0
2a8f0 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34  x40000002 -> 0x4
2a900 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68  0000200.**.** Th
2a910 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e  is works well on
2a920 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
2a930 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77  system, but show
2a940 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a  s a nearly 100x.
2a950 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72  ** slowdown in r
2a960 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ead performance 
2a970 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74  on AFP because t
2a980 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69  he AFP client di
2a990 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65  sables.** the re
2a9a0 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79  ad cache when by
2a9b0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2a9c0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61  re present.  Ena
2a9d0 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a  bling the read.*
2a9e0 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20  * cache exposes 
2a9f0 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  a cache coherenc
2aa00 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69  y problem that i
2aa10 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c  s present on all
2aa20 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74   OS X.** support
2aa30 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20  ed network file 
2aa40 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e  systems.  NFS an
2aa50 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72  d AFP both obser
2aa60 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d  ve the.** close-
2aa70 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63  to-open semantic
2aa80 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63  s for ensuring c
2aa90 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a  ache coherency.*
2aaa0 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f  * [http://nfs.so
2aab0 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66  urceforge.net/#f
2aac0 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f  aq_a8], which do
2aad0 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65  es not effective
2aae0 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68  ly.** address th
2aaf0 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66  e requirements f
2ab00 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61  or concurrent da
2ab10 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79  tabase access by
2ab20 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61   multiple.** rea
2ab30 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
2ab40 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e  .** [http://www.
2ab50 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74  nabble.com/SQLit
2ab60 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63  e-on-NFS-cache-c
2ab70 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35  oherency-td15655
2ab80 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a  701.html]..**.**
2ab90 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20   To address the 
2aba0 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20  performance and 
2abb0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2abc0 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69  issues, proxy fi
2abd0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68  le locking.** ch
2abe0 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61  anges the way da
2abf0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73  tabase access is
2ac00 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c   controlled by l
2ac10 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74  imiting access t
2ac20 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f  o a.** single ho
2ac30 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64  st at a time and
2ac40 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63   moving file loc
2ac50 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61  ks off of the da
2ac60 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
2ac70 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20  nd onto a proxy 
2ac80 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  file on the loca
2ac90 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20  l file system.  
2aca0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20  .**.**.** Using 
2acb0 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d  proxy locks.** -
2acc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2acd0 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a  .**.** C APIs.**
2ace0 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2acf0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2ad00 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54  name, SQLITE_SET
2ad10 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a  _LOCKPROXYFILE,.
2ad20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2ad30 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f           <proxy_
2ad40 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22  path> | ":auto:"
2ad50 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  );.**  sqlite3_f
2ad60 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
2ad70 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47  dbname, SQLITE_G
2ad80 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2ad90 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29  , &<proxy_path>)
2ada0 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
2adb0 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
2adc0 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
2add0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2ade0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
2adf0 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
2ae00 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
2ae10 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
2ae20 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
2ae30 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
2ae40 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
2ae50 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
2ae60 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
2ae70 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
2ae80 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
2ae90 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
2aea0 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
2aeb0 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
2aec0 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
2aed0 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
2aee0 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
2aef0 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
2af00 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
2af10 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
2af20 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
2af30 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
2af40 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
2af50 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
2af60 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
2af70 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
2af80 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
2af90 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
2afa0 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
2afb0 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
2afc0 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
2afd0 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
2afe0 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
2aff0 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
2b000 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
2b010 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
2b020 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
2b030 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
2b040 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
2b050 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
2b060 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
2b070 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
2b080 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
2b090 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
2b0a0 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
2b0b0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
2b0c0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
2b0d0 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
2b0e0 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
2b0f0 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
2b100 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
2b110 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
2b120 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
2b130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2b140 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
2b150 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
2b160 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
2b170 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
2b180 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
2b190 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
2b1a0 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
2b1b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b1c0 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
2b1d0 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
2b1e0 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
2b1f0 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
2b200 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
2b210 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
2b220 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
2b230 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
2b240 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
2b250 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
2b260 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
2b270 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
2b280 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
2b290 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
2b2a0 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
2b2b0 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
2b2c0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
2b2d0 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
2b2e0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
2b2f0 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
2b300 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
2b310 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
2b320 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
2b330 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
2b340 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
2b350 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
2b360 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
2b370 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
2b380 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
2b390 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
2b3a0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
2b3b0 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
2b3c0 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
2b3d0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2b3e0 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
2b3f0 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
2b400 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
2b410 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
2b420 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27  ot exist, or it'
2b430 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f  s contents do no
2b440 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68  t match the.** h
2b450 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72  ost ID and/or pr
2b460 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74  oxy path, then t
2b470 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c  he lock is escal
2b480 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75  ated to an exclu
2b490 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64  sive.** lock and
2b4a0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2b4b0 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61  contents is upda
2b4c0 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73  ted with the hos
2b4d0 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a  t ID and proxy.*
2b4e0 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c  * path and the l
2b4f0 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65  ock is downgrade
2b500 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  d to a shared lo
2b510 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68  ck again.  If th
2b520 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65  e conch.** is he
2b530 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72  ld by another pr
2b540 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68  ocess (with a sh
2b550 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20  ared lock), the 
2b560 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
2b570 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20  * will fail and 
2b580 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2b590 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2b5a0 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20  he proxy file - 
2b5b0 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69  a single-byte fi
2b5c0 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20  le used for all 
2b5d0 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f  advisory file lo
2b5e0 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  cks.** normally 
2b5f0 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
2b600 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68  abase file.   Th
2b610 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61  is allows for sa
2b620 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66  fe sharing.** of
2b630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b640 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  le for multiple 
2b650 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
2b660 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ers on the same.
2b670 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e  ** host (the con
2b680 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ch ensures that 
2b690 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65  they all use the
2b6a0 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b   same local lock
2b6b0 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65   file)..**.** Re
2b6c0 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63  questing the loc
2b6d0 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74  k proxy does not
2b6e0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b   immediately tak
2b6f0 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20  e the conch, it 
2b700 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e  is.** only taken
2b710 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
2b720 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20  request to lock 
2b730 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2b740 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73   made.  .** This
2b750 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d   matches the sem
2b760 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72  antics of the tr
2b770 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  aditional lockin
2b780 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72  g behavior, wher
2b790 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63  e.** opening a c
2b7a0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
2b7b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
2b7c0 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63  s not take a loc
2b7d0 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20  k on it..** The 
2b7e0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
2b7f0 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73  an open file des
2b800 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e  criptor are main
2b810 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a  tained until .**
2b820 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2b830 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2b840 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a  is closed. .**.*
2b850 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
2b860 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69   and the lock fi
2b870 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c  le are never del
2b880 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c  eted so they onl
2b890 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
2b8a0 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73  created the firs
2b8b0 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20  t time they are 
2b8c0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66  used..**.** Conf
2b8d0 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2b8e0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
2b8f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2b900 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f    SQLITE_PREFER_
2b910 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  PROXY_LOCKING.**
2b920 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61  .**       Databa
2b930 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65  se files accesse
2b940 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66  d on non-local f
2b950 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a  ile systems are.
2b960 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74  **       automat
2b970 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65  ically configure
2b980 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  d for proxy lock
2b990 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20  ing, lock files 
2b9a0 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  are.**       nam
2b9b0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2b9c0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
2b9d0 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20  logic as.**     
2b9e0 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72    PRAGMA lock_pr
2b9f0 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a  oxy_file=":auto:
2ba00 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c  ".**    .**  SQL
2ba10 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
2ba20 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62  **.**       Enab
2ba30 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20  les the logging 
2ba40 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  of error message
2ba50 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64  s during host id
2ba60 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72   file.**       r
2ba70 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65  etrieval and cre
2ba80 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
2ba90 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
2baa0 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
2bab0 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
2bac0 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
2bad0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
2bae0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
2baf0 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
2bb00 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
2bb10 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
2bb20 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
2bb30 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
2bb40 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
2bb50 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
2bb60 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
2bb70 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
2bb80 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
2bb90 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
2bba0 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
2bbb0 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
2bbc0 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
2bbd0 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
2bbe0 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
2bbf0 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
2bc00 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
2bc10 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2bc20 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
2bc30 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
2bc40 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
2bc50 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2bc60 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
2bc70 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
2bc80 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
2bc90 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
2bca0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
2bcb0 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
2bcc0 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
2bcd0 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
2bce0 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
2bcf0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
2bd00 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
2bd10 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68  icity calling th
2bd20 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
2bd30 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
2bd40 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
2bd50 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
2bd60 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
2bd70 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
2bd80 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
2bd90 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
2bda0 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
2bdb0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
2bdc0 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
2bdd0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2bde0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2bdf0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
2be00 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f  *.** The proxyLo
2be10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73  ckingContext has
2be20 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69   the path and fi
2be30 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  le structures fo
2be40 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a  r the remote .**
2be50 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79   and local proxy
2be60 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a   files in it.*/.
2be70 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70  typedef struct p
2be80 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2be90 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  xt proxyLockingC
2bea0 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70  ontext;.struct p
2beb0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2bec0 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt {.  unixFile 
2bed0 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
2bee0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63      /* Open conc
2bef0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  h file */.  char
2bf00 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b   *conchFilePath;
2bf10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2bf20 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
2bf30 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2bf40 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20   *lockProxy;    
2bf50 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f       /* Open pro
2bf60 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
2bf70 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78    char *lockProx
2bf80 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  yPath;         /
2bf90 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
2bfa0 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
2bfb0 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  .  char *dbPath;
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfd0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
2bfe0 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  pen file */.  in
2bff0 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20  t conchHeld;    
2c000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
2c010 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
2c020 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b  held, -1 if lock
2c030 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  less */.  void *
2c040 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
2c050 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  t;     /* Origin
2c060 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78  al lockingcontex
2c070 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20  t to restore on 
2c080 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  close */.  sqlit
2c090 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
2c0a0 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b  nst *pOldMethod;
2c0b0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2c0c0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72   I/O methods for
2c0d0 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   close */.};../*
2c0e0 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c   .** The proxy l
2c0f0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f  ock file path fo
2c100 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
2c110 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74  t dbPath is writ
2c120 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20  ten into lPath, 
2c130 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70  .** which must p
2c140 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77  oint to valid, w
2c150 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c  ritable memory l
2c160 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
2c170 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a  a maxLen length.
2c180 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a  ** file path. .*
2c190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2c1a0 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f  xyGetLockPath(co
2c1b0 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
2c1c0 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73  , char *lPath, s
2c1d0 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20  ize_t maxLen){. 
2c1e0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20   int len;.  int 
2c1f0 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  dbLen;.  int i;.
2c200 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58  .#ifdef LOCKPROX
2c210 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72  YDIR.  len = str
2c220 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b  lcpy(lPath, LOCK
2c230 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e  PROXYDIR, maxLen
2c240 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66  );.#else.# ifdef
2c250 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52   _CS_DARWIN_USER
2c260 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20  _TEMP_DIR.  {.  
2c270 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f    if( !confstr(_
2c280 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2c290 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20  EMP_DIR, lPath, 
2c2a0 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20  maxLen) ){.     
2c2b0 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
2c2c0 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25  CKPATH  failed %
2c2d0 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25  s errno=%d pid=%
2c2e0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2c2f0 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e       lPath, errn
2c300 6f 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  o, getpid()));. 
2c310 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c320 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
2c330 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73     }.    len = s
2c340 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73  trlcat(lPath, "s
2c350 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61  qliteplocks", ma
2c360 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23  xLen);    .  }.#
2c370 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74   else.  len = st
2c380 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74  rlcpy(lPath, "/t
2c390 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  mp/", maxLen);.#
2c3a0 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20   endif.#endif.. 
2c3b0 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31   if( lPath[len-1
2c3c0 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65  ]!='/' ){.    le
2c3d0 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
2c3e0 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  h, "/", maxLen);
2c3f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61  .  }.  .  /* tra
2c400 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61  nsform the db pa
2c410 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63  th to a unique c
2c420 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ache name */.  d
2c430 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  bLen = (int)strl
2c440 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f  en(dbPath);.  fo
2c450 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20  r( i=0; i<dbLen 
2c460 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e  && (i+len+7)<(in
2c470 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  t)maxLen; i++){.
2c480 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
2c490 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
2c4a0 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
2c4b0 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
2c4c0 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
2c4d0 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
2c4e0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
2c4f0 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43  axLen);.  OSTRAC
2c500 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
2c510 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
2c520 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
2c530 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
2c540 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2c550 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a  E_OK;.}../* . **
2c560 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63   Creates the loc
2c570 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d  k file and any m
2c580 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69  issing directori
2c590 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20  es in lockPath. 
2c5a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2c5b0 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
2c5c0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  h(const char *lo
2c5d0 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  ckPath){.  int i
2c5e0 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75  , len;.  char bu
2c5f0 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  f[MAXPATHLEN];. 
2c600 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
2c610 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b    .  assert(lock
2c620 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f  Path!=NULL);.  /
2c630 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  * try to create 
2c640 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64  all the intermed
2c650 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73  iate directories
2c660 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74   */.  len = (int
2c670 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68  )strlen(lockPath
2c680 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f  );.  buf[0] = lo
2c690 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72  ckPath[0];.  for
2c6a0 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b  ( i=1; i<len; i+
2c6b0 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  + ){.    if( loc
2c6c0 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20  kPath[i] == '/' 
2c6d0 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20  && (i - start > 
2c6e0 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f  0) ){.      /* o
2c6f0 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61  nly mkdir if lea
2c700 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20  f dir != "." or 
2c710 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20  "/" or ".." */. 
2c720 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74       if( i-start
2c730 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d  >2 || (i-start==
2c740 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  1 && buf[start] 
2c750 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
2c760 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20  art] != '/') .  
2c770 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61         || (i-sta
2c780 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61  rt==2 && buf[sta
2c790 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
2c7a0 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e  f[start+1] != '.
2c7b0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75  ') ){.        bu
2c7c0 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20  f[i]='\0';.     
2c7d0 20 20 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66     if( mkdir(buf
2c7e0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2c7f0 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
2c800 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
2c810 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
2c820 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
2c830 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
2c840 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
2c850 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
2c860 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
2c870 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c890 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
2c8a0 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
2c8b0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2c8c0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
2c8d0 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
2c8e0 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
2c8f0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
2c900 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
2c910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c920 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2c930 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
2c940 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
2c950 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
2c960 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
2c970 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
2c980 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
2c990 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61  id=%d\n", lockPa
2c9a0 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2c9b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2c9c0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2c9d0 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
2c9e0 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
2c9f0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
2ca00 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2ca10 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
2ca20 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
2ca30 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
2ca40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
2ca50 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
2ca60 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2ca70 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
2ca80 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
2ca90 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
2caa0 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
2cab0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
2cac0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2cad0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
2cae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2caf0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
2cb00 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
2cb10 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
2cb20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
2cb30 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
2cb40 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
2cb50 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
2cb60 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
2cb70 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
2cb80 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
2cb90 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
2cba0 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
2cbb0 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
2cbc0 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
2cbd0 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
2cbe0 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69  d = -1;.  int di
2cbf0 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78  rfd = -1;.  unix
2cc00 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
2cc10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2cc20 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
2cc30 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
2cc40 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
2cc50 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
2cc60 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
2cc70 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2cc80 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
2cc90 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
2cca0 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
2ccb0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
2ccc0 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
2ccd0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
2cce0 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
2ccf0 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
2cd00 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
2cd10 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
2cd20 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
2cd30 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
2cd40 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
2cd50 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
2cd60 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
2cd70 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2cd80 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
2cd90 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
2cda0 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
2cdb0 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
2cdc0 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
2cdd0 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
2cde0 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
2cdf0 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
2ce00 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
2ce10 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
2ce20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2ce30 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
2ce40 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
2ce50 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
2ce60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ce70 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
2ce80 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2ce90 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
2cea0 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
2ceb0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2cec0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
2ced0 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
2cee0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
2cef0 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
2cf00 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
2cf10 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
2cf20 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
2cf30 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
2cf40 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
2cf50 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e   open(path, open
2cf60 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
2cf70 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2cf80 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d  SSIONS);.      }
2cf90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2cfa0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65   fd<0 ){.    ope
2cfb0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
2cfc0 59 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  Y;.    fd = open
2cfd0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2cfe0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2cff0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2d000 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2d010 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
2d020 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66  ( fd<0 ){.    if
2d030 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  ( islockfile ){.
2d040 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d050 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
2d060 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72      switch (terr
2d070 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  no) {.      case
2d080 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20   EACCES:.       
2d090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2d0a0 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ERM;.      case 
2d0b0 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65  EIO: .        re
2d0c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2d0d0 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20  R_LOCK; /* even 
2d0e0 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65  though it is the
2d0f0 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20   conch */.      
2d100 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
2d110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2d120 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
2d130 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65    }.  }.  .  pNe
2d140 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
2d150 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
2d160 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
2d170 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
2d180 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2d190 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
2d1a0 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72  to end_create_pr
2d1b0 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  oxy;.  }.  memse
2d1c0 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
2d1d0 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
2d1e0 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  pNew->openFlags 
2d1f0 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 64  = openFlags;.  d
2d200 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61  ummyVfs.pAppData
2d210 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c   = (void*)&autol
2d220 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 70  ockIoFinder;.  p
2d230 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
2d240 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  .  pUnused->flag
2d250 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
2d260 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d   pNew->pUnused =
2d270 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72   pUnused;.  .  r
2d280 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2d290 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
2d2a0 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65  , dirfd, (sqlite
2d2b0 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61  3_file*)pNew, pa
2d2c0 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  th, 0, 0);.  if(
2d2d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d2e0 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
2d2f0 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
2d300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2d310 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
2d320 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64  :    .  close(fd
2d330 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
2d340 65 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c  eak fd if error,
2d350 20 77 65 27 72 65 20 61 6c 72 65 61 64 79 20 69   we're already i
2d360 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c  n error */.  sql
2d370 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
2d380 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2d390 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75  pUnused);.  retu
2d3a0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
2d3b0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20   SQLITE_TEST./* 
2d3c0 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
2d3d0 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
2d3e0 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
2d3f0 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
2d400 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  int sqlite3_host
2d410 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64  id_num = 0;.#end
2d420 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  if..#define PROX
2d430 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31  Y_HOSTIDLEN    1
2d440 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65  6  /* conch file
2d450 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20   host id length 
2d460 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79  */../* Not alway
2d470 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
2d480 20 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f   headers as it o
2d490 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78  ught to be */.ex
2d4a0 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74  tern int gethost
2d4b0 75 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20  uuid(uuid_t id, 
2d4c0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d  const struct tim
2d4d0 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f  espec *wait);../
2d4e0 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49  * get the host I
2d4f0 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69  D via gethostuui
2d500 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73  d(), pHostID mus
2d510 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59  t point to PROXY
2d520 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62  _HOSTIDLEN .** b
2d530 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65  ytes of writable
2d540 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
2d550 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48  ic int proxyGetH
2d560 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63  ostID(unsigned c
2d570 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e  har *pHostID, in
2d580 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 73 74  t *pError){.  st
2d590 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
2d5a0 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
2d5b0 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
2d5c0 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
2d5d0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
2d5e0 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74  == sizeof(uuid_t
2d5f0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f  ));.  memset(pHo
2d600 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48  stID, 0, PROXY_H
2d610 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 69 66 28  OSTIDLEN);.  if(
2d620 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f   gethostuuid(pHo
2d630 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20  stID, &timeout) 
2d640 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d  ){.    int err =
2d650 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
2d660 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
2d670 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20  *pError = err;. 
2d680 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2d690 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
2d6a0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2d6b0 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61  TEST.  /* simula
2d6c0 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
2d6d0 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
2d6e0 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
2d6f0 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20   paths */.  if( 
2d700 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
2d710 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48  um != 0){.    pH
2d720 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72  ostID[0] = (char
2d730 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28  )(pHostID[0] + (
2d740 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f  char)(sqlite3_ho
2d750 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29  stid_num & 0xFF)
2d760 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2d770 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2d780 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  _OK;.}../* The c
2d790 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69  onch file contai
2d7a0 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68  ns the header, h
2d7b0 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20  ost id and lock 
2d7c0 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64  file path. */.#d
2d7d0 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43  efine PROXY_CONC
2d7e0 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20  HVERSION 2   /* 
2d7f0 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31  1-byte header, 1
2d800 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20  6-byte host id, 
2d810 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  path */.#define 
2d820 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20  PROXY_HEADERLEN 
2d830 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20     1   /* conch 
2d840 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67  file header leng
2d850 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
2d860 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20  OXY_PATHINDEX   
2d870 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
2d880 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
2d890 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  N).#define PROXY
2d8a0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50  _MAXCONCHLEN  (P
2d8b0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
2d8c0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d  ROXY_HOSTIDLEN+M
2d8d0 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a  AXPATHLEN)../* .
2d8e0 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e  ** Takes an open
2d8f0 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70   conch file, cop
2d900 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ies the contents
2d910 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61   to a new path a
2d920 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a  nd then moves .*
2d930 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20  * it back.  The 
2d940 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69  newly created fi
2d950 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69  le's file descri
2d960 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64  ptor is assigned
2d970 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68   to the.** conch
2d980 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
2d990 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20  and finally the 
2d9a0 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66  original conch f
2d9b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2d9c0 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52  s .** closed.  R
2d9d0 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73  eturns zero if s
2d9e0 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74  uccessful..*/.st
2d9f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72  atic int proxyBr
2da00 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  eakConchLock(uni
2da10 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
2da20 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a  id_t myHostID){.
2da30 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2da40 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
2da50 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2da60 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
2da70 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
2da80 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2da90 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
2daa0 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61  File;.  char tPa
2dab0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
2dac0 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59    char buf[PROXY
2dad0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
2dae0 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70   char *cPath = p
2daf0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
2db00 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61  th;.  size_t rea
2db10 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65  dLen = 0;.  size
2db20 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a  _t pathLen = 0;.
2db30 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34    char errmsg[64
2db40 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64  ] = "";.  int fd
2db50 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
2db60 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50  = -1;.  UNUSED_P
2db70 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49  ARAMETER(myHostI
2db80 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65  D);..  /* create
2db90 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72   a new path by r
2dba0 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c  eplace the trail
2dbb0 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74  ing '-conch' wit
2dbc0 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20  h '-break' */.  
2dbd0 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70  pathLen = strlcp
2dbe0 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20  y(tPath, cPath, 
2dbf0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69  MAXPATHLEN);.  i
2dc00 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41  f( pathLen>MAXPA
2dc10 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e  THLEN || pathLen
2dc20 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72  <6 || .     (str
2dc30 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68  lcpy(&tPath[path
2dc40 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c  Len-5], "break",
2dc50 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20   6) != 5) ){.   
2dc60 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c   sprintf(errmsg,
2dc70 20 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65   "path error (le
2dc80 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 70 61 74  n %d)", (int)pat
2dc90 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  hLen);.    goto 
2dca0 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
2dcb0 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65   }.  /* read the
2dcc0 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a   conch content *
2dcd0 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 70 72  /.  readLen = pr
2dce0 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
2dcf0 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58  , buf, PROXY_MAX
2dd00 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
2dd10 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58  if( readLen<PROX
2dd20 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20  Y_PATHINDEX ){. 
2dd30 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73     sprintf(errms
2dd40 67 2c 20 22 72 65 61 64 20 65 72 72 6f 72 20 28  g, "read error (
2dd50 6c 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 72  len %d)", (int)r
2dd60 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
2dd70 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
2dd80 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
2dd90 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
2dda0 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
2ddb0 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65  le */.  fd = ope
2ddc0 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52  n(tPath, (O_RDWR
2ddd0 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29  |O_CREAT|O_EXCL)
2dde0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2ddf0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2de00 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  S);.  if( fd<0 )
2de10 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72  {.    sprintf(er
2de20 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61  rmsg, "create fa
2de30 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
2de40 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
2de50 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
2de60 20 20 69 66 28 20 70 77 72 69 74 65 28 66 64 2c    if( pwrite(fd,
2de70 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
2de80 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65  ) != (ssize_t)re
2de90 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 70 72  adLen ){.    spr
2dea0 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 77 72  intf(errmsg, "wr
2deb0 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ite failed (%d)"
2dec0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
2ded0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
2dee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61  ;.  }.  if( rena
2def0 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29  me(tPath, cPath)
2df00 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
2df10 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20  errmsg, "rename 
2df20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
2df30 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
2df40 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
2df50 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70  }.  rc = 0;.  fp
2df60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62  rintf(stderr, "b
2df70 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  roke stale lock 
2df80 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29  on %s\n", cPath)
2df90 3b 0a 20 20 63 6c 6f 73 65 28 63 6f 6e 63 68 46  ;.  close(conchF
2dfa0 69 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e 63 68  ile->h);.  conch
2dfb0 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
2dfc0 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
2dfd0 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
2dfe0 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
2dff0 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
2e000 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
2e010 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69  =0 ){.      unli
2e020 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
2e030 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
2e040 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  }.    fprintf(st
2e050 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
2e060 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63   break stale loc
2e070 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20  k on %s, %s\n", 
2e080 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a  cPath, errmsg);.
2e090 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e0a0 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20  .}../* Take the 
2e0b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f  requested lock o
2e0c0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
2e0d0 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61   and break a sta
2e0e0 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a  le lock if the .
2e0f0 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  ** host id match
2e100 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2e110 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  t proxyConchLock
2e120 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2e130 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
2e140 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29  D, int lockType)
2e150 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
2e160 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
2e170 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
2e180 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
2e190 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
2e1a0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
2e1b0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
2e1c0 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  chFile;.  int rc
2e1d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e1e0 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a  int nTries = 0;.
2e1f0 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
2e200 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a  c conchModTime;.
2e210 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63    .  do {.    rc
2e220 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2e230 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2e240 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2e250 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
2e260 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b  ;.    nTries ++;
2e270 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e280 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
2e290 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b    /* If the lock
2e2a0 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a   failed (busy):.
2e2b0 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79         * 1st try
2e2c0 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69  : get the mod ti
2e2d0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c  me of the conch,
2e2e0 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74   wait 0.5s and t
2e2f0 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20  ry again. .     
2e300 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69    * 2nd try: fai
2e310 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d  l if the mod tim
2e320 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73  e changed or hos
2e330 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e  t id is differen
2e340 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20  t, wait .       
2e350 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73  *           10 s
2e360 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ec and try again
2e370 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72  .       * 3rd tr
2e380 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  y: break the loc
2e390 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64  k unless the mod
2e3a0 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65   time has change
2e3b0 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d..       */.   
2e3c0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
2e3d0 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 66 73  uf;.      if( fs
2e3e0 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  tat(conchFile->h
2e3f0 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20  , &buf) ){.     
2e400 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
2e410 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2e420 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e430 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
2e440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2e450 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
2e460 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
2e470 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
2e480 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
2e490 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
2e4a0 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
2e4b0 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
2e4c0 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
2e4d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2e4e0 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
2e4f0 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
2e500 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
2e510 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
2e520 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
2e530 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
2e540 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
2e550 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
2e560 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
2e570 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
2e580 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e590 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2e5a0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2e5b0 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
2e5c0 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
2e5d0 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
2e5e0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
2e5f0 20 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72 65 61    int len = prea
2e600 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
2e610 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  tBuf, PROXY_MAXC
2e620 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20  ONCHLEN, 0);.   
2e630 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29       if( len<0 )
2e640 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
2e650 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
2e660 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
2e670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2e680 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
2e690 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2e6a0 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e  len>PROXY_PATHIN
2e6b0 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d  DEX && tBuf[0]==
2e6c0 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
2e6d0 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20  HVERSION){.     
2e6e0 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72       /* don't br
2e6f0 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20  eak the lock if 
2e700 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73  the host id does
2e710 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  n't match */.   
2e720 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65         if( 0!=me
2e730 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59  mcmp(&tBuf[PROXY
2e740 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
2e750 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
2e760 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20  TIDLEN) ){.     
2e770 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2e780 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2e790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e7a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e7b0 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
2e7c0 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74  he lock on short
2e7d0 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69   read or a versi
2e7e0 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20  on mismatch */. 
2e7f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2e800 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2e810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
2e820 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b  sleep(10000000);
2e830 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20   /* wait 10 sec 
2e840 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b  and try the lock
2e850 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
2e860 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20    continue; .   
2e870 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2e880 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
2e890 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
2e8a0 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f   0==proxyBreakCo
2e8b0 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
2e8c0 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20  yHostID) ){.    
2e8d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e8e0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
2e8f0 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53  lockType==EXCLUS
2e900 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
2e910 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
2e920 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2e930 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
2e940 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
2e950 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20  HARED_LOCK);    
2e960 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
2e970 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63  .        if( !rc
2e980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2e990 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2e9a0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
2e9b0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
2e9c0 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
2e9d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e9e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68    }.    }.  } wh
2e9f0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2ea00 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33  BUSY && nTries<3
2ea10 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20   );.  .  return 
2ea20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20  rc;.}../* Takes 
2ea30 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b  the conch by tak
2ea40 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
2ea50 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63  k and read the c
2ea60 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69  ontents conch, i
2ea70 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69  f .** lockPath i
2ea80 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20  s non-NULL, the 
2ea90 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b  host ID and lock
2eaa0 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20   file path must 
2eab0 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a  match.  A NULL .
2eac0 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e  ** lockPath mean
2ead0 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50  s that the lockP
2eae0 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
2eaf0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
2eb00 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ed if the .** ho
2eb10 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72  st IDs match, or
2eb20 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68   a new lock path
2eb30 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
2eb40 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2eb50 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e   .** and written
2eb60 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69   to the conch fi
2eb70 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2eb80 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  t proxyTakeConch
2eb90 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2eba0 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
2ebb0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
2ebc0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
2ebd0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
2ebe0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
2ebf0 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63    .  if( pCtx->c
2ec00 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20  onchHeld!=0 ){. 
2ec10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ec20 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2ec30 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2ec40 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
2ec50 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69  nchFile;.    uui
2ec60 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20  d_t myHostID;.  
2ec70 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30    int pError = 0
2ec80 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42  ;.    char readB
2ec90 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
2eca0 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
2ecb0 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
2ecc0 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
2ecd0 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e  tempLockPath = N
2ece0 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ULL;.    int rc 
2ecf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2ed00 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68   int createConch
2ed10 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f   = 0;.    int ho
2ed20 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20  stIdMatch = 0;. 
2ed30 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d     int readLen =
2ed40 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f   0;.    int tryO
2ed50 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
2ed60 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77      int forceNew
2ed70 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
2ed80 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28    .    OSTRACE((
2ed90 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66  "TAKECONCH  %d f
2eda0 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
2edb0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74              (pCt
2edd0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2ede0 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
2edf0 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
2ee00 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  "), getpid()));.
2ee10 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47  .    rc = proxyG
2ee20 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49  etHostID(myHostI
2ee30 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20  D, &pError);.   
2ee40 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
2ee50 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
2ee60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
2ee70 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b  tErrno = pError;
2ee80 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2ee90 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
2eea0 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43  .    rc = proxyC
2eeb0 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
2eec0 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44  myHostID, SHARED
2eed0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
2eee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2eef0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2ef00 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
2ef10 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65  .    /* read the
2ef20 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20   existing conch 
2ef30 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64  file */.    read
2ef40 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61  Len = seekAndRea
2ef50 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e  d((unixFile*)con
2ef60 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42  chFile, 0, readB
2ef70 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
2ef80 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20  CHLEN);.    if( 
2ef90 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20  readLen<0 ){.   
2efa0 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a     /* I/O error:
2efb0 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
2efc0 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f  y seekAndRead */
2efd0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
2efe0 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46  stErrno = conchF
2eff0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
2f000 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f010 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
2f020 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
2f030 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73  econch;.    }els
2f040 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28  e if( readLen<=(
2f050 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
2f060 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2f070 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
2f080 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63    readBuf[0]!=(c
2f090 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
2f0a0 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
2f0b0 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20  /* a short read 
2f0c0 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61  or version forma
2f0d0 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73  t mismatch means
2f0e0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
2f0f0 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20  te a new .      
2f100 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a  ** conch file. .
2f110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
2f120 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a  reateConch = 1;.
2f130 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20      }.    /* if 
2f140 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
2f150 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  hes and the lock
2f160 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78   path already ex
2f170 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63  ists in the conc
2f180 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74  h.    ** we'll t
2f190 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  ry to use the pa
2f1a0 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20  th there, if we 
2f1b0 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20  can't open that 
2f1c0 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20  path, we'll .   
2f1d0 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61   ** retry with a
2f1e0 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61   new auto-genera
2f1f0 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f  ted path .    */
2f200 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20  .    do { /* in 
2f210 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20  case we need to 
2f220 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e  try again for an
2f230 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f   :auto: named lo
2f240 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ck file */..    
2f250 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e    if( !createCon
2f260 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c  ch && !forceNewL
2f270 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
2f280 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d     hostIdMatch =
2f290 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75   !memcmp(&readBu
2f2a0 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
2f2b0 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20  N], myHostID, . 
2f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2e0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
2f2f0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66  );.        /* if
2f300 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64   the conch has d
2f310 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20  ata compare the 
2f320 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20  contents */.    
2f330 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
2f340 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
2f350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72            /* for
2f360 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61   auto-named loca
2f370 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73  l lock file, jus
2f380 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74  t check the host
2f390 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20   ID and we'll.  
2f3a0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
2f3b0 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
2f3c0 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20  ile path that's 
2f3d0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65  already in there
2f3e0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
2f3f0 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73           if( hos
2f400 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  tIdMatch ){.    
2f410 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70          size_t p
2f420 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65  athLen = (readLe
2f430 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  n - PROXY_PATHIN
2f440 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20  DEX);.          
2f450 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
2f460 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50  f( pathLen>=MAXP
2f470 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20  ATHLEN ){.      
2f480 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d          pathLen=
2f490 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20  MAXPATHLEN-1;.  
2f4a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f4b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c          memcpy(l
2f4c0 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75  ockPath, &readBu
2f4d0 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
2f4e0 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20  X], pathLen);.  
2f4f0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61            lockPa
2f500 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b  th[pathLen] = 0;
2f510 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d  .            tem
2f520 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b  pLockPath = lock
2f530 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20  Path;.          
2f540 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
2f550 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2f560 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f    /* create a co
2f570 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70  py of the lock p
2f580 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ath if the conch
2f590 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
2f5a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2f5b0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
2f5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f5d0 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49   }else if( hostI
2f5e0 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20  dMatch.         
2f5f0 20 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d        && !strncm
2f600 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  p(pCtx->lockProx
2f610 79 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b  yPath, &readBuf[
2f620 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
2f630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
2f650 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49  dLen-PROXY_PATHI
2f660 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b  NDEX).        ){
2f670 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f  .          /* co
2f680 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63  nch host and loc
2f690 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a  k path match */.
2f6a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2f6b0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20  nd_takeconch; . 
2f6c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f6d0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
2f6e0 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
2f6f0 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64  n't writable and
2f700 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20   doesn't match, 
2f710 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74  we can't take it
2f720 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63   */.      if( (c
2f730 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
2f740 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30  ags&O_RDWR) == 0
2f750 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2f760 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2f770 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
2f780 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20  akeconch;.      
2f790 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
2f7a0 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e  * either the con
2f7b0 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20  ch didn't match 
2f7c0 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  or we need to cr
2f7d0 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a  eate a new one *
2f7e0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74  /.      if( !pCt
2f7f0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2f800 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
2f810 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74  yGetLockPath(pCt
2f820 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50  x->dbPath, lockP
2f830 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2f840 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f  ;.        tempLo
2f850 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74  ckPath = lockPat
2f860 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72  h;.        /* cr
2f870 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
2f880 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e  he lock path _on
2f890 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68  ly_ if the conch
2f8a0 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20   is taken */.   
2f8b0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2f8c0 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63    /* update conc
2f8d0 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20  h with host and 
2f8e0 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20  path (this will 
2f8f0 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72  fail if other pr
2f900 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68  ocess.      ** h
2f910 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
2f920 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68   already), if th
2f930 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  e host id matche
2f940 73 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20  s, use the big. 
2f950 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20       ** stick.. 
2f960 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75       */.      fu
2f970 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d  times(conchFile-
2f980 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  >h, NULL);.     
2f990 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
2f9a0 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68   && !createConch
2f9b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2f9c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
2f9d0 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  e && conchFile->
2f9e0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
2f9f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 ){.          /
2fa00 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
2fa10 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
2fa20 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
2fa30 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
2fa40 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  .           ** s
2fa50 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
2fa60 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
2fa70 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
2fa80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2fa90 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2faa0 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20     } else {     
2fab0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
2fac0 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
2fad0 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
2fae0 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  tID, EXCLUSIVE_L
2faf0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
2fb00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fb10 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
2fb20 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
2fb30 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
2fb40 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58  e*)conchFile, EX
2fb50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
2fb60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2fb70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2fb80 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 77  {.        char w
2fb90 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
2fba0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
2fbb0 20 20 20 20 20 20 20 69 6e 74 20 77 72 69 74 65         int write
2fbc0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
2fbd0 20 20 0a 20 20 20 20 20 20 20 20 77 72 69 74 65    .        write
2fbe0 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61  Buffer[0] = (cha
2fbf0 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
2fc00 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65  SION;.        me
2fc10 6d 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65  mcpy(&writeBuffe
2fc20 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  r[PROXY_HEADERLE
2fc30 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52  N], myHostID, PR
2fc40 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
2fc50 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
2fc60 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21  ->lockProxyPath!
2fc70 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  =NULL ){.       
2fc80 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
2fc90 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
2fca0 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e  THINDEX], pCtx->
2fcb0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d  lockProxyPath, M
2fcc0 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
2fcd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fce0 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
2fcf0 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2fd00 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70  PATHINDEX], temp
2fd10 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54  LockPath, MAXPAT
2fd20 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
2fd30 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 53 69  .        writeSi
2fd40 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49  ze = PROXY_PATHI
2fd50 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77  NDEX + strlen(&w
2fd60 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
2fd70 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20  _PATHINDEX]);.  
2fd80 20 20 20 20 20 20 66 74 72 75 6e 63 61 74 65 28        ftruncate(
2fd90 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72  conchFile->h, wr
2fda0 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  iteSize);.      
2fdb0 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65    rc = unixWrite
2fdc0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
2fdd0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74  )conchFile, writ
2fde0 65 42 75 66 66 65 72 2c 20 77 72 69 74 65 53 69  eBuffer, writeSi
2fdf0 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ze, 0);.        
2fe00 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d  fsync(conchFile-
2fe10 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  >h);.        /* 
2fe20 49 66 20 77 65 20 63 72 65 61 74 65 64 20 61 20  If we created a 
2fe30 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28  new conch file (
2fe40 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65 64  not just updated
2fe50 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2fe60 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20   a .         ** 
2fe70 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65  valid conch file
2fe80 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ), try to match 
2fe90 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
2fea0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2feb0 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
2fec0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2fed0 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65  ITE_OK && create
2fee0 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Conch ){.       
2fef0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
2ff00 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  uf;.          in
2ff10 74 20 65 72 72 20 3d 20 66 73 74 61 74 28 70 46  t err = fstat(pF
2ff20 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  ile->h, &buf);. 
2ff30 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
2ff40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2ff50 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20     mode_t cmode 
2ff60 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53  = buf.st_mode&(S
2ff70 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c  _IRUSR|S_IWUSR |
2ff80 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50   S_IRGRP|S_IWGRP
2ff90 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
2ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffb0 20 20 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f             S_IRO
2ffc0 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20  TH|S_IWOTH);.   
2ffd0 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20           /* try 
2ffe0 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61 74  to match the dat
2fff0 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70  abase file R/W p
30000 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f  ermissions, igno
30010 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69  re failure */.#i
30020 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f  fndef SQLITE_PRO
30030 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20  XY_DEBUG.       
30040 20 20 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63       fchmod(conc
30050 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29  hFile->h, cmode)
30060 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
30070 20 20 20 20 69 66 28 20 66 63 68 6d 6f 64 28 63      if( fchmod(c
30080 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f  onchFile->h, cmo
30090 64 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  de)!=0 ){.      
300a0 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65          int code
300b0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
300c0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
300d0 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
300e0 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25  %o FAILED with %
300f0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
30100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
30110 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65  mode, code, stre
30120 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20  rror(code));.   
30130 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
30140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30150 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
30160 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45  "fchmod %o SUCCE
30170 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20  DED\n",cmode);. 
30180 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30190 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
301a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
301b0 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
301c0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
301d0 73 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41  stderr, "STAT FA
301e0 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64  ILED[%d] with %d
301f0 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20   %s\n", .       
30200 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
30210 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72  , code, strerror
30220 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a  (code));.#endif.
30230 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30240 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30250 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
30260 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
30270 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
30280 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
30290 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20  _LOCK);.      . 
302a0 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68     end_takeconch
302b0 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  :.      OSTRACE(
302c0 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c  ("TRANSPROXY: CL
302d0 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c  OSE  %d\n", pFil
302e0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66  e->h));.      if
302f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30300 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  && pFile->openFl
30310 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ags ){.        i
30320 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
30330 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43 54 5f  {.#ifdef STRICT_
30340 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20 20  CLOSE_ERROR.    
30350 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28        if( close(
30360 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20  pFile->h) ){.   
30370 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
30380 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
30390 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  o;.            r
303a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
303b0 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
303c0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
303d0 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c        close(pFil
303e0 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e->h); /* silent
303f0 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 66 61  ly leak fd if fa
30400 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  il */.#endif.   
30410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
30420 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
30430 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d 20 6f        int fd = o
30440 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68  pen(pCtx->dbPath
30450 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  , pFile->openFla
30460 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
30470 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
30480 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
30490 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
304a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52      OSTRACE(("TR
304b0 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20  ANSPROXY: OPEN  
304c0 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20  %d\n", fd));.   
304d0 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29       if( fd>=0 )
304e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
304f0 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20  e->h = fd;.     
30500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30510 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41      rc=SQLITE_CA
30520 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20  NTOPEN_BKPT; /* 
30530 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f  SQLITE_BUSY? pro
30540 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c  xyTakeConch call
30550 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 64 75  ed.           du
30560 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  ring locking */.
30570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30580 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
30590 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43  SQLITE_OK && !pC
305a0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  tx->lockProxy ){
305b0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
305c0 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61  ath = tempLockPa
305d0 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74  th ? tempLockPat
305e0 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h : pCtx->lockPr
305f0 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
30600 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
30610 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20  eUnixFile(path, 
30620 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  &pCtx->lockProxy
30630 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
30640 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30650 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
30660 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63  MEM && tryOldLoc
30670 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
30680 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27     /* we couldn'
30690 74 20 63 72 65 61 74 65 20 74 68 65 20 70 72 6f  t create the pro
306a0 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74  xy lock file wit
306b0 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66  h the old lock f
306c0 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ile path.       
306d0 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67      ** so try ag
306e0 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d  ain via auto-nam
306f0 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20 20  ing .           
30700 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
30710 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20  ceNewLockPath = 
30720 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79  1;.          try
30730 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
30740 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
30750 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20  nue; /* go back 
30760 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69  to the do {} whi
30770 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20  le start point, 
30780 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  try again */.   
30790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
307a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
307b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
307c0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
307d0 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68  e a copy of path
307e0 20 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64   if we extracted
307f0 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
30800 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
30810 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68  conch file or th
30820 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63  e path was alloc
30830 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63  ated on the stac
30840 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k.         */.  
30850 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f        if( tempLo
30860 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
30870 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
30880 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
30890 33 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d  3DbStrDup(0, tem
308a0 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20  pLockPath);.    
308b0 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
308c0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
308d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
308e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
308f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30910 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30930 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
30940 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  d = 1;.        .
30950 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
30960 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  ->lockProxy->pMe
30970 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65  thod == &afpIoMe
30980 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
30990 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
309a0 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20  text *afpCtx;.  
309b0 20 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d          afpCtx =
309c0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
309d0 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b  ext *)pCtx->lock
309e0 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  Proxy->lockingCo
309f0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  ntext;.         
30a00 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20   afpCtx->dbPath 
30a10 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
30a20 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
30a30 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
30a40 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c          conchFil
30a50 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
30a60 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
30a70 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
30a80 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
30a90 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
30aa0 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73  TAKECONCH  %d %s
30ab0 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
30ac0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
30ad0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f    rc==SQLITE_OK?
30ae0 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b  "ok":"failed"));
30af0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
30b00 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31  ;.    } while (1
30b10 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65  ); /* in case we
30b20 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20 74   need to retry t
30b30 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66  he :auto: lock f
30b40 69 6c 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20  ile - .         
30b50 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68          ** we sh
30b60 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68  ould never get h
30b70 65 72 65 20 65 78 63 65 70 74 20 76 69 61 20 74  ere except via t
30b80 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61  he 'continue' ca
30b90 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ll. */.  }.}../*
30ba0 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c  .** If pFile hol
30bb0 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63  ds a lock on a c
30bc0 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20  onch file, then 
30bd0 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63  release that loc
30be0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
30bf0 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e   proxyReleaseCon
30c00 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
30c10 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  le){.  int rc = 
30c20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
30c30 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
30c40 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
30c50 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
30c60 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a  ntext *pCtx;  /*
30c70 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   The locking con
30c80 74 65 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f  text for the pro
30c90 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69  xy lock */.  uni
30ca0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
30cb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ;        /* Name
30cc0 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
30cd0 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20  le */..  pCtx = 
30ce0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
30cf0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
30d00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
30d10 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
30d20 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f  ->conchFile;.  O
30d30 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45  STRACE(("RELEASE
30d40 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
30d50 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
30d60 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
30d70 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
30d80 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
30d90 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
30da0 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20  : ":auto:"), .  
30db0 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
30dc0 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d  )));.  if( pCtx-
30dd0 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
30de0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
30df0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
30e00 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
30e10 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e  le*)conchFile, N
30e20 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70  O_LOCK);.  }.  p
30e30 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
30e40 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   0;.  OSTRACE(("
30e50 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64  RELEASECONCH  %d
30e60 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c   %s\n", conchFil
30e70 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
30e80 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
30e90 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
30ea0 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ")));.  return r
30eb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
30ec0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
30ed0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63  database file, c
30ee0 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20  ompute the name 
30ef0 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c  of its conch fil
30f00 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  e..** Store the 
30f10 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69  conch filename i
30f20 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
30f30 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
30f40 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65  alloc()..** Make
30f50 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69   *pConchPath poi
30f60 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61  nt to the new na
30f70 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  me.  Return SQLI
30f80 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
30f90 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
30fa0 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f  MEM if unable to
30fb0 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a   obtain memory..
30fc0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
30fd0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
30fe0 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
30ff0 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  t the allocated 
31000 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
31010 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  is eventually fr
31020 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e  eed..**.** *pCon
31030 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74 6f  chPath is set to
31040 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72   NULL if a memor
31050 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
31060 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
31070 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
31080 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d  eateConchPathnam
31090 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  e(char *dbPath, 
310a0 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74  char **pConchPat
310b0 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  h){.  int i;    
310c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
310e0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e  ter */.  int len
310f0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64   = (int)strlen(d
31100 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74  bPath); /* Lengt
31110 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  h of database fi
31120 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20  lename - dbPath 
31130 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
31140 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
31150 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20     /* buffer in 
31160 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75  which to constru
31170 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f  ct conch name */
31180 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
31190 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f  space for the co
311a0 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  nch filename and
311b0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
311c0 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65  name to.  ** the
311d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69   name of the ori
311e0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
311f0 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f  ile. */  .  *pCo
31200 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50  nchPath = conchP
31210 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ath = (char *)sq
31220 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e  lite3_malloc(len
31230 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e   + 8);.  if( con
31240 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20  chPath==0 ){.   
31250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
31260 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  OMEM;.  }.  memc
31270 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62  py(conchPath, db
31280 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Path, len+1);.  
31290 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74  .  /* now insert
312a0 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68   a "." before th
312b0 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74  e last / charact
312c0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28  er */.  for( i=(
312d0 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d  len-1); i>=0; i-
312e0 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e  - ){.    if( con
312f0 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29  chPath[i]=='/' )
31300 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
31310 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
31320 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b    }.  conchPath[
31330 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20  i]='.';.  while 
31340 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63  ( i<len ){.    c
31350 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62  onchPath[i+1]=db
31360 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b  Path[i];.    i++
31370 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65  ;.  }..  /* appe
31380 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20  nd the "-conch" 
31390 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66 69  suffix to the fi
313a0 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  le */.  memcpy(&
313b0 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20  conchPath[i+1], 
313c0 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20  "-conch", 7);.  
313d0 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72  assert( (int)str
313e0 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d  len(conchPath) =
313f0 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65  = len+7 );..  re
31400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31410 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66  }.../* Takes a f
31420 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ully configured 
31430 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74  proxy locking-st
31440 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e  yle unix file an
31450 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68  d switches.** th
31460 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
31470 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69  e path .*/.stati
31480 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b  c int switchLock
31490 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69  ProxyPath(unixFi
314a0 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
314b0 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
314c0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
314d0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
314e0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
314f0 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  t*)pFile->lockin
31500 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72  gContext;.  char
31510 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78   *oldPath = pCtx
31520 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
31530 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
31540 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46  TE_OK;..  if( pF
31550 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
31560 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  NO_LOCK ){.    r
31570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
31580 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e  Y;.  }  ..  /* n
31590 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20  othing to do if 
315a0 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c  the path is NULL
315b0 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63  , :auto: or matc
315c0 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67  hes the existing
315d0 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21   path */.  if( !
315e0 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
315f0 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
31600 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
31610 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68   ||.    (oldPath
31620 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64   && !strncmp(old
31630 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50  Path, path, MAXP
31640 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20  ATHLEN)) ){.    
31650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31660 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
31670 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
31680 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
31690 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e  roxy;.    pCtx->
316a0 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a  lockProxy=NULL;.
316b0 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
316c0 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eld = 0;.    if(
316d0 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c   lockProxy!=NULL
316e0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63   ){.      rc=loc
316f0 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d  kProxy->pMethod-
31700 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
31710 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78  _file *)lockProx
31720 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
31730 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31740 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
31750 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20  (lockProxy);.   
31760 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
31770 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20  ree(oldPath);.  
31780 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
31790 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
317a0 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29  bStrDup(0, path)
317b0 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72  ;.  }.  .  retur
317c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  n rc;.}../*.** p
317d0 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74  File is a file t
317e0 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65  hat has been ope
317f0 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78  ned by a prior x
31800 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61  Open call.  dbPa
31810 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e  th.** is a strin
31820 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73  g buffer at leas
31830 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63  t MAXPATHLEN+1 c
31840 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a  haracters in siz
31850 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
31860 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66  utine find the f
31870 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74  ilename associat
31880 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e  ed with pFile an
31890 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69  d writes it.** i
318a0 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74  nt dbPath..*/.st
318b0 61 74 69 63 20 69 6e 74 20 67 65 74 44 62 50 61  atic int getDbPa
318c0 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e  thForUnixFile(un
318d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
318e0 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69  har *dbPath){.#i
318f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
31900 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65  E__).  if( pFile
31910 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
31920 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
31930 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b    /* afp style k
31940 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65  eeps a reference
31950 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20   to the db path 
31960 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20  in the filePath 
31970 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66  field .    ** of
31980 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20   the struct */. 
31990 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29     assert( (int)
319a0 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
319b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
319c0 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
319d0 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
319e0 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63  dbPath, ((afpLoc
319f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31a00 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31a10 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41  ext)->dbPath, MA
31a20 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65  XPATHLEN);.  } e
31a30 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  lse.#endif.  if(
31a40 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
31a50 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
31a60 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64  hods ){.    /* d
31a70 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73  ot lock style us
31a80 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
31a90 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
31aa0 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20  the dot lock.   
31ab0 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   ** file path */
31ac0 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73  .    int len = s
31ad0 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46  trlen((char *)pF
31ae0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31af0 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f  ext) - strlen(DO
31b00 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20  TLOCK_SUFFIX);. 
31b10 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68     memcpy(dbPath
31b20 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
31b30 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
31b40 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c   len + 1);.  }el
31b50 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f  se{.    /* all o
31b60 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20  ther styles use 
31b70 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
31b80 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
31b90 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   db file path */
31ba0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72  .    assert( str
31bb0 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
31bc0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
31bd0 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
31be0 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50  .    strlcpy(dbP
31bf0 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
31c00 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
31c10 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  xt, MAXPATHLEN);
31c20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
31c30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
31c40 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61  * Takes an alrea
31c50 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69  dy filled in uni
31c60 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72  x file and alter
31c70 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65  s it so all file
31c80 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c   locking .** wil
31c90 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  l be performed o
31ca0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78  n the local prox
31cb0 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68  y lock file.  Th
31cc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
31cd0 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72  ds.** are preser
31ce0 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ved in the locki
31cf0 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68  ng context so th
31d00 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
31d10 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20  estored and .** 
31d20 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75  the unix structu
31d30 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61  re properly clea
31d40 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20  ned up at close 
31d50 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b  time:.**  ->lock
31d60 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d  ingContext.**  -
31d70 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74  >pMethod.*/.stat
31d80 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
31d90 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
31da0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
31db0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
31dc0 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   {.  proxyLockin
31dd0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
31de0 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41    char dbPath[MA
31df0 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20  XPATHLEN+1];    
31e00 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
31e10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31e20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
31e30 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  ath=NULL;.  int 
31e40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31e50 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e    .  if( pFile->
31e60 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
31e70 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
31e80 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
31e90 7d 0a 20 20 67 65 74 44 62 50 61 74 68 46 6f 72  }.  getDbPathFor
31ea0 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20  UnixFile(pFile, 
31eb0 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21  dbPath);.  if( !
31ec0 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
31ed0 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
31ee0 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
31ef0 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68   ){.    lockPath
31f00 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  =NULL;.  }else{.
31f10 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68      lockPath=(ch
31f20 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20  ar *)path;.  }. 
31f30 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52   .  OSTRACE(("TR
31f40 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72  ANSPROXY  %d for
31f50 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
31f60 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
31f70 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20      (lockPath ? 
31f80 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74  lockPath : ":aut
31f90 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
31fa0 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69  ;..  pCtx = sqli
31fb0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
31fc0 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69  of(*pCtx) );.  i
31fd0 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
31fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31ff0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
32000 73 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a  set(pCtx, 0, siz
32010 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20  eof(*pCtx));..  
32020 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
32030 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62  ConchPathname(db
32040 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e  Path, &pCtx->con
32050 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69  chFilePath);.  i
32060 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32070 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f   ){.    rc = pro
32080 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
32090 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
320a0 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e  Path, &pCtx->con
320b0 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  chFile, 0);.    
320c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
320d0 41 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69  ANTOPEN && ((pFi
320e0 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f  le->openFlags&O_
320f0 52 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20  RDWR) == 0) ){. 
32100 20 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74       /* if (a) t
32110 68 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72  he open flags ar
32120 65 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62  e not O_RDWR, (b
32130 29 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27  ) the conch isn'
32140 74 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20  t there, and.   
32150 20 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69     ** (c) the fi
32160 6c 65 20 73 79 73 74 65 6d 20 69 73 20 72 65 61  le system is rea
32170 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61  d-only, then ena
32180 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61  ble no-locking a
32190 63 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  ccess..      ** 
321a0 55 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f  Ugh, since O_RDO
321b0 4e 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74  NLY==0x0000 we t
321c0 65 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20  est for !O_RDWR 
321d0 73 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61  since unixOpen a
321e0 73 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20  sserts.      ** 
321f0 74 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77  that openFlags w
32200 69 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e  ill have only on
32210 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72  e of O_RDONLY or
32220 20 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a   O_RDWR..      *
32230 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  /.      struct s
32240 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
32250 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
32260 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20  conchInfo;.     
32270 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20   int goLockless 
32280 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
32290 73 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68  stat(pCtx->conch
322a0 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63 68  FilePath, &conch
322b0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a  Info) == -1 ) {.
322c0 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20          int err 
322d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
322e0 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e   if( (err==ENOEN
322f0 54 29 20 26 26 20 28 73 74 61 74 66 73 28 64 62  T) && (statfs(db
32300 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
32310 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  = -1) ){.       
32320 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20     goLockless = 
32330 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26  (fsInfo.f_flags&
32340 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d  MNT_RDONLY) == M
32350 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  NT_RDONLY;.     
32360 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32370 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73     if( goLockles
32380 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  s ){.        pCt
32390 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d  x->conchHeld = -
323a0 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20  1; /* read only 
323b0 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a  FS/ lockless */.
323c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
323d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
323e0 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66      }.  }  .  if
323f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32400 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  && lockPath ){. 
32410 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
32420 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
32430 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b  DbStrDup(0, lock
32440 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70  Path);.    if( p
32450 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
32460 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th==NULL ){.    
32470 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
32480 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
32490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
324a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  _OK ){.    pCtx-
324b0 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69 74 65  >dbPath = sqlite
324c0 33 44 62 53 74 72 44 75 70 28 30 2c 20 64 62 50  3DbStrDup(0, dbP
324d0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ath);.    if( pC
324e0 74 78 2d 3e 64 62 50 61 74 68 3d 3d 4e 55 4c 4c  tx->dbPath==NULL
324f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
32500 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
32510 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
32520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32530 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20    /* all memory 
32540 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72  is allocated, pr
32550 6f 78 79 73 20 61 72 65 20 63 72 65 61 74 65 64  oxys are created
32560 20 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a   and assigned, .
32570 20 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68      ** switch th
32580 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
32590 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
325a0 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a  en return..    *
325b0 2f 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c  /.    pCtx->oldL
325c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
325d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
325e0 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65  ntext;.    pFile
325f0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
32600 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74   = pCtx;.    pCt
32610 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20  x->pOldMethod = 
32620 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a  pFile->pMethod;.
32630 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
32640 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  od = &proxyIoMet
32650 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
32660 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
32670 63 68 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20  chFile ){ .     
32680 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
32690 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
326a0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
326b0 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  *)pCtx->conchFil
326c0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
326d0 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e  3_free(pCtx->con
326e0 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  chFile);.    }. 
326f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
32700 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
32710 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
32720 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e  3_free(pCtx->con
32730 63 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20  chFilePath); .  
32740 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
32750 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Ctx);.  }.  OSTR
32760 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
32770 20 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c    %d %s\n", pFil
32780 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
32790 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
327a0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
327b0 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ")));.  return r
327c0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
327d0 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65  s routine handle
327e0 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  s sqlite3_file_c
327f0 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74  ontrol() calls t
32800 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63  hat are specific
32810 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63  .** to proxy loc
32820 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
32830 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
32840 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
32850 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
32860 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
32870 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
32880 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
32890 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
328a0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
328b0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
328c0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66  le*)id;.      if
328d0 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
328e0 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68   == &proxyIoMeth
328f0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ods ){.        p
32900 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
32910 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
32920 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
32930 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
32940 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
32950 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
32960 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69  File);.        i
32970 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
32980 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
32990 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
329a0 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d   **)pArg = pCtx-
329b0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
329c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
329d0 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74           *(const
329e0 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
329f0 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c  ":auto: (not hel
32a00 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  d)";.        }. 
32a10 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
32a20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
32a30 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c  ar **)pArg = NUL
32a40 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
32a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32a60 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
32a70 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
32a80 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
32a90 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
32aa0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
32ab0 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  )id;.      int r
32ac0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32ad0 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79       int isProxy
32ae0 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e  Style = (pFile->
32af0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
32b00 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20  yIoMethods);.   
32b10 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c     if( pArg==NUL
32b20 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72  L || (const char
32b30 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20   *)pArg==0 ){.  
32b40 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
32b50 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
32b60 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20      /* turn off 
32b70 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20  proxy locking - 
32b80 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f  not supported */
32b90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32ba0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53  SQLITE_ERROR /*S
32bb0 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20  QLITE_PROTOCOL? 
32bc0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f  SQLITE_MISUSE?*/
32bd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
32be0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
32bf0 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
32c00 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f  king - already o
32c10 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20  ff - NOOP */.   
32c20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32c30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
32c40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32c50 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
32c60 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63   *proxyPath = (c
32c70 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67  onst char *)pArg
32c80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
32c90 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20  ProxyStyle ){.  
32ca0 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63          proxyLoc
32cb0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
32cc0 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  x = .           
32cd0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
32ce0 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
32cf0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
32d00 20 20 20 20 20 20 20 20 69 66 28 20 21 73 74 72          if( !str
32d10 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f  cmp(pArg, ":auto
32d20 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  :") .           
32d30 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  || (pCtx->lockPr
32d40 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20 20 20  oxyPath &&.     
32d50 20 20 20 20 20 20 20 20 20 20 21 73 74 72 6e 63            !strnc
32d60 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
32d70 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74  xyPath, proxyPat
32d80 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a  h, MAXPATHLEN)).
32d90 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
32da0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32db0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
32dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32dd0 20 20 20 20 20 20 72 63 20 3d 20 73 77 69 74 63        rc = switc
32de0 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70  hLockProxyPath(p
32df0 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29  File, proxyPath)
32e00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32e10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32e20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
32e30 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  n proxy file loc
32e40 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
32e50 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
32e60 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46  sformUnixFile(pF
32e70 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ile, proxyPath);
32e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32e90 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
32ea0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  rc;.    }.    de
32eb0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
32ec0 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20  ssert( 0 );  /* 
32ed0 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73  The call assures
32ee0 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64   that only valid
32ef0 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e   opcodes are sen
32f00 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t */.    }.  }. 
32f10 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
32f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32f30 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
32f40 57 69 74 68 69 6e 20 74 68 69 73 20 64 69 76 69  Within this divi
32f50 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69  sion (the proxyi
32f60 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ng locking imple
32f70 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70  mentation) the p
32f80 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f  rocedures.** abo
32f90 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72  ve this point ar
32fa0 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e  e all utilities.
32fb0 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74    The lock-relat
32fc0 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ed methods of th
32fd0 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  e.** proxy-locki
32fe0 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ng sqlite3_io_me
32ff0 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c  thod object foll
33000 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ow..*/.../*.** T
33010 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
33020 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
33030 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
33040 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
33050 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
33060 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
33070 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
33080 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
33090 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
330a0 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
330b0 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
330c0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
330d0 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
330e0 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
330f0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
33100 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
33110 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
33120 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
33130 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
33140 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
33150 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
33160 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
33170 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69  pResOut) {.  uni
33180 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
33190 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
331a0 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
331b0 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
331c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
331d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
331e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
331f0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
33200 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
33210 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
33220 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
33230 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
33240 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
33250 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
33260 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
33270 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70   return proxy->p
33280 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65  Method->xCheckRe
33290 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69  servedLock((sqli
332a0 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
332b0 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d   pResOut);.    }
332c0 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65  else{ /* conchHe
332d0 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
332e0 73 73 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ss */.      pRes
332f0 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  Out=0;.    }.  }
33300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33310 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
33320 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
33330 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
33340 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
33350 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
33360 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
33370 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
33380 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
33390 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
333a0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
333b0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
333c0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
333d0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
333e0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
333f0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
33400 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
33410 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
33420 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
33430 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
33440 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
33450 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
33460 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
33470 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
33480 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
33490 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
334a0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
334b0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
334c0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
334d0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
334e0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
334f0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
33500 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
33510 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
33520 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
33530 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
33540 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
33550 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
33560 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
33570 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
33580 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
33590 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
335a0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
335b0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
335c0 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
335d0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
335e0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
335f0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
33600 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
33610 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
33620 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
33630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33640 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
33650 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
33660 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
33670 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
33680 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
33690 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
336a0 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
336b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
336c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
336d0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
336e0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
336f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
33700 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
33710 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  ntext;.    if( p
33720 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
33730 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69   ){.      unixFi
33740 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
33750 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
33760 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70     rc = proxy->p
33770 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
33780 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
33790 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a  xy, eFileLock);.
337a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
337b0 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e  leLock = proxy->
337c0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  eFileLock;.    }
337d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63  else{.      /* c
337e0 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20  onchHeld < 0 is 
337f0 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
33800 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
33810 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
33820 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
33830 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
33840 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
33850 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
33860 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
33870 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
33880 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
33890 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
338a0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
338b0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
338c0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
338d0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
338e0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
338f0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
33900 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
33910 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
33920 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
33930 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
33940 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
33950 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
33960 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
33970 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72  d;.  int rc = pr
33980 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
33990 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  le);.  if( rc==S
339a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
339b0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
339c0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
339d0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
339e0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
339f0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66  gContext;.    if
33a00 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
33a10 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  d>0 ){.      uni
33a20 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
33a30 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
33a40 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
33a50 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
33a60 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
33a70 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f  *)proxy, eFileLo
33a80 63 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ck);.      pFile
33a90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72  ->eFileLock = pr
33aa0 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  oxy->eFileLock;.
33ab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33ac0 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20   /* conchHeld < 
33ad0 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  0 is lockless */
33ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
33af0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33b00 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68   Close a file th
33b10 61 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f  at uses proxy lo
33b20 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cks..*/.static i
33b30 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
33b40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
33b50 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
33b60 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
33b70 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
33b80 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  d;.    proxyLock
33b90 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
33ba0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
33bb0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
33bc0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
33bd0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  .    unixFile *l
33be0 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d  ockProxy = pCtx-
33bf0 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
33c00 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
33c10 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
33c20 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72  hFile;.    int r
33c30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
33c40 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b     .    if( lock
33c50 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
33c60 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  c = lockProxy->p
33c70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
33c80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
33c90 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43  ockProxy, NO_LOC
33ca0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
33cb0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33cc0 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f      rc = lockPro
33cd0 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
33ce0 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
33cf0 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  e*)lockProxy);. 
33d00 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
33d10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
33d20 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
33d30 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43  Proxy);.      pC
33d40 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  tx->lockProxy = 
33d50 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
33d60 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20   conchFile ){.  
33d70 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
33d80 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20  nchHeld ){.     
33d90 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c     rc = proxyRel
33da0 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  easeConch(pFile)
33db0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
33dc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
33de0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
33df0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
33e00 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
33e10 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
33e20 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
33e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
33e40 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  ree(conchFile);.
33e50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
33e60 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63  3_free(pCtx->loc
33e70 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20  kProxyPath);.   
33e80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
33e90 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
33ea0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
33eb0 66 72 65 65 28 70 43 74 78 2d 3e 64 62 50 61 74  free(pCtx->dbPat
33ec0 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f  h);.    /* resto
33ed0 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
33ee0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
33ef0 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
33f00 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20   close it */.   
33f10 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
33f20 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f  ontext = pCtx->o
33f30 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
33f40 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
33f50 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c  thod = pCtx->pOl
33f60 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c  dMethod;.    sql
33f70 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
33f80 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c  .    return pFil
33f90 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
33fa0 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  se(id);.  }.  re
33fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33fc0 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  }....#endif /* d
33fd0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
33fe0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
33ff0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
34000 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72   */./*.** The pr
34010 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  oxy locking styl
34020 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
34030 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66  r use with AFP f
34040 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41  ilesystems..** A
34050 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20  nd since AFP is 
34060 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
34070 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72  n MacOSX, the pr
34080 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
34090 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65  lso.** restricte
340a0 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20  d to MacOSX..** 
340b0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
340c0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
340d0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d  he proxy lock im
340e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
340f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34100 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
34110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34150 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  **/../*.** Initi
34160 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
34170 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
34180 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  face..**.** This
34190 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
341a0 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65  rs all VFS imple
341b0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75  mentations for u
341c0 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69  nix-like operati
341d0 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
341e0 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e  This routine, an
341f0 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73  d the sqlite3_os
34200 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74  _end() routine t
34210 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20  hat follows,.** 
34220 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
34230 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ly routines in t
34240 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72  his file that ar
34250 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
34260 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  ther.** files..*
34270 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
34280 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
34290 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69   during SQLite i
342a0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e  nitialization an
342b0 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  d by a.** single
342c0 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65   thread.  The me
342d0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
342e0 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
342f0 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a  tems have not.**
34300 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65   necessarily bee
34310 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  n initialized wh
34320 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
34330 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  is called, and s
34340 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  o they.** should
34350 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f   not be used..*/
34360 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
34370 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f  init(void){ .  /
34380 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  * .  ** The foll
34390 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69  owing macro defi
343a0 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  nes an initializ
343b0 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65  er for an sqlite
343c0 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20  3_vfs object..  
343d0 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** The name of t
343e0 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20  he VFS is NAME. 
343f0 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73   The pAppData is
34400 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
34410 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20  pointer.  ** to 
34420 74 68 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e  the "finder" fun
34430 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74  ction.  (pAppDat
34440 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
34450 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61  o a pointer beca
34460 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43  use.  ** silly C
34470 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69  90 rules prohibi
34480 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62  t a void* from b
34490 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66  eing cast to a f
344a0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a  unction pointer.
344b0 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68    ** and so we h
344c0 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67  ave to go throug
344d0 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  h the intermedia
344e0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76  te pointer to av
344f0 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a  oid problems.  *
34500 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
34510 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
34520 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a  errors on GCC.).
34530 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49    **.  ** The FI
34540 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74  NDER parameter t
34550 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
34560 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
34570 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
34580 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   ** finder-funct
34590 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72  ion.  The finder
345a0 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  -function return
345b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
345c0 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69  he.  ** sqlite_i
345d0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
345e0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
345f0 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63   the desired loc
34600 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69  king.  ** behavi
34610 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69  ors.  See the di
34620 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61  vision above tha
34630 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
34640 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61  OMETHODS.  ** ma
34650 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  cro for addition
34660 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
34670 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73  finder-functions
34680 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74  ..  **.  ** Most
34690 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20   finders simply 
346a0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
346b0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
346c0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20  te3_io_methods. 
346d0 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74   ** object.  But
346e0 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f   the "autolockIo
346f0 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c  Finder" availabl
34700 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73  e on MacOSX does
34710 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d   a little.  ** m
34720 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69  ore than that; i
34730 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  t looks at the f
34740 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74  ilesystem type t
34750 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20  hat hosts the . 
34760 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
34770 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63  e and tries to c
34780 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67  hoose an locking
34790 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69   method appropri
347a0 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61  ate for.  ** tha
347b0 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d  t filesystem tim
347c0 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  e..  */.  #defin
347d0 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d  e UNIXVFS(VFSNAM
347e0 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20  E, FINDER) {    
347f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34800 20 20 20 20 5c 0a 20 20 20 20 32 2c 20 20 20 20      \.    2,    
34810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34820 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34840 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
34850 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
34860 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
34870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34880 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
34890 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
348a0 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
348b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
348c0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
348d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
348e0 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
348f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
34900 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20    VFSNAME,      
34910 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
34920 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
34930 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
34940 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20  (void*)&FINDER, 
34950 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
34960 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
34970 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
34980 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
34990 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
349a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349b0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
349c0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
349d0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
349e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349f0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
34a00 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
34a10 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
34a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a30 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
34a40 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
34a50 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
34a60 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
34a70 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
34a80 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
34a90 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
34aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
34ab0 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
34ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
34ad0 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
34ae0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
34af0 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
34b00 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
34b10 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
34b20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
34b30 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
34b40 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
34b50 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
34b60 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
34b70 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
34b80 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
34b90 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
34ba0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
34bb0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
34bc0 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
34bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34be0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
34bf0 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
34c00 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
34c10 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
34c20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
34c30 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
34c40 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
34c50 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
34c60 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e  \.    unixCurren
34c70 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
34c80 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
34c90 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 5c 0a   */           \.
34ca0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41    }..  /*.  ** A
34cb0 6c 6c 20 64 65 66 61 75 6c 74 20 56 46 53 65 73  ll default VFSes
34cc0 20 66 6f 72 20 75 6e 69 78 20 61 72 65 20 63 6f   for unix are co
34cd0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66  ntained in the f
34ce0 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a  ollowing array..
34cf0 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
34d00 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  hat the sqlite3_
34d10 76 66 73 2e 70 4e 65 78 74 20 66 69 65 6c 64 20  vfs.pNext field 
34d20 6f 66 20 74 68 65 20 56 46 53 20 6f 62 6a 65 63  of the VFS objec
34d30 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a 20 20  t is modified.  
34d40 2a 2a 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ** by the SQLite
34d50 20 63 6f 72 65 20 77 68 65 6e 20 74 68 65 20 56   core when the V
34d60 46 53 20 69 73 20 72 65 67 69 73 74 65 72 65 64  FS is registered
34d70 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  .  So the follow
34d80 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79 20 63  ing.  ** array c
34d90 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a  annot be const..
34da0 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 73 71    */.  static sq
34db0 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d  lite3_vfs aVfs[]
34dc0 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f   = {.#if SQLITE_
34dd0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
34de0 54 59 4c 45 20 26 26 20 28 4f 53 5f 56 58 57 4f  TYLE && (OS_VXWO
34df0 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  RKS || defined(_
34e00 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 55  _APPLE__)).    U
34e10 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20  NIXVFS("unix",  
34e20 20 20 20 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b          autolock
34e30 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73  IoFinder ),.#els
34e40 65 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  e.    UNIXVFS("u
34e50 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 70  nix",          p
34e60 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
34e70 23 65 6e 64 69 66 0a 20 20 20 20 55 4e 49 58 56  #endif.    UNIXV
34e80 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20  FS("unix-none", 
34e90 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64      nolockIoFind
34ea0 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46  er ),.    UNIXVF
34eb0 53 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22  S("unix-dotfile"
34ec0 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  ,  dotlockIoFind
34ed0 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57  er ),.#if OS_VXW
34ee0 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53  ORKS.    UNIXVFS
34ef0 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22  ("unix-namedsem"
34f00 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c  , semIoFinder ),
34f10 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
34f20 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
34f30 47 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e 49 58  G_STYLE.    UNIX
34f40 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78 22  VFS("unix-posix"
34f50 2c 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  ,    posixIoFind
34f60 65 72 20 29 2c 0a 23 69 66 20 21 4f 53 5f 56 58  er ),.#if !OS_VX
34f70 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46  WORKS.    UNIXVF
34f80 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20  S("unix-flock", 
34f90 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72     flockIoFinder
34fa0 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69   ),.#endif.#endi
34fb0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
34fc0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
34fd0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
34fe0 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58  PPLE__).    UNIX
34ff0 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22 2c 20  VFS("unix-afp", 
35000 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64 65 72       afpIoFinder
35010 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28   ),.    UNIXVFS(
35020 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20 20 20  "unix-nfs",     
35030 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29 2c 0a   nfsIoFinder ),.
35040 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
35050 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72 6f  x-proxy",    pro
35060 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  xyIoFinder ),.#e
35070 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  ndif.  };.  unsi
35080 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20 20  gned int i;     
35090 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
350a0 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  nter */..  /* Re
350b0 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73  gister all VFSes
350c0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
350d0 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  aVfs[] array */.
350e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73 69    for(i=0; i<(si
350f0 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65 6f  zeof(aVfs)/sizeo
35100 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b  f(sqlite3_vfs));
35110 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
35120 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
35130 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b  &aVfs[i], i==0);
35140 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
35150 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a  LITE_OK; .}../*.
35160 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
35170 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
35180 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
35190 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  * Some operating
351a0 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20 6e   systems might n
351b0 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20 63  eed to do some c
351c0 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20 72  leanup in this r
351d0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72 65  outine,.** to re
351e0 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c 6c  lease dynamicall
351f0 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65  y allocated obje
35200 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f 6e  cts.  But not on
35210 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20 72   unix..** This r
35220 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
35230 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69  p for unix..*/.i
35240 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e  nt sqlite3_os_en
35250 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74 75  d(void){ .  retu
35260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
35270 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  . .#endif /* SQL
35280 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a     ITE_OS_UNIX */.