/ Hex Artifact Content
Login

Artifact aeef5f00753ee92478ae1d6c0c92b1aee26691c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
12c0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
12d0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
12e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
12f0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1300: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1320: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1330: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1340: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1350: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1360: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1370: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1380: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1390: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
13a0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
13b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
13c0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
13d0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
13e0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
13f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1400: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1410: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1420: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1450: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1460: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1470: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1480: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1490: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
14a0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14b0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14c0: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
14d0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14e0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14f0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1500: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1510: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1520: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1530: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1540: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1550: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1560: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1570: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1580: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1590: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15a0: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
15b0: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
15c0: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
15d0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
15e0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
15f0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1600: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1610: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
1620: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1630: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1640: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1650: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1670: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1680: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1690: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
16a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16b0: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
16c0: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
16d0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
16e0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
16f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1700: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
1710: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
1720: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1730: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1740: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1750: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1760: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1770: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1780: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1790: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
17a0: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
17b0: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
17c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
17d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
17e0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
17f0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1800: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1810: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1820: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1830: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1840: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1850: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1860: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1870: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1880: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1890: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
18a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
18d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
18e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1900: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1910: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1920: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1930: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1950: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1960: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1970: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1980: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1990: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
19a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
19b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
19c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
19d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
19e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1a00: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1a10: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1a20: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1a30: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1a40: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1a50: 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49  entry */.  unixI
1a60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a80: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1a90: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ae0: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 3b   */.  int dirfd;
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1b10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1b20: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
1b30: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1b40: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1b60: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1b70: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1b80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
1b90: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
1ba0: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1bb0: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1bc0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1bd0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c00: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c10: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1c20: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1c30: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1c40: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1c50: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1c60: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1c70: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c90: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1ca0: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cd0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1ce0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1cf0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1d20: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1d30: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1d40: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1d70: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1d80: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1d90: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1da0: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1db0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dd0: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1de0: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1df0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1e00: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1e10: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1e20: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1e30: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1e60: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1e70: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1e80: 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20 69  _VXWORKS.  int i
1e90: 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20  sDelete;        
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb0: 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  * Delete on clos
1ec0: 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 73  e if true */.  s
1ed0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
1ee0: 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20  eId *pId;       
1ef0: 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c     /* Unique fil
1f00: 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  e ID */.#endif.#
1f10: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1f20: 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  /* The next grou
1f30: 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61  p of variables a
1f40: 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b  re used to track
1f50: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1f60: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  the.  ** transac
1f70: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20  tion counter in 
1f80: 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64  bytes 24-27 of d
1f90: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
1fa0: 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77  e updated.  ** w
1fb0: 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74  henever any part
1fc0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fd0: 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73   changes.  An as
1fe0: 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
1ff0: 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66  ll.  ** occur if
2000: 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74   a file is updat
2010: 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20  ed without also 
2020: 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61  updating the tra
2030: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
2040: 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73  unter.  This tes
2050: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f  t is made to avo
2060: 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20  id new problems 
2070: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
2080: 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65   ** one describe
2090: 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38  d by ticket #358
20a0: 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67  4. .  */.  unsig
20b0: 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e  ned char transCn
20c0: 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75  trChng;   /* Tru
20d0: 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  e if the transac
20e0: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61  tion counter cha
20f0: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
2100: 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65  ed char dbUpdate
2110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2120: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
2130: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2140: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2150: 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61  ned char inNorma
2160: 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75  lWrite;   /* Tru
2170: 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  e if in a normal
2180: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
2190: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
21a0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
21b0: 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c  /* In test mode,
21c0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
21d0: 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ze of this struc
21e0: 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68  ture a bit so th
21f0: 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c  at .  ** it is l
2200: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
2210: 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20  truct CrashFile 
2220: 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36  defined in test6
2230: 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  .c..  */.  char 
2240: 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65  aPadding[32];.#e
2250: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
2260: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
2270: 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63  r the unixFile.c
2280: 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b  trlFlags bitmask
2290: 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  :.*/.#define UNI
22a0: 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 30 78 30  XFILE_EXCL   0x0
22b0: 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  1     /* Connect
22c0: 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72  ions from one pr
22d0: 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64  ocess only */.#d
22e0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52  efine UNIXFILE_R
22f0: 44 4f 4e 4c 59 20 30 78 30 32 20 20 20 20 20 2f  DONLY 0x02     /
2300: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * Connection is 
2310: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a  read only */../*
2320: 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65  .** Include code
2330: 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20   that is common 
2340: 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69  to all os_*.c fi
2350: 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  les.*/.#include 
2360: 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f  "os_common.h"../
2370: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69  *.** Define vari
2380: 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20  ous macros that 
2390: 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  are missing from
23a0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a   some systems..*
23b0: 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47  /.#ifndef O_LARG
23c0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
23d0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
23e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
23f0: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20  E_DISABLE_LFS.# 
2400: 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  undef O_LARGEFIL
2410: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2420: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2430: 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c  #ifndef O_NOFOLL
2440: 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f  OW.# define O_NO
2450: 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a  FOLLOW 0.#endif.
2460: 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59  #ifndef O_BINARY
2470: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41  .# define O_BINA
2480: 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RY 0.#endif../*.
2490: 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20  ** The threadid 
24a0: 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74  macro resolves t
24b0: 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20  o the thread-id 
24c0: 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66  or to 0.  Used f
24d0: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
24e0: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
24f0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
2500: 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69  THREADSAFE.#defi
2510: 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72  ne threadid pthr
2520: 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65  ead_self().#else
2530: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
2540: 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d 0.#endif../*.*
2550: 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78  * Different Unix
2560: 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65   systems declare
2570: 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65   open() in diffe
2580: 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65  rent ways.  Same
2590: 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e   use.** open(con
25a0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64  st char*,int,mod
25b0: 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73  e_t).  Others us
25c0: 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e open(const cha
25d0: 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20  r*,int,...)..** 
25e0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
25f0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e  s important when
2600: 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72   using a pointer
2610: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
2620: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65  ..**.** The safe
2630: 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77  st way to deal w
2640: 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ith the problem 
2650: 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65  is to always use
2660: 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a   this wrapper.**
2670: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61   which always ha
2680: 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d  s the same well-
2690: 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63  defined interfac
26a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26b0: 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74   posixOpen(const
26c0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
26d0: 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64  t flags, int mod
26e0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  e){.  return ope
26f0: 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  n(zFile, flags, 
2700: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mode);.}../*.** 
2710: 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c  Many system call
2720: 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74  s are accessed t
2730: 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74  hrough pointer-t
2740: 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74  o-functions so t
2750: 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20  hat.** they may 
2760: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74  be overridden at
2770: 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69   runtime to faci
2780: 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a  litate fault inj
2790: 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a  ection during.**
27a0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e   testing and san
27b0: 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f  dboxing.  The fo
27c0: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
27d0: 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e  lds the names an
27e0: 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  d pointers.** to
27f0: 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c   all overrideabl
2800: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a  e system calls..
2810: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
2820: 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a   unix_syscall {.
2830: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2840: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2850: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
2860: 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  ytem call */.  s
2870: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2880: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
2890: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
28a0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
28b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
28c0: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
28d0: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
28e0: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
28f0: 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70  ll[] = {.  { "op
2900: 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  en",         (sq
2910: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2920: 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20  r)posixOpen,  0 
2930: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
2940: 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  en      ((int(*)
2950: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2960: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30  ,int))aSyscall[0
2970: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
2980: 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20   "close",       
2990: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
29a0: 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20  l_ptr)close,    
29b0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
29c0: 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e  osClose     ((in
29d0: 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61  t(*)(int))aSysca
29e0: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
29f0: 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20  .  { "access",  
2a00: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2a10: 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73  scall_ptr)access
2a20: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
2a30: 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20  ine osAccess    
2a40: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
2a50: 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61  har*,int))aSysca
2a60: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[2].pCurrent).
2a70: 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20  .  { "getcwd",  
2a80: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2a90: 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64  scall_ptr)getcwd
2aa0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
2ab0: 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20  ine osGetcwd    
2ac0: 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a  ((char*(*)(char*
2ad0: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
2ae0: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
2af0: 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20    { "stat",     
2b00: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2b10: 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20  call_ptr)stat,  
2b20: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2b30: 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28  ne osStat      (
2b40: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
2b50: 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a  ar*,struct stat*
2b60: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
2b70: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54  urrent)../*.** T
2b80: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
2b90: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
2ba0: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
2bb0: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
2bc0: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
2bd0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
2be0: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
2bf0: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
2c00: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
2c10: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
2c20: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
2c30: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
2c40: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
2c50: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
2c60: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
2c70: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
2c80: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  fdef __DJGPP__. 
2c90: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
2ca0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2cb0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2cc0: 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c  ine osFstat(a,b,
2cd0: 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20  c)    0.#else   
2ce0: 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20    .  { "fstat", 
2cf0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2d00: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61  syscall_ptr)fsta
2d10: 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  t,      0  },.#d
2d20: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20  efine osFstat   
2d30: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73    ((int(*)(int,s
2d40: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
2d50: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
2d60: 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22  t).#endif..  { "
2d70: 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28  ftruncate",    (
2d80: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2d90: 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20  ptr)ftruncate,  
2da0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2db0: 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28  Ftruncate ((int(
2dc0: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  *)(int,off_t))aS
2dd0: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
2de0: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22  nt)..  { "fcntl"
2df0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2e00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
2e10: 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ntl,      0  },.
2e20: 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20  #define osFcntl 
2e30: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2e40: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
2e50: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
2e60: 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20  .  { "read",    
2e70: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2e80: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20  scall_ptr)read, 
2e90: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2ea0: 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20  ine osRead      
2eb0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
2ec0: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  ,void*,size_t))a
2ed0: 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72  Syscall[8].pCurr
2ee0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
2ef0: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
2f00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2f10: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
2f20: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
2f30: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2f40: 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20  _ptr)pread,     
2f50: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
2f60: 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20   "pread",       
2f70: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2f80: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
2f90: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
2fa0: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20  define osPread  
2fb0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
2fc0: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
2fd0: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
2fe0: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
2ff0: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3000: 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65  READ64).  { "pre
3010: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
3020: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3030: 29 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20  )pread64,    0  
3040: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
3050: 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71  ead64",      (sq
3060: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3070: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
3080: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
3090: 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28  ne osPread64   (
30a0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
30b0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
30c0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d  _t))aSyscall[10]
30d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
30e0: 22 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20  "write",        
30f0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3100: 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20  _ptr)write,     
3110: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3120: 73 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69  sWrite     ((ssi
3130: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3140: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29  t void*,size_t))
3150: 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75  aSyscall[11].pCu
3160: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3170: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
3180: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
3190: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
31a0: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
31b0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31c0: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20  ll_ptr)pwrite,  
31d0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
31e0: 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20   { "pwrite",    
31f0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3200: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3210: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3220: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
3230: 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e    ((ssize_t(*
3240: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
3250: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
3260: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
3270: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31        aSyscall[1
3280: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
3290: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
32a0: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69  EAD64).  { "pwri
32b0: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
32c0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
32d0: 70 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d  pwrite64,   0  }
32e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
32f0: 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c  ite64",     (sql
3300: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3310: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3320: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3330: 65 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28  e osPwrite64  ((
3340: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3350: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3360: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3380: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
3390: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
33a0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
33b0: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63 68 6d  _STYLE.  { "fchm
33c0: 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  od",       (sqli
33d0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
33e0: 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d  fchmod,     0  }
33f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68  ,.#else.  { "fch
3400: 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c  mod",       (sql
3410: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3420: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3430: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3440: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
3450: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
3460: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
3470: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3480: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
3490: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
34a0: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
34b0: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
34c0: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
34d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
34e0: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
34f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3500: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3510: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3520: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3530: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3540: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
3550: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
3560: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
3570: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3580: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
3590: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
35a0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
35b0: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
35c0: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
35d0: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
35e0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
35f0: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
3600: 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20  * "unix" VFSes. 
3610: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
3620: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
3630: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
3640: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
3650: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
3660: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
3670: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
3680: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
3690: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
36a0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
36b0: 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43  t unixSetSystemC
36c0: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
36d0: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
36e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
36f0: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
3700: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
3710: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
3720: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3730: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
3740: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
3750: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3760: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
3770: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
3780: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
3790: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
37a0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
37b0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
37c0: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
37d0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
37e0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
37f0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
3800: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
3810: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
3820: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
3830: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
3840: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
3850: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
3860: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
3870: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
3880: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
3890: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
38a0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
38b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
38c0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
38d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
38e0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
38f0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
3900: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
3910: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
3920: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
3930: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
3940: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
3950: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
3960: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
3970: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
3980: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
3990: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
39a0: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
39b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
39c0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
39d0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
39e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
39f0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
3a00: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
3a10: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3a20: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
3a30: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3a40: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
3a50: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
3a60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
3a70: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
3a80: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
3a90: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
3aa0: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
3ab0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
3ac0: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
3ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3ae0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3af0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3b00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
3b10: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
3b20: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
3b30: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
3b40: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
3b50: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
3b60: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
3b70: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
3b80: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
3b90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
3ba0: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
3bb0: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
3bc0: 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79  ll_ptr unixGetSy
3bd0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
3be0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
3bf0: 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d,.  const char 
3c00: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69  *zName.){.  unsi
3c10: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55  gned int i;..  U
3c20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3c30: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72  pNotUsed);.  for
3c40: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3c50: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3c60: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3c70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
3c80: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
3c90: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
3ca0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
3cb0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
3cc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3ce0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
3cf0: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
3d00: 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49   after zName.  I
3d10: 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a  f zName==NULL.**
3d20: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
3d30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
3d40: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  st system call. 
3d50: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3d60: 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20  zName.** is the 
3d70: 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  last system call
3d80: 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20   or if zName is 
3d90: 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  not the name of 
3da0: 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65  a valid.** syste
3db0: 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  m call..*/.stati
3dc0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
3dd0: 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  ixNextSystemCall
3de0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
3df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
3e00: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
3e10: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
3e20: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
3e30: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
3e40: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
3e50: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
3e60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
3e70: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
3e80: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
3e90: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
3ea0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
3eb0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
3ec0: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
3ed0: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
3ee0: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
3ef0: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
3f00: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
3f10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3f20: 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65 6e 28 29  .** Retry open()
3f30: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
3f40: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
3f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
3f60: 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  st_open(const ch
3f70: 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e  ar *z, int f, in
3f80: 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  t m){.  int rc;.
3f90: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65    do{ rc = osOpe
3fa0: 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65  n(z,f,m); }while
3fb0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
3fc0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
3fd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3fe0: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
3ff0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
4000: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
4010: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
4020: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
4030: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
4040: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
4050: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
4060: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
4070: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
4080: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
4090: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
40a0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
40b0: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
40c0: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
40d0: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
40e0: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
40f0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
4100: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
4110: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
4120: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
4130: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
4140: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
4150: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
4160: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
4170: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
4180: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
4190: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
41a0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
41b0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
41c0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
41d0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
41e0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
41f0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
4200: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4210: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
4220: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c  tatic void unixL
4230: 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
4240: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4250: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
4260: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
4270: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
4280: 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
4290: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
42a0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
42b0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
42c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
42d0: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
42e0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
42f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
4300: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
4310: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
4320: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
4330: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
4340: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
4350: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
4360: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
4370: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
4380: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
4390: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
43a0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
43b0: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
43c0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
43d0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
43e0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65  azFileLock(int e
43f0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69  FileLock){.  swi
4400: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
4410: 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f  {.    case NO_LO
4420: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
4430: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41 52  ";.    case SHAR
4440: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
4450: 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61  "SHARED";.    ca
4460: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
4470: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
4480: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45  ED";.    case PE
4490: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
44a0: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
44b0: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
44c0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
44d0: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
44e0: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
44f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
4500: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
4510: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
4520: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
4530: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
4540: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
4550: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4560: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
4570: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
4580: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
4590: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
45a0: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
45b0: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
45c0: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
45d0: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
45e0: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
45f0: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
4600: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
4610: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
4620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4630: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
4640: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
4650: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
4660: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
4670: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
4680: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
4690: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
46a0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
46b0: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
46c0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
46d0: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
46e0: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
46f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f  }else{.    s = o
4700: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
4710: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
4720: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
4730: 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25   unknown %d %d %
4740: 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29  d\n", fd, op, s)
4750: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a  ;.    return s;.
4760: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74    }.  if( p->l_t
4770: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4780: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
4790: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
47a0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
47b0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
47c0: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65   = "WRLCK";.  }e
47d0: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
47e0: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
47f0: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
4800: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
4810: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
4820: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f  .  assert( p->l_
4830: 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54  whence==SEEK_SET
4840: 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74   );.  s = osFcnt
4850: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
4860: 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72  savedErrno = err
4870: 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  no;.  sqlite3Deb
4880: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
4890: 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25  %d %d %s %s %d %
48a0: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
48b0: 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a   threadid, fd, z
48c0: 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28  OpName, zType, (
48d0: 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20  int)p->l_start, 
48e0: 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20  (int)p->l_len,. 
48f0: 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69      (int)p->l_pi
4900: 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d  d, s);.  if( s==
4910: 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45  (-1) && op==F_SE
4920: 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70  TLK && (p->l_typ
4930: 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d  e==F_RDLCK || p-
4940: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
4950: 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
4960: 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32  flock l2;.    l2
4970: 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e   = *p;.    osFcn
4980: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
4990: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
49a0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
49b0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
49c0: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
49d0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
49e0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
49f0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
4a00: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
4a10: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
4a20: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
4a30: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
4a40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4a50: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
4a60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4a70: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
4a80: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
4a90: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
4aa0: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
4ab0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
4ac0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
4ad0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
4ae0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
4af0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
4b00: 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20  urn s;.}.#undef 
4b10: 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20  osFcntl.#define 
4b20: 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63  osFcntl lockTrac
4b30: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
4b40: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f  TE_LOCK_TRACE */
4b50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74  ../*.** Retry ft
4b60: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20  runcate() calls 
4b70: 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f  that fail due to
4b80: 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69 63   EINTR.*/.static
4b90: 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75   int robust_ftru
4ba0: 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c  ncate(int h, sql
4bb0: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a  ite3_int64 sz){.
4bc0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20    int rc;.  do{ 
4bd0: 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74 65  rc = osFtruncate
4be0: 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20  (h,sz); }while( 
4bf0: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
4c00: 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
4c10: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
4c20: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
4c30: 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  lates a standard
4c40: 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f 64   POSIX errno cod
4c50: 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67  e into something
4c60: 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74 68  .** useful to th
4c70: 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 65  e clients of the
4c80: 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69 6f   sqlite3 functio
4c90: 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  ns.  Specificall
4ca0: 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65  y, it is.** inte
4cb0: 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74  nded to translat
4cc0: 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  e a variety of "
4cd0: 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f 72  try again" error
4ce0: 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55  s into SQLITE_BU
4cf0: 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72 69  SY.** and a vari
4d00: 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20 63  ety of "please c
4d10: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65  lose the file de
4d20: 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65 72  scriptor NOW" er
4d30: 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51  rors into .** SQ
4d40: 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a  LITE_IOERR.** .*
4d50: 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67 20  * Errors during 
4d60: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
4d70: 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65  f locks, or file
4d80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
4d90: 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68  for locks,.** sh
4da0: 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c  ould handle ENOL
4db0: 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50  CK, ENOTSUP, EOP
4dc0: 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74 65  NOTSUPP separate
4dd0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
4de0: 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  t sqliteErrorFro
4df0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 20  mPosixError(int 
4e00: 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74 20  posixError, int 
4e10: 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a 20  sqliteIOErr) {. 
4e20: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
4e30: 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f  ror) {.#if 0.  /
4e40: 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
4e50: 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f 74  his code was not
4e60: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
4e70: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73 20  In theory, this 
4e80: 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75  branch.  ** shou
4e90: 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74 2c  ld never be hit,
4ea0: 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
4eb0: 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  n should only be
4ec0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20 20   called after.  
4ed0: 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c  ** a locking-rel
4ee0: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28 69  ated function (i
4ef0: 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61 73  .e. fcntl()) has
4f00: 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65   returned non-ze
4f10: 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ro with.  ** the
4f20: 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20   value of errno 
4f30: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
4f40: 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20 73  ument. Since a s
4f50: 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20 66  ystem call has f
4f60: 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e  ailed,.  ** errn
4f70: 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d  o should be non-
4f80: 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
4f90: 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69 66  Despite this, if
4fa0: 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73   errno really is
4fb0: 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20   zero, we still 
4fc0: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
4fd0: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
4fe0: 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d 20  _OK. The system 
4ff0: 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64  call failed, and
5000: 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65   *some* SQLite e
5010: 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a 20  rror should be. 
5020: 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20 62   ** propagated b
5030: 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ack to the calle
5040: 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68  r. Commenting th
5050: 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d 65  is branch out me
5060: 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a  ans errno==0.  *
5070: 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65  * will be handle
5080: 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75 6c  d by the "defaul
5090: 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a  t:" case below..
50a0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a    */.  case 0: .
50b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
50c0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  E_OK;.#endif..  
50d0: 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63  case EAGAIN:.  c
50e0: 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20  ase ETIMEDOUT:. 
50f0: 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63   case EBUSY:.  c
5100: 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73  ase EINTR:.  cas
5110: 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20  e ENOLCK:  .    
5120: 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65  /* random NFS re
5130: 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73  try error, unles
5140: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
5150: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
5160: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
5170: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
5180: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
5190: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20  hat it says */. 
51a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
51b0: 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61  _BUSY;.    .  ca
51c0: 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20 20  se EACCES: .    
51d0: 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69 6b  /* EACCES is lik
51e0: 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67 20  e EAGAIN during 
51f0: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
5200: 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ns, but not any 
5210: 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20  other time*/.   
5220: 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45 72   if( (sqliteIOEr
5230: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
5240: 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71  R_LOCK) || ..(sq
5250: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
5260: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
5270: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
5280: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
5290: 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09  ERR_RDLOCK) ||..
52a0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
52b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
52c0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
52d0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
52e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
52f0: 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66   }.    /* else f
5300: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
5310: 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20   case EPERM: .  
5320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5330: 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a 20  PERM;.    .  /* 
5340: 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c 79 20  EDEADLK is only 
5350: 70 6f 73 73 69 62 6c 65 20 69 66 20 61 20 63 61  possible if a ca
5360: 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45  ll to fcntl(F_SE
5370: 54 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e 20 41  TLKW) is made. A
5380: 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d 6f 64  nd.  ** this mod
5390: 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65 73 20  ule never makes 
53a0: 73 75 63 68 20 61 20 63 61 6c 6c 2e 20 41 6e 64  such a call. And
53b0: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 53 51 4c   the code in SQL
53c0: 69 74 65 20 69 74 73 65 6c 66 20 0a 20 20 2a 2a  ite itself .  **
53d0: 20 61 73 73 65 72 74 73 20 74 68 61 74 20 53 51   asserts that SQ
53e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
53f0: 45 44 20 69 73 20 6e 65 76 65 72 20 72 65 74 75  ED is never retu
5400: 72 6e 65 64 2e 20 46 6f 72 20 74 68 65 73 65 20  rned. For these 
5410: 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74 68 69  reasons.  ** thi
5420: 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 63  s case is also c
5430: 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 66  ommented out. If
5440: 20 74 68 65 20 73 79 73 74 65 6d 20 64 6f 65 73   the system does
5450: 20 73 65 74 20 65 72 72 6e 6f 20 74 6f 20 45 44   set errno to ED
5460: 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65 20  EADLK,.  ** the 
5470: 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f 49  default SQLITE_I
5480: 4f 45 52 52 5f 58 58 58 20 63 6f 64 65 20 77 69  OERR_XXX code wi
5490: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
54a0: 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61 73 65 20  */.#if 0.  case 
54b0: 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74  EDEADLK:.    ret
54c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
54d0: 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64 69 66  _BLOCKED;.#endif
54e0: 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54  .    .#if EOPNOT
54f0: 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20  SUPP!=ENOTSUP.  
5500: 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a  case EOPNOTSUPP:
5510: 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69   .    /* somethi
5520: 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79  ng went terribly
5530: 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75   awry, unless du
5540: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
5550: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
5560: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
5570: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
5580: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
5590: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
55a0: 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50  f.#ifdef ENOTSUP
55b0: 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a  .  case ENOTSUP:
55c0: 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64   .    /* invalid
55d0: 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69   fd, unless duri
55e0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
55f0: 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63  upport introspec
5600: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a  tion, in which .
5610: 20 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c       * it actual
5620: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
5630: 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a   says */.#endif.
5640: 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61    case EIO:.  ca
5650: 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65  se EBADF:.  case
5660: 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20   EINVAL:.  case 
5670: 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65  ENOTCONN:.  case
5680: 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20   ENODEV:.  case 
5690: 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e  ENXIO:.  case EN
56a0: 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20 45 53 54  OENT:.  case EST
56b0: 41 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53  ALE:.  case ENOS
56c0: 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65  YS:.    /* these
56d0: 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68   should force th
56e0: 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73  e client to clos
56f0: 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72  e the file and r
5700: 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20  econnect */.    
5710: 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20  .  default: .   
5720: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f   return sqliteIO
5730: 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a  Err;.  }.}..../*
5740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69   Begin Unique Fi
57b0: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
57c0: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
57d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
57e0: 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73  .** On most vers
57f0: 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65  ions of unix, we
5800: 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75   can get a uniqu
5810: 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20  e ID for a file 
5820: 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67  by concatenating
5830: 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e  .** the device n
5840: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e  umber and the in
5850: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74  ode number.  But
5860: 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77   this does not w
5870: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
5880: 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61  ** On VxWorks, a
5890: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20   unique file id 
58a0: 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e  must be based on
58b0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
58c0: 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41  ilename..**.** A
58d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
58e0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
58f0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
5900: 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  re can be used a
5910: 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69  s a.** unique fi
5920: 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73  le ID in VxWorks
5930: 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  .  Each instance
5940: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
5950: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  re contains.** a
5960: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e   copy of the can
5970: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
5980: 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20    There is also 
5990: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
59a0: 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75  t.  .** The stru
59b0: 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d  cture is reclaim
59c0: 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed when the numb
59d0: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
59e0: 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a  o it drops to.**
59f0: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   zero..**.** The
5a00: 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72  re are never ver
5a10: 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65  y many files ope
5a20: 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e  n at one time an
5a30: 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f  d lookups are no
5a40: 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e  t.** a performan
5a50: 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68  ce-critical path
5a60: 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69  , so it is suffi
5a70: 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65  cient to put the
5a80: 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73  se.** structures
5a90: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
5aa0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77  t..*/.struct vxw
5ab0: 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73  orksFileId {.  s
5ac0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
5ad0: 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20  eId *pNext;  /* 
5ae0: 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f  Next in a list o
5af0: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20  f them all */.  
5b00: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5b20: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
5b30: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e  ences to this on
5b40: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
5b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5b60: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
5b70: 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c  f the zCanonical
5b80: 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f  Name[] string */
5b90: 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69  .  char *zCanoni
5ba0: 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  calName;        
5bb0: 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69   /* Canonical fi
5bc0: 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69  lename */.};..#i
5bd0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20  f OS_VXWORKS./* 
5be0: 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66  .** All unique f
5bf0: 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c  ilenames are hel
5c00: 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  d on a linked li
5c10: 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69  st headed by thi
5c20: 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a  s.** variable:.*
5c30: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
5c40: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76  vxworksFileId *v
5c50: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
5c60: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c   0;../*.** Simpl
5c70: 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69  ify a filename i
5c80: 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61  nto its canonica
5c90: 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b  l form.** by mak
5ca0: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
5cb0: 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a  g changes:.**.**
5cc0: 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79    * removing any
5cd0: 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75   trailing and du
5ce0: 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20  plicate /.**  * 
5cf0: 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f  convert /./ into
5d00: 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f   just /.**  * co
5d10: 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65  nvert /A/../ whe
5d20: 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70  re A is any simp
5d30: 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73  le name into jus
5d40: 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  t /.**.** Change
5d50: 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c  s are made in-pl
5d60: 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ace.  Return the
5d70: 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68   new name length
5d80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
5d90: 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
5da0: 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20   in z[0..n-1].  
5db0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5dc0: 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65  r of.** characte
5dd0: 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69  rs in the simpli
5de0: 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  fied name..*/.st
5df0: 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73  atic int vxworks
5e00: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61  SimplifyName(cha
5e10: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
5e20: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c  int i, j;.  whil
5e30: 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>1 && z[n-1]
5e40: 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  =='/' ){ n--; }.
5e50: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
5e60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
5e70: 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[i]=='/' ){.   
5e80: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
5e90: 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  /' ) continue;. 
5ea0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
5eb0: 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26  ='.' && i+2<n &&
5ec0: 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+2]=='/' ){.
5ed0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a          i += 1;.
5ee0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
5ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5f00: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20  if( z[i+1]=='.' 
5f10: 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b  && i+3<n && z[i+
5f20: 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33  2]=='.' && z[i+3
5f30: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
5f40: 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
5f50: 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a  z[j-1]!='/' ){ j
5f60: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  --; }.        if
5f70: 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  ( j>0 ){ j--; }.
5f80: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a          i += 2;.
5f90: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
5fa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5fb0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
5fc0: 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  ];.  }.  z[j] = 
5fd0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d  0;.  return j;.}
5fe0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75  ../*.** Find a u
5ff0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
6000: 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f  r the given abso
6010: 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20  lute pathname.  
6020: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
6030: 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72  ter to the vxwor
6040: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
6050: 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69    This pointer i
6060: 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20  s the unique.** 
6070: 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54  file ID..**.** T
6080: 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66  he nRef field of
6090: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
60a0: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63  Id object is inc
60b0: 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a  remented before.
60c0: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  ** the object is
60d0: 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65   returned.  A ne
60e0: 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  w vxworksFileId 
60f0: 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
6100: 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74  d.** and added t
6110: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  o the global lis
6120: 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  t if necessary..
6130: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
6140: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
6150: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
6160: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
6170: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
6180: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
6190: 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20  indFileId(const 
61a0: 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e  char *zAbsoluteN
61b0: 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76  ame){.  struct v
61c0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
61d0: 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ew;         /* s
61e0: 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65  earch key and ne
61f0: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73  w file ID */.  s
6200: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6210: 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b  eId *pCandidate;
6220: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
6230: 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20  g over existing 
6240: 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e  file IDs */.  in
6250: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6270: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
6280: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72  AbsoluteName str
6290: 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ing */..  assert
62a0: 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b  ( zAbsoluteName[
62b0: 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d  0]=='/' );.  n =
62c0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62   (int)strlen(zAb
62d0: 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70  soluteName);.  p
62e0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
62f0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
6300: 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20  ew) + (n+1) );. 
6310: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
6320: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
6330: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20  >zCanonicalName 
6340: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
6350: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  ];.  memcpy(pNew
6360: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6370: 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c  , zAbsoluteName,
6380: 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77   n+1);.  n = vxw
6390: 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65  orksSimplifyName
63a0: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
63b0: 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a  lName, n);..  /*
63c0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
63d0: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68  xisting entry th
63e0: 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20  at matching the 
63f0: 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a  canonical name..
6400: 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69    ** If found, i
6410: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
6420: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64  erence count and
6430: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
6440: 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78  r to.  ** the ex
6450: 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a  isting file ID..
6460: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
6470: 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70  Mutex();.  for(p
6480: 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b  Candidate=vxwork
6490: 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64  sFileList; pCand
64a0: 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74  idate; pCandidat
64b0: 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e  e=pCandidate->pN
64c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
64d0: 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d  andidate->nName=
64e0: 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63  =n .     && memc
64f0: 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a  mp(pCandidate->z
6500: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70  CanonicalName, p
6510: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
6520: 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29  ame, n)==0.    )
6530: 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  {.       sqlite3
6540: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
6550: 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e      pCandidate->
6560: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75  nRef++;.       u
6570: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
6580: 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  .       return p
6590: 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d  Candidate;.    }
65a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61  .  }..  /* No ma
65b0: 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  tch was found.  
65c0: 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e  We will make a n
65d0: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
65e0: 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pNew->nRef = 1;.
65f0: 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20    pNew->nName = 
6600: 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  n;.  pNew->pNext
6610: 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69   = vxworksFileLi
6620: 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c  st;.  vxworksFil
6630: 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  eList = pNew;.  
6640: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
6650: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
6660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
6670: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
6680: 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77  e count on a vxw
6690: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
66a0: 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20  t.  Free.** the 
66b0: 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20  object when the 
66c0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
66d0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f  reaches zero..*/
66e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77  .static void vxw
66f0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
6700: 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  d(struct vxworks
6710: 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20  FileId *pId){.  
6720: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
6730: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d  ;.  assert( pId-
6740: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64  >nRef>0 );.  pId
6750: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
6760: 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pId->nRef==0 ){.
6770: 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72      struct vxwor
6780: 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20  ksFileId **pp;. 
6790: 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72     for(pp=&vxwor
67a0: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20  ksFileList; *pp 
67b0: 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20  && *pp!=pId; pp 
67c0: 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  = &((*pp)->pNext
67d0: 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28  )){}.    assert(
67e0: 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20   *pp==pId );.   
67f0: 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78   *pp = pId->pNex
6800: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  t;.    sqlite3_f
6810: 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20  ree(pId);.  }.  
6820: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
6830: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  ;.}.#endif /* OS
6840: 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a  _VXWORKS */./***
6850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
6860: 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20   of Unique File 
6870: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
6880: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
6890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
68a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20  ********* Posix 
6960: 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
6970: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
6980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6990: 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f  .** POSIX adviso
69a0: 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f  ry locks are bro
69b0: 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20  ken by design.  
69c0: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
69d0: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
69e0: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
69f0: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
6a00: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
6a10: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
6a20: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
6a30: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
6a40: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
6a50: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
6a60: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
6a70: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
6a80: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
6a90: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
6aa0: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
6ab0: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
6ac0: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
6ad0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
6ae0: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
6af0: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
6b00: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
6b10: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
6b20: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  *.**       int f
6b30: 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d1 = open("./fil
6b40: 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e1", O_RDWR|O_CR
6b50: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20  EAT, 0644);.**  
6b60: 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f       int fd2 = o
6b70: 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f  pen("./file2", O
6b80: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
6b90: 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70  644);.**.** Supp
6ba0: 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20  ose ./file1 and 
6bb0: 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c  ./file2 are real
6bc0: 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ly the same file
6bd0: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65   (because.** one
6be0: 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79   is a hard or sy
6bf0: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74  mbolic link to t
6c00: 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69  he other) then i
6c10: 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20  f you set.** an 
6c20: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
6c30: 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20  n fd1, then try 
6c40: 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73  to get an exclus
6c50: 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66  ive lock.** on f
6c60: 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49  d2, it works.  I
6c70: 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65   would have expe
6c80: 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20  cted the second 
6c90: 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20  lock to.** fail 
6ca0: 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20  since there was 
6cb0: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
6cc0: 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74  n the file due t
6cd0: 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f  o fd1..** But no
6ce0: 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74  t so.  Since bot
6cf0: 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f  h locks came fro
6d00: 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  m the same proce
6d10: 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  ss, the.** secon
6d20: 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20  d overrides the 
6d30: 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75  first, even thou
6d40: 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20  gh they were on 
6d50: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
6d60: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
6d70: 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e  ened on differen
6d80: 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a  t file names..**
6d90: 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74  .** This means t
6da0: 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hat we cannot us
6db0: 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f  e POSIX locks to
6dc0: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c   synchronize fil
6dd0: 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e  e access.** amon
6de0: 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65  g competing thre
6df0: 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ads of the same 
6e00: 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20  process.  POSIX 
6e10: 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20  locks will work 
6e20: 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68  fine.** to synch
6e30: 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f  ronize access fo
6e40: 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70  r threads in sep
6e50: 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c  arate processes,
6e60: 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65   but not.** thre
6e70: 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  ads within the s
6e80: 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ame process..**.
6e90: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
6ea0: 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53  d the problem, S
6eb0: 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e  QLite has to man
6ec0: 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69  age file locks i
6ed0: 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20  nternally.** on 
6ee0: 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76  its own.  Whenev
6ef0: 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  er a new databas
6f00: 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20  e is opened, we 
6f10: 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65  have to find the
6f20: 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f  .** specific ino
6f30: 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
6f40: 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f  se file (the ino
6f50: 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  de is determined
6f60: 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65   by the.** st_de
6f70: 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65  v and st_ino fie
6f80: 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20  lds of the stat 
6f90: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66  structure that f
6fa0: 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29  stat() fills in)
6fb0: 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f  .** and check fo
6fc0: 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20  r locks already 
6fd0: 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74  existing on that
6fe0: 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f   inode.  When lo
6ff0: 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74  cks are.** creat
7000: 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77  ed or removed, w
7010: 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61  e have to look a
7020: 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e  t our own intern
7030: 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
7040: 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65  .** locks to see
7050: 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65   if another thre
7060: 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c  ad has previousl
7070: 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20  y set a lock on 
7080: 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f  that same.** ino
7090: 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65  de..**.** (Aside
70a0: 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f  : The use of ino
70b0: 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e  de numbers as un
70c0: 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f  ique IDs does no
70d0: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
70e0: 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b  s..** For VxWork
70f0: 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73  s, we have to us
7100: 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76  e the alternativ
7110: 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74  e unique ID syst
7120: 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63  em based on.** c
7130: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
7140: 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65  e and implemente
7150: 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  d in the previou
7160: 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a  s division.).**.
7170: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66  ** The sqlite3_f
7180: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ile structure fo
7190: 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f  r POSIX is no lo
71a0: 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74  nger just an int
71b0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
71c0: 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20  criptor.  It is 
71d0: 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20  now a structure 
71e0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69  that holds the i
71f0: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
7200: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20  escriptor and a 
7210: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
7220: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
7230: 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e  ribes the intern
7240: 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  al.** locks on t
7250: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7260: 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69   inode.  There i
7270: 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74  s one locking st
7280: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69  ructure.** per i
7290: 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20  node, so if the 
72a0: 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70  same inode is op
72b0: 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68  ened twice, both
72c0: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
72d0: 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  ures.** point to
72e0: 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e   the same lockin
72f0: 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  g structure.  Th
7300: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
7310: 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72  ure keeps.** a r
7320: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28  eference count (
7330: 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  so we will know 
7340: 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69  when to delete i
7350: 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a  t) and a "cnt".*
7360: 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c  * field that tel
7370: 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e  ls us its intern
7380: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20  al lock status. 
7390: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
73a0: 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c  e.** file is unl
73b0: 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20  ocked.  cnt==-1 
73c0: 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68  means the file h
73d0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
73e0: 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d  lock..** cnt>0 m
73f0: 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63  eans there are c
7400: 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  nt shared locks 
7410: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  on the file..**.
7420: 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  ** Any attempt t
7430: 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
7440: 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68   a file first ch
7450: 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ecks the locking
7460: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
7470: 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  The fcntl() syst
7480: 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20  em call is only 
7490: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61  invoked to set a
74a0: 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20   .** POSIX lock 
74b0: 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  if the internal 
74c0: 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74  lock structure t
74d0: 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65  ransitions betwe
74e0: 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61  en.** a locked a
74f0: 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73  nd an unlocked s
7500: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20  tate..**.** But 
7510: 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65  wait:  there are
7520: 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65   yet more proble
7530: 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64  ms with POSIX ad
7540: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a  visory locks..**
7550: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
7560: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
7570: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
7580: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
7590: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
75a0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
75b0: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
75c0: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
75d0: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
75e0: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
75f0: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
7600: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69  roblem, each uni
7610: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
7620: 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61  t.** maintains a
7630: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
7640: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
7650: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f  locks on tha ino
7660: 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61  de..** When an a
7670: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
7680: 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46  o close an unixF
7690: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
76a0: 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46  e.** other unixF
76b0: 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ile open on the 
76c0: 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20  same inode that 
76d0: 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b  are holding lock
76e0: 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74  s, the call.** t
76f0: 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69  o close() the fi
7700: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
7710: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
7720: 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73  all of the locks
7730: 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75   clear..** The u
7740: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
7750: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
7760: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
7770: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
7780: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
7790: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
77a0: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
77b0: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
77c0: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
77d0: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20  ears..**.** Yet 
77e0: 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a  another problem:
77f0: 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64    LinuxThreads d
7800: 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20  o not play well 
7810: 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73  with posix locks
7820: 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64  ..**.** Many old
7830: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c  er versions of l
7840: 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e  inux use the Lin
7850: 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72  uxThreads librar
7860: 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f  y which is.** no
7870: 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e  t posix complian
7880: 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54  t.  Under LinuxT
7890: 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63  hreads, a lock c
78a0: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
78b0: 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20  .** A cannot be 
78c0: 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72  modified or over
78d0: 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66  ridden by a diff
78e0: 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a  erent thread B..
78f0: 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41  ** Only thread A
7900: 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20   can modify the 
7910: 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62  lock.  Locking b
7920: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
7930: 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70  ct.** if the app
7940: 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  liation uses the
7950: 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f   newer Native Po
7960: 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61  six Thread Libra
7970: 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20  ry (NPTL).** on 
7980: 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54  linux - with NPT
7990: 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  L a lock created
79a0: 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e   by thread A can
79b0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a   override locks.
79c0: 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20  ** in thread B. 
79d0: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f   But there is no
79e0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20   way to know at 
79f0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69  compile-time whi
7a00: 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20  ch.** threading 
7a10: 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67  library is being
7a20: 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65   used.  So there
7a30: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
7a40: 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65  ow at.** compile
7a50: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
7a60: 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61   not thread A ca
7a70: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
7a80: 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a   on thread B..**
7a90: 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61   One has to do a
7aa0: 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20   run-time check 
7ab0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
7ac0: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a  behavior of the.
7ad0: 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  ** current proce
7ae0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ss..**.** SQLite
7af0: 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74   used to support
7b00: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20   LinuxThreads.  
7b10: 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20  But support for 
7b20: 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20  LinuxThreads.** 
7b30: 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69  was dropped begi
7b40: 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69  nning with versi
7b50: 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74  on 3.7.0.  SQLit
7b60: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72  e will still wor
7b70: 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54  k with.** LinuxT
7b80: 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20  hreads provided 
7b90: 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69  that (1) there i
7ba0: 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
7bb0: 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  ne connection .*
7bc0: 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66  * per database f
7bd0: 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ile in the same 
7be0: 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20  process and (2) 
7bf0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
7c00: 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d  ions.** do not m
7c10: 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61  ove across threa
7c20: 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ds..*/../*.** An
7c30: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7c40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
7c50: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
7c60: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
7c70: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
7c80: 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49  cular unixInodeI
7c90: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
7ca0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
7cb0: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
7ce0: 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  r */.#if OS_VXWO
7cf0: 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77  RKS.  struct vxw
7d00: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b  orksFileId *pId;
7d10: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
7d20: 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e   ID for vxworks.
7d30: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f   */.#else.  ino_
7d40: 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  t ino;          
7d50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65          /* Inode
7d60: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69   number */.#endi
7d70: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
7d80: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
7d90: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
7da0: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
7db0: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
7dc0: 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20   inode.  Or, on 
7dd0: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68  LinuxThreads, th
7de0: 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ere is one of th
7df0: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ese structures f
7e00: 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65  or.** each inode
7e10: 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20   opened by each 
7e20: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
7e30: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
7e40: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
7e50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
7e60: 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c   so each unixFil
7e70: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63  e.** structure c
7e80: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
7e90: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
7ea0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
7eb0: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65  and this.** obje
7ec0: 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74  ct keeps a count
7ed0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
7ee0: 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74  f unixFile point
7ef0: 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ing to it..*/.st
7f00: 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ruct unixInodeIn
7f10: 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  fo {.  struct un
7f20: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
7f30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
7f40: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
7f50: 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20  t nShared;      
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f70: 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45   Number of SHARE
7f80: 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  D locks held */.
7f90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7fa0: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
7fb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52    /* One of SHAR
7fc0: 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
7fd0: 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20  D_LOCK etc. */. 
7fe0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62   unsigned char b
7ff0: 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20  ProcessLock;    
8000: 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65   /* An exclusive
8010: 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73   process lock is
8020: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   held */.  int n
8030: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
8040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8050: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
8060: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
8070: 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  re */.  unixShmN
8080: 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
8090: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
80a0: 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
80b0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e  ted with this in
80c0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ode */.  int nLo
80d0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
80f0: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
8100: 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a  g file locks */.
8110: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
8120: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
8130: 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65    /* Unused file
8140: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20   descriptors to 
8150: 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49  close */.  unixI
8160: 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b  nodeInfo *pNext;
8170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
8180: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  st of all unixIn
8190: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
81a0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
81b0: 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  fo *pPrev;      
81c0: 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20       /*    .... 
81d0: 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f  doubly linked */
81e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
81f0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
8200: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
8210: 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65   long sharedByte
8220: 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69  ;  /* for AFP si
8230: 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c  mulated shared l
8240: 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ock */.#endif.#i
8250: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
8260: 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20  em_t *pSem;     
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8280: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
8290: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
82a0: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
82b0: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20  ATHNAME+2];  /* 
82c0: 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d  Name of that sem
82d0: 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66  aphore */.#endif
82e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  .};../*.** A lis
82f0: 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  ts of all unixIn
8300: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e  odeInfo objects.
8310: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49  .*/.static unixI
8320: 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c  nodeInfo *inodeL
8330: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a  ist = 0;../*.**.
8340: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8350: 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f   - unixLogError_
8360: 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65  x(), is only eve
8370: 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  r called via the
8380: 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f   macro.** unixLo
8390: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
83a0: 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  It is invoked af
83b0: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
83c0: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
83d0: 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20  ction and errno 
83e0: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e  has been.** set.
83f0: 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61   It logs a messa
8400: 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
8410: 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e  _log() containin
8420: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  g the current va
8430: 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20  lue of.** errno 
8440: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
8450: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
8460: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
8470: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
8480: 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  or.** strerror_r
8490: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
84a0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
84b0: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
84c0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
84d0: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
84e0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
84f0: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
8500: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
8510: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
8520: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
8530: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
8540: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
8550: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
8560: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
8570: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
8580: 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20  (e.g. "unlink", 
8590: 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20  "open") and the 
85a0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
85b0: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
85c0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  .** if any..*/.#
85d0: 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72  define unixLogEr
85e0: 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75  ror(a,b,c)     u
85f0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
8600: 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f  e(a,b,c,__LINE__
8610: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ).static int uni
8620: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
8630: 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20  .  int errcode, 
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72     /* SQLite err
8660: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  or code */.  con
8670: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20  st char *zFunc, 
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8690: 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74  Name of OS funct
86a0: 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20  ion that failed 
86b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
86c0: 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
86d0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74       /* File pat
86e0: 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  h associated wit
86f0: 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74  h error */.  int
8700: 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20   iLine          
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8720: 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62  Source line numb
8730: 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f  er where error o
8740: 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20  ccurred */.){.  
8750: 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20  char *zErr;     
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20  /* Message from 
8780: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71  strerror() or eq
8790: 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e  uivalent */.  in
87a0: 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t iErrno = errno
87b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
87c0: 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65   Saved syscall e
87d0: 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  rror number */..
87e0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
87f0: 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65  not a threadsafe
8800: 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54   build (SQLITE_T
8810: 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74  HREADSAFE==0), t
8820: 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65  hen use.  ** the
8830: 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63   strerror() func
8840: 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74  tion to obtain t
8850: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
8860: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  e error message.
8870: 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20    ** equivalent 
8880: 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77  to errno. Otherw
8890: 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ise, use strerro
88a0: 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66  r_r()..  */ .#if
88b0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
88c0: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41  FE && defined(HA
88d0: 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20  VE_STRERROR_R). 
88e0: 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a   char aErr[80];.
88f0: 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30    memset(aErr, 0
8900: 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b  , sizeof(aErr));
8910: 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a  .  zErr = aErr;.
8920: 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f  .  /* If STRERRO
8930: 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20  R_R_CHAR_P (set 
8940: 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69  by autoconf scri
8950: 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e  pts) or __USE_GN
8960: 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20  U is defined,.  
8970: 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
8980: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
8990: 65 73 20 74 68 65 20 74 68 65 20 47 4e 55 20 76  es the the GNU v
89a0: 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72  ersion of strerr
89b0: 6f 72 5f 72 28 29 20 74 68 61 74 20 0a 20 20 2a  or_r() that .  *
89c0: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
89d0: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
89e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
89f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
8a00: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
8a10: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
8a20: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
8a30: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
8a40: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
8a50: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
8a60: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
8a70: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
8a80: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
8a90: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
8aa0: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
8ab0: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
8ac0: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
8ad0: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
8ae0: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
8af0: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
8b00: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
8b10: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
8b20: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
8b30: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
8b40: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
8b50: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
8b60: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
8b70: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
8b80: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
8b90: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
8ba0: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
8bb0: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
8bc0: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
8bd0: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
8be0: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
8bf0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
8c00: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
8c10: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
8c20: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
8c30: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
8c40: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
8c50: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
8c60: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
8c70: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
8c80: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
8c90: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
8ca0: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
8cb0: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
8cc0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
8cd0: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
8ce0: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
8cf0: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
8d00: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
8d10: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
8d20: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
8d30: 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49  t( errcode!=SQLI
8d40: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a  TE_OK );.  if( z
8d50: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
8d60: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
8d70: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
8d80: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
8d90: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
8da0: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
8db0: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
8dc0: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
8dd0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
8de0: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
8df0: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
8e00: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
8e10: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
8e20: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
8e30: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
8e40: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
8e50: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
8e60: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
8e70: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
8e80: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
8e90: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
8ea0: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
8eb0: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
8ec0: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
8ed0: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
8ee0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
8ef0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
8f00: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
8f10: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
8f20: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
8f30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
8f40: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
8f50: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
8f60: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
8f70: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
8f80: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
8f90: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
8fa0: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
8fb0: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
8fc0: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
8fd0: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
8fe0: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
8ff0: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
9000: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
9010: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
9020: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
9030: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
9040: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
9070: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
9080: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
9090: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
90a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
90b0: 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74   accumuated in t
90c0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
90d0: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  ->pUnused list..
90e0: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
90f0: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
9100: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
9110: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
9120: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
9130: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
9140: 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20  xUnusedFd *p;.  
9150: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
9160: 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e  ext;.  for(p=pIn
9170: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b  ode->pUnused; p;
9180: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
9190: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
91a0: 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
91b0: 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20  e(pFile, p->fd, 
91c0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73  __LINE__);.    s
91d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
91e0: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55    }.  pInode->pU
91f0: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
9200: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
9210: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
9220: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
9230: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
9240: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
9250: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
9260: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
9270: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
9280: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
9290: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
92a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
92b0: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
92c0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49  ic void releaseI
92d0: 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c  nodeInfo(unixFil
92e0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
92f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
9300: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
9310: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
9320: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
9330: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
9340: 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e  node) ){.    pIn
9350: 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ode->nRef--;.   
9360: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65   if( pInode->nRe
9370: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
9380: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53  sert( pInode->pS
9390: 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20  hmNode==0 );.   
93a0: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
93b0: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
93c0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72   if( pInode->pPr
93d0: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ev ){.        as
93e0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50  sert( pInode->pP
93f0: 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f  rev->pNext==pIno
9400: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
9410: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
9420: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  xt = pInode->pNe
9430: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
9440: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9450: 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f   inodeList==pIno
9460: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  de );.        in
9470: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
9480: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
9490: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
94a0: 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  e->pNext ){.    
94b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
94c0: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
94d0: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
94e0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
94f0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
9500: 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  e->pPrev;.      
9510: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
9520: 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20  free(pInode);.  
9530: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9540: 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65   Given a file de
9550: 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65  scriptor, locate
9560: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
9570: 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  fo object that.*
9580: 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74  * describes that
9590: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
95a0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
95b0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
95c0: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  .  The.** return
95d0: 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20   value might be 
95e0: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66  uninitialized if
95f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9600: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
9610: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
9620: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
9630: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
9640: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
9650: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
9660: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
9670: 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72  * Return an appr
9680: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
9690: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
96a0: 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  t findInodeInfo(
96b0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
96c0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
96d0: 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77    /* Unix file w
96e0: 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73  ith file desc us
96f0: 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ed in the key */
9700: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9710: 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20   **ppInode      
9720: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
9730: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9740: 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ject here */.){.
9750: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20   /* System call 
9780: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
9790: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
97c0: 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65  riptor for pFile
97d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
97e0: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
97f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b       /* Lookup k
9800: 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49  ey for the unixI
9810: 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74  nodeInfo */.  st
9820: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
9830: 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f;           /* 
9840: 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69  Low-level file i
9850: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
9860: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
9870: 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f  Inode = 0;     /
9880: 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78  * Candidate unix
9890: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
98a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75   */..  assert( u
98b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
98c0: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d  ;..  /* Get low-
98d0: 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  level informatio
98e0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
98f0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
9900: 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65  d to.  ** create
9910: 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66   a unique name f
9920: 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  or the file..  *
9930: 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e  /.  fd = pFile->
9940: 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  h;.  rc = osFsta
9950: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
9960: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
9970: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
9980: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69  rrno = errno;.#i
9990: 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20  fdef EOVERFLOW. 
99a0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61     if( pFile->la
99b0: 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c  stErrno==EOVERFL
99c0: 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  OW ) return SQLI
99d0: 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66  TE_NOLFS;.#endif
99e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
99f0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23  TE_IOERR;.  }..#
9a00: 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
9a10: 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20    /* On OS X on 
9a20: 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73  an msdos filesys
9a30: 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e  tem, the inode n
9a40: 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65  umber is reporte
9a50: 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74  d.  ** incorrect
9a60: 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65  ly for zero-size
9a70: 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63   files.  See tic
9a80: 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77  ket #3260.  To w
9a90: 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20  ork.  ** around 
9aa0: 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65  this problem (we
9ab0: 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62   consider it a b
9ac0: 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20  ug in OS X, not 
9ad0: 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20  SQLite).  ** we 
9ae0: 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20  always increase 
9af0: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f  the file size to
9b00: 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20   1 by writing a 
9b10: 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a  single byte.  **
9b20: 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73   prior to access
9b30: 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  ing the inode nu
9b40: 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62  mber.  The one b
9b50: 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20  yte written is. 
9b60: 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27   ** an ASCII 'S'
9b70: 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68   character which
9b80: 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f   also happens to
9b90: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79   be the first by
9ba0: 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68  te.  ** in the h
9bb0: 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53  eader of every S
9bc0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
9bd0: 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66   In this way, if
9be0: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61   there.  ** is a
9bf0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
9c00: 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65  such that anothe
9c10: 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72  r thread has alr
9c20: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20  eady populated. 
9c30: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61   ** the first pa
9c40: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
9c50: 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73  se, no damage is
9c60: 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   done..  */.  if
9c70: 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  ( statbuf.st_siz
9c80: 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  e==0 && (pFile->
9c90: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
9ca0: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
9cb0: 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b  S)!=0 ){.    do{
9cc0: 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
9cd0: 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c  , "S", 1); }whil
9ce0: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
9cf0: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69  ==EINTR );.    i
9d00: 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  f( rc!=1 ){.    
9d10: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
9d20: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
9d30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9d40: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20  IOERR;.    }.   
9d50: 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64   rc = osFstat(fd
9d60: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20  , &statbuf);.   
9d70: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
9d80: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
9d90: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
9da0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9db0: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
9dc0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d   }.#endif..  mem
9dd0: 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20  set(&fileId, 0, 
9de0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
9df0: 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20  .  fileId.dev = 
9e00: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
9e10: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
9e20: 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46   fileId.pId = pF
9e30: 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a  ile->pId;.#else.
9e40: 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73    fileId.ino = s
9e50: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
9e60: 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d  endif.  pInode =
9e70: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68   inodeList;.  wh
9e80: 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d  ile( pInode && m
9e90: 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26  emcmp(&fileId, &
9ea0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
9eb0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20  sizeof(fileId)) 
9ec0: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
9ed0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
9ee0: 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d   }.  if( pInode=
9ef0: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  =0 ){.    pInode
9f00: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
9f10: 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  c( sizeof(*pInod
9f20: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  e) );.    if( pI
9f30: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  node==0 ){.     
9f40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9f50: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
9f60: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
9f70: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
9f80: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
9f90: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
9fa0: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
9fb0: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
9fc0: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
9fd0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
9fe0: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
9ff0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
a000: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
a010: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
a020: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
a030: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
a040: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
a050: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
a060: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
a070: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
a080: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
a090: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
a0a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
a0b0: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
a0c0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
a0d0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
a0e0: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
a0f0: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
a100: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
a110: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
a120: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
a130: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
a140: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
a150: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
a160: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
a170: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
a180: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
a190: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
a1a0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
a1b0: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
a1c0: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
a1d0: 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73  int unixCheckRes
a1e0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
a1f0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
a200: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
a210: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a220: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
a230: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
a240: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
a250: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
a260: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
a270: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
a280: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
a290: 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
a2a0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78   pFile );.  unix
a2b0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
a2c0: 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
a2d0: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
a2e0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
a2f0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  */..  /* Check i
a300: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
a310: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
a320: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
a330: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
a340: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
a350: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
a360: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
a370: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
a380: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
a390: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
a3a0: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  lds it..  */.#if
a3b0: 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  ndef __DJGPP__. 
a3c0: 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26   if( !reserved &
a3d0: 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  & !pFile->pInode
a3e0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29  ->bProcessLock )
a3f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
a400: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63  ck lock;.    loc
a410: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
a420: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
a430: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
a440: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  ED_BYTE;.    loc
a450: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20  k.l_len = 1;.   
a460: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
a470: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _WRLCK;.    if( 
a480: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
a490: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
a4a0: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
a4b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
a4c0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a  CKRESERVEDLOCK;.
a4d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
a4e0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
a4f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
a500: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
a510: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
a520: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
a530: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
a540: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
a550: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
a560: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
a570: 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d %d (unix)\n", 
a580: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
a590: 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
a5a0: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
a5b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a5c0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
a5d0: 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d  to set a system-
a5e0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
a5f0: 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63   pFile.  The loc
a600: 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62  k is .** describ
a610: 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a  ed by pLock..**.
a620: 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20  ** If the pFile 
a630: 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f  was opened read/
a640: 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d  write from unix-
a650: 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f  excl, then the o
a660: 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72  nly lock.** ever
a670: 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20   obtained is an 
a680: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
a690: 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e  and it is obtain
a6a0: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a  ed exactly once.
a6b0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ** the first tim
a6c0: 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74  e any lock is at
a6d0: 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75  tempted.  All su
a6e0: 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20  bsequent system 
a6f0: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  locking.** opera
a700: 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d  tions become no-
a710: 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70  ops.  Locking op
a720: 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68  erations still h
a730: 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  appen internally
a740: 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  ,.** in order to
a750: 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65   coordinate acce
a760: 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72  ss between separ
a770: 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ate database con
a780: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68  nections.** with
a790: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  in this process,
a7a0: 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74   but all of that
a7b0: 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d   is handled in m
a7c0: 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a  emory and the.**
a7d0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
a7e0: 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69  m does not parti
a7f0: 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cipate..**.** Th
a800: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
a810: 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f   pass-through to
a820: 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20   fcntl(F_SETLK) 
a830: 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e  if pFile is usin
a840: 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68  g.** any VFS oth
a850: 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78  er than "unix-ex
a860: 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20  cl" or if pFile 
a870: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e  is opened on "un
a880: 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20  ix-excl".** and 
a890: 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a  is read-only..**
a8a0: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
a8b0: 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c  rned if the call
a8c0: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
a8d0: 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69  ssfully, or -1 i
a8e0: 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66  f a call.** to f
a8f0: 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e  cntl() fails. In
a900: 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e   this case, errn
a910: 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72  o is set appropr
a920: 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c  iately (by fcntl
a930: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
a940: 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  nt unixFileLock(
a950: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
a960: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
a970: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Lock){.  int rc;
a980: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a990: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
a9a0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
a9b0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
a9c0: 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d() );.  assert(
a9d0: 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20   pInode!=0 );.  
a9e0: 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72  if( ((pFile->ctr
a9f0: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
aa00: 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49  E_EXCL)!=0 || pI
aa10: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
aa20: 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c  ck).   && ((pFil
aa30: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
aa40: 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d  NIXFILE_RDONLY)=
aa50: 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  =0).  ){.    if(
aa60: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
aa70: 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
aa80: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
aa90: 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
aaa0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
aab0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63  ==0 );.      loc
aac0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
aad0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
aae0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
aaf0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
ab00: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
ab10: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
ab20: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ab30: 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20  WRLCK;.      rc 
ab40: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
ab50: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
ab60: 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ck);.      if( r
ab70: 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  c<0 ) return rc;
ab80: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62  .      pInode->b
ab90: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b  ProcessLock = 1;
aba0: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
abb0: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  Lock++;.    }els
abc0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  e{.      rc = 0;
abd0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
abe0: 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
abf0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
ac00: 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a  LK, pLock);.  }.
ac10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ac20: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
ac30: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
ac40: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
ac50: 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
ac60: 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
ac70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
ac80: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
ac90: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
aca0: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
acb0: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
acc0: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
acd0: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
ace0: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
acf0: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
ad00: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
ad10: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
ad20: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
ad30: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
ad40: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
ad50: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
ad60: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
ad70: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
ad80: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
ad90: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
ada0: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
adb0: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
adc0: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
add0: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
ade0: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
adf0: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
ae00: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
ae10: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
ae20: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
ae30: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
ae40: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
ae50: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
ae60: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
ae70: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
ae80: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
ae90: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
aea0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
aeb0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
aec0: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
aed0: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
aee0: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
aef0: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
af00: 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
af10: 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
af20: 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
af30: 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
af40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
af50: 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nixLock(sqlite3_
af60: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
af70: 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54  ileLock){.  /* T
af80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73  he following des
af90: 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65  cribes the imple
afa0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
afb0: 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61   various locks a
afc0: 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61  nd.  ** lock tra
afd0: 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d  nsitions in term
afe0: 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61  s of the POSIX a
aff0: 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61  dvisory shared a
b000: 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a  nd exclusive.  *
b010: 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65  * lock primitive
b020: 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c  s (called read-l
b030: 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c  ocks and write-l
b040: 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61  ocks below, to a
b050: 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73  void.  ** confus
b060: 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20  ion with SQLite 
b070: 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65  lock names). The
b080: 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20   algorithms are 
b090: 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a  complicated.  **
b0a0: 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64   slightly in ord
b0b0: 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69  er to be compati
b0c0: 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73  ble with windows
b0d0: 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61   systems simulta
b0e0: 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63  neously.  ** acc
b0f0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
b100: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
b110: 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65  n case that is e
b120: 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20  ver required..  
b130: 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20  **.  ** Symbols 
b140: 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20  defined in os.h 
b150: 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70  indentify the 'p
b160: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64  ending byte' and
b170: 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20   the 'reserved. 
b180: 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20   ** byte', each 
b190: 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20  single bytes at 
b1a0: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
b1b0: 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61  ts, and the 'sha
b1c0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b1d0: 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66  nge', a range of
b1e0: 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20   510 bytes at a 
b1f0: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65  well known offse
b200: 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20  t..  **.  ** To 
b210: 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20  obtain a SHARED 
b220: 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63  lock, a read-loc
b230: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e  k is obtained on
b240: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20   the 'pending.  
b250: 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68  ** byte'.  If th
b260: 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  is is successful
b270: 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  , a random byte 
b280: 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64  from the 'shared
b290: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
b2a0: 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64  ' is read-locked
b2b0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
b2c0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
b2d0: 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20  te' released..  
b2e0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
b2f0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
b300: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
b310: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61  k after it has a
b320: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20   SHARED lock..  
b330: 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f  ** A RESERVED lo
b340: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
b350: 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20  d by grabbing a 
b360: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
b370: 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64  e.  ** 'reserved
b380: 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20   byte'. .  **.  
b390: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
b3a0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50   only obtain a P
b3b0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65  ENDING lock afte
b3c0: 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65  r it has obtaine
b3d0: 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20  d a.  ** SHARED 
b3e0: 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20  lock. A PENDING 
b3f0: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
b400: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
b410: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20   a write-lock.  
b420: 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ** on the 'pendi
b430: 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65  ng byte'. This e
b440: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e  nsures that no n
b450: 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ew SHARED locks 
b460: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61  can be.  ** obta
b470: 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69  ined, but existi
b480: 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ng SHARED locks 
b490: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70  are allowed to p
b4a0: 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73  ersist. A proces
b4b0: 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  s.  ** does not 
b4c0: 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  have to obtain a
b4d0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
b4e0: 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50  n the way to a P
b4f0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a  ENDING lock..  *
b500: 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20  * This property 
b510: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61  is used by the a
b520: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c  lgorithm for rol
b530: 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
b540: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66  nal file.  ** af
b550: 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a  ter a crash..  *
b560: 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53  *.  ** An EXCLUS
b570: 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e  IVE lock, obtain
b580: 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49  ed after a PENDI
b590: 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c  NG lock is held,
b5a0: 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65   is.  ** impleme
b5b0: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
b5c0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
b5d0: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68  n the entire 'sh
b5e0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
b5f0: 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c  ange'. Since all
b600: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71   other locks req
b610: 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  uire a read-lock
b620: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62   on one of the b
b630: 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e  ytes.  ** within
b640: 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69   this range, thi
b650: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
b660: 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72  o other locks ar
b670: 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  e held on the.  
b680: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20  ** database. .  
b690: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73  **.  ** The reas
b6a0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  on a single byte
b6b0: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
b6c0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27  instead of the '
b6d0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
b6e0: 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20   range' is that 
b6f0: 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
b700: 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20   windows do not 
b710: 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63  support read-loc
b720: 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ks. By.  ** lock
b730: 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ing a random byt
b740: 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20  e from a range, 
b750: 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45  concurrent SHARE
b760: 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73  D locks may exis
b770: 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  t.  ** even if t
b780: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  he locking primi
b790: 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77  tive used is alw
b7a0: 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ays a write-lock
b7b0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ..  */.  int rc 
b7c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
b7d0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
b7e0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
b7f0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
b800: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
b810: 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  >pInode;.  struc
b820: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
b830: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  int tErrno = 0;.
b840: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
b850: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
b860: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
b870: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
b880: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
b890: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a  ile->h,.      az
b8a0: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
b8b0: 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ck), azFileLock(
b8c0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
b8d0: 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  ),.      azFileL
b8e0: 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
b8f0: 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
b900: 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
b910: 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
b920: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
b930: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
b940: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
b950: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
b960: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
b970: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
b980: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
b990: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
b9a0: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
b9b0: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
b9c0: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
b9d0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
b9e0: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
b9f0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
ba00: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
ba10: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
ba20: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
ba30: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
ba40: 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
ba50: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
ba60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ba70: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
ba80: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
ba90: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
baa0: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
bab0: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
bac0: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
bad0: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
bae0: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
baf0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
bb00: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
bb10: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
bb20: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
bb30: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
bb40: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
bb50: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
bb60: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
bb70: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
bb80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
bb90: 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
bba0: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
bbb0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
bbc0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
bbd0: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
bbe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
bbf0: 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
bc00: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
bc10: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
bc20: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
bc30: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
bc40: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
bc50: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
bc60: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
bc70: 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
bc80: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
bc90: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
bca0: 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
bcb0: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
bcc0: 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
bcd0: 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
bce0: 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
bcf0: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
bd00: 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
bd10: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
bd20: 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
bd30: 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
bd40: 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
bd50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
bd60: 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f  .          (pIno
bd70: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
bd80: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
bd90: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
bda0: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
bdb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
bdc0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
bdd0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ock;.  }..  /* I
bde0: 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
bdf0: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
be00: 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
be10: 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
be20: 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
be30: 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
be40: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
be50: 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
be60: 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
be70: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
be80: 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
be90: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
bea0: 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
beb0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
bec0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
bed0: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
bee0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
bef0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
bf00: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
bf10: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
bf20: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
bf30: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
bf40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
bf50: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
bf60: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
bf70: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
bf80: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
bf90: 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
bfa0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
bfb0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
bfc0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ock;.  }...  /* 
bfd0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
bfe0: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
bff0: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
c000: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
c010: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
c020: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
c030: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
c040: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
c050: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
c060: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
c070: 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  */.  lock.l_len 
c080: 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77  = 1L;.  lock.l_w
c090: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
c0a0: 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  ;.  if( eFileLoc
c0b0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
c0c0: 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
c0d0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c0e0: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
c0f0: 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
c100: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c  LOCK).  ){.    l
c110: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46  ock.l_type = (eF
c120: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
c130: 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
c140: 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
c150: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
c160: 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20  G_BYTE;.    if( 
c170: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
c180: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
c190: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
c1a0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
c1b0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
c1c0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
c1d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
c1e0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
c1f0: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
c200: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
c210: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
c220: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
c230: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
c250: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
c260: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
c270: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
c280: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
c290: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
c2a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
c2b0: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
c2c0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
c2d0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c2e0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
c2f0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
c300: 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  Shared==0 );.   
c310: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c320: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
c330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
c340: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
c350: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
c360: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
c370: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c380: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c390: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c3a0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
c3b0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
c3c0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
c3d0: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
c3e0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
c3f0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
c400: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
c410: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
c420: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  ERR_LOCK);.    }
c430: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
c440: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
c450: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
c460: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
c470: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
c480: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
c490: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
c4a0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
c4b0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
c4c0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
c4d0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
c4e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
c4f0: 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77  s could happen w
c500: 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f  ith a network mo
c510: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72  unt */.      tEr
c520: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c530: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
c540: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
c550: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20    }..    if( rc 
c560: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ){.      if( rc!
c570: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
c580: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
c590: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
c5a0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
c5b0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
c5c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c5d0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
c5e0: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
c5f0: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
c600: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
c610: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
c620: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
c630: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
c640: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
c650: 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
c660: 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
c670: 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
c680: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
c690: 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
c6a0: 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
c6b0: 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
c6c0: 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
c6d0: 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
c6e0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
c6f0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
c700: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
c710: 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
c720: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
c730: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
c740: 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
c750: 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
c760: 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
c770: 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
c780: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
c790: 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
c7a0: 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
c7b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
c7c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
c7d0: 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61   F_WRLCK;..    a
c7e0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
c7f0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
c800: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  || eFileLock==EX
c810: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
c820: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
c830: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
c840: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
c850: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
c860: 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f  D_BYTE;.      lo
c870: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
c880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c890: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
c8a0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
c8b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c8c0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
c8d0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78   }..    if( unix
c8e0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
c8f0: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
c900: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
c910: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c920: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
c930: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
c940: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
c950: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
c960: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
c970: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
c980: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
c990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c9a0: 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e   }.  ..#ifndef N
c9b0: 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75  DEBUG.  /* Set u
c9c0: 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
c9d0: 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n-counter change
c9e0: 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20   checking flags 
c9f0: 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69  when.  ** transi
ca00: 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53  tioning from a S
ca10: 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52  HARED to a RESER
ca20: 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63  VED lock.  The c
ca30: 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  hange.  ** from 
ca40: 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
ca50: 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67  ED marks the beg
ca60: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d  inning of a norm
ca70: 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70  al.  ** write op
ca80: 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68  eration (not a h
ca90: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
caa0: 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ack)..  */.  if(
cab0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
cac0: 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c    && pFile->eFil
cad0: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
cae0: 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f  CK.   && eFileLo
caf0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
cb00: 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  K.  ){.    pFile
cb10: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
cb20: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
cb30: 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
cb40: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
cb50: 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a  lWrite = 1;.  }.
cb60: 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72  #endif...  if( r
cb70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cb80: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
cb90: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
cba0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
cbb0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
cbc0: 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
cbd0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
cbe0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
cbf0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
cc00: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
cc10: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
cc20: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
cc30: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e  NG_LOCK;.  }..en
cc40: 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
cc50: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
cc60: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
cc70: 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c  %d %s %s (unix)\
cc80: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
cc90: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
cca0: 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d  ck), .      rc==
ccb0: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
ccc0: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
ccd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cce0: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c  *.** Add the fil
ccf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65  e descriptor use
cd00: 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65  d by file handle
cd10: 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f   pFile to the co
cd20: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70  rresponding.** p
cd30: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  Unused list..*/.
cd40: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50  static void setP
cd50: 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c  endingFd(unixFil
cd60: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
cd70: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
cd80: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
cd90: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
cda0: 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70  Fd *p = pFile->p
cdb0: 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65  Unused;.  p->pNe
cdc0: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
cdd0: 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
cde0: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
cdf0: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
ce00: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d  pFile->pUnused =
ce10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77   0;.}../*.** Low
ce20: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
ce30: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
ce40: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
ce50: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
ce60: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
ce70: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
ce80: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
ce90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
cea0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
ceb0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
cec0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
ced0: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
cee0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
cef0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
cf00: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
cf10: 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e  p..** .** If han
cf20: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20  dleNFSUnlock is 
cf30: 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f  true, then on do
cf40: 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43  wngrading an EXC
cf50: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53  LUSIVE_LOCK to S
cf60: 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74  HARED.** the byt
cf70: 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64  e range is divid
cf80: 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20  ed into 2 parts 
cf90: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61  and the first pa
cfa0: 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74  rt is unlocked t
cfb0: 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20  hen.** set to a 
cfc0: 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  read lock, then 
cfd0: 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69  the other part i
cfe0: 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65  s simply unlocke
cff0: 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a  d.  This works .
d000: 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20  ** around a bug 
d010: 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64  in BSD NFS lockd
d020: 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d   (also seen on M
d030: 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61  acOSX 10.3+) tha
d040: 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72  t fails to .** r
d050: 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20  emove the write 
d060: 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e  lock on a region
d070: 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
d080: 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  k is set..*/.sta
d090: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c  tic int posixUnl
d0a0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
d0b0: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
d0c0: 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e  ock, int handleN
d0d0: 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69  FSUnlock){.  uni
d0e0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
d0f0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
d100: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
d110: 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  Inode;.  struct 
d120: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
d130: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d140: 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73  ;.  int h;..  as
d150: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
d160: 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
d170: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
d180: 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %d,%d) pid=%d (u
d190: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
d1a0: 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
d1b0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
d1c0: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
d1d0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
d1e0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
d1f0: 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65  Shared,.      ge
d200: 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
d210: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
d220: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
d230: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
d240: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
d250: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d260: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
d270: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
d280: 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  ;.  h = pFile->h
d290: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
d2a0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
d2b0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
d2c0: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
d2d0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d2e0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
d2f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
d300: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d310: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
d320: 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
d330: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
d340: 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
d350: 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
d360: 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
d370: 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a  rrorBenign(0);..
d380: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
d390: 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
d3a0: 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
d3b0: 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
d3c0: 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
d3d0: 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
d3e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d3f0: 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
d400: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
d410: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
d420: 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
d430: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
d440: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
d450: 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
d460: 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
d470: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
d480: 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
d490: 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
d4a0: 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
d4b0: 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
d4c0: 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
d4d0: 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
d4e0: 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
d4f0: 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
d500: 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
d510: 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
d520: 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
d530: 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
d540: 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
d550: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
d560: 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20 61 73 73  */.#if 0.    ass
d570: 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
d580: 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
d590: 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
d5a0: 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
d5b0: 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
d5c0: 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
d5d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 46  );.#endif.    pF
d5e0: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
d5f0: 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
d600: 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69      /* downgradi
d610: 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ng to a shared l
d620: 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c  ock on NFS invol
d630: 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65  ves clearing the
d640: 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20   write lock.    
d650: 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c  ** before establ
d660: 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c  ishing the readl
d670: 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  ock - to avoid a
d680: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
d690: 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20  we downgrade.   
d6a0: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20   ** the lock in 
d6b0: 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61  2 blocks, so tha
d6c0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61  t part of the ra
d6d0: 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65  nge will be cove
d6e0: 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a  red by a .    **
d6f0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69   write lock unti
d700: 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f  l the rest is co
d710: 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20  vered by a read 
d720: 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a  lock:.    **  1:
d730: 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a     [WWWWW].    *
d740: 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a  *  2:   [....W].
d750: 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52      **  3:   [RR
d760: 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20  RRW].    **  4: 
d770: 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f    [RRRR.].    */
d780: 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  .    if( eFileLo
d790: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d7a0: 29 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ){..#if !defined
d7b0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21  (__APPLE__) || !
d7c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
d7d0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
d7e0: 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46    (void)handleNF
d7f0: 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  SUnlock;.      a
d800: 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53  ssert( handleNFS
d810: 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e  Unlock==0 );.#en
d820: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
d830: 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
d840: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
d850: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
d860: 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
d870: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ock ){.        i
d880: 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  nt tErrno;      
d890: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
d8a0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
d8b0: 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
d8c0: 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
d8d0: 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
d8e0: 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
d8f0: 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
d900: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
d910: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
d920: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
d930: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
d940: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
d950: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
d960: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
d970: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
d980: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
d990: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
d9a0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
d9b0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
d9c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
d9d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d9e0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
d9f0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
da00: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
da10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
da20: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
da30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
da40: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
da50: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
da60: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
da70: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
da80: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
da90: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
daa0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dab0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
dac0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
dad0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
dae0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
daf0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
db00: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
db10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
db20: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
db30: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
db40: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
db50: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
db60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
db70: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
db80: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
db90: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
dba0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
dbb0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
dbc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dbd0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
dbe0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
dbf0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
dc00: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
dc10: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
dc20: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
dc30: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dc40: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
dc50: 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20  FIRST+divSize;. 
dc60: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
dc70: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d  n = SHARED_SIZE-
dc80: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
dc90: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
dca0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
dcb0: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
dcc0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
dcd0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
dce0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
dcf0: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
dd00: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
dd10: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
dd20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
dd30: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
dd40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
dd50: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
dd60: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
dd70: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
dd80: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
dd90: 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
dda0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
ddb0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20  ING_STYLE */.   
ddc0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63     {.        loc
ddd0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
dde0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
ddf0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
de00: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
de10: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
de20: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
de30: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
de40: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
de50: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
de60: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
de70: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ck) ){.         
de80: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74   /* In theory, t
de90: 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  he call to unixF
dea0: 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74  ileLock() cannot
deb0: 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e   fail because an
dec0: 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  other.          
ded0: 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  ** process is ho
dee0: 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61  lding an incompa
def0: 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69  tible lock. If i
df00: 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20  t does, this .  
df10: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63          ** indic
df20: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74  ates that the ot
df30: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
df40: 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ot following the
df50: 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20   locking.       
df60: 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20     ** protocol. 
df70: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
df80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
df90: 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74  OERR_RDLOCK. Ret
dfa0: 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  urning.         
dfb0: 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   ** SQLITE_BUSY 
dfc0: 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68  would confuse th
dfd0: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69  e upper layer (i
dfe0: 6e 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61  n practice it ca
dff0: 75 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20  uses .          
e000: 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20  ** an assert to 
e010: 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20  fail). */ .     
e020: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e030: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20  _IOERR_RDLOCK;. 
e040: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
e050: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
e060: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  o;.          got
e070: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e090: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
e0a0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
e0b0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
e0c0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
e0d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e0e0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
e0f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
e100: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
e110: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
e120: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
e130: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e140: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e150: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  )==0 ){.      pI
e160: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
e170: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
e180: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e190: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
e1a0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
e1b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e1c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e1d0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
e1e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e1f0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
e200: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65  OCK ){.    /* De
e210: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
e220: 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
e230: 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
e240: 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
e250: 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
e260: 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
e270: 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
e280: 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
e290: 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
e2a0: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
e2b0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
e2c0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
e2d0: 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
e2e0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
e2f0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e300: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e310: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e320: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e330: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
e340: 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  0L;.      Simula
e350: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
e360: 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
e370: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
e380: 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
e390: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
e3a0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e  0);.      if( un
e3b0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
e3c0: 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20  , &lock)==0 ){. 
e3d0: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
e3e0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
e3f0: 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
e400: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
e410: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
e420: 4b 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45  K;..pFile->lastE
e430: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e440: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
e450: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
e460: 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
e470: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
e480: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
e490: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
e4a0: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
e4b0: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
e4c0: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
e4d0: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
e4e0: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
e4f0: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
e500: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
e510: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
e520: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
e530: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
e540: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
e550: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
e560: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
e570: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e580: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
e590: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
e5a0: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
e5b0: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
e5c0: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
e5d0: 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f  }.  }...end_unlo
e5e0: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
e5f0: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
e600: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
e610: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e620: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
e630: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e640: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
e650: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
e660: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
e670: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
e680: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
e690: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
e6a0: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
e6b0: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
e6c0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
e6d0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
e6e0: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
e6f0: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
e700: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
e710: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
e720: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
e730: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
e740: 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b  c int unixUnlock
e750: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
e760: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
e770: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  ){.  return posi
e780: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
e790: 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  eLock, 0);.}../*
e7a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
e7b0: 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
e7c0: 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
e7d0: 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
e7e0: 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
e7f0: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
e800: 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
e810: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
e820: 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
e830: 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
e840: 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
e850: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
e860: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
e870: 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a  ucture to 0..**.
e880: 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e  ** It is *not* n
e890: 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64  ecessary to hold
e8a0: 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20   the mutex when 
e8b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e8c0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20  called,.** even 
e8d0: 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d  on VxWorks.  A m
e8e0: 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71  utex will be acq
e8f0: 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  uired on VxWorks
e900: 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72   by the.** vxwor
e910: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
e920: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
e930: 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e  atic int closeUn
e940: 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66  ixFile(sqlite3_f
e950: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
e960: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
e970: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
e980: 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
e990: 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74  =0 ){.    robust
e9a0: 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46  _close(pFile, pF
e9b0: 69 6c 65 2d 3e 64 69 72 66 64 2c 20 5f 5f 4c 49  ile->dirfd, __LI
e9c0: 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
e9d0: 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20 7d 0a  ->dirfd=-1;.  }.
e9e0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
e9f0: 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f  0 ){.    robust_
ea00: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
ea10: 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
ea20: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ;.    pFile->h =
ea30: 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f   -1;.  }.#if OS_
ea40: 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46  VXWORKS.  if( pF
ea50: 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20  ile->pId ){.    
ea60: 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c  if( pFile->isDel
ea70: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  ete ){.      unl
ea80: 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e  ink(pFile->pId->
ea90: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
eaa0: 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72  .    }.    vxwor
eab0: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
eac0: 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20  pFile->pId);.   
ead0: 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b   pFile->pId = 0;
eae0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
eaf0: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20  TRACE(("CLOSE   
eb00: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
eb10: 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  h));.  OpenCount
eb20: 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  er(-1);.  sqlite
eb30: 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55  3_free(pFile->pU
eb40: 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74  nused);.  memset
eb50: 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
eb60: 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
eb70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
eb80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
eb90: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
eba0: 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65  ic int unixClose
ebb0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ebc0: 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  d){.  int rc = S
ebd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
ebe0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
ebf0: 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
ec00: 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  unixUnlock(id, N
ec10: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45  O_LOCK);.  unixE
ec20: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
ec30: 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f  /* unixFile.pIno
ec40: 64 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  de is always val
ec50: 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69  id here. Otherwi
ec60: 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20  se, a different 
ec70: 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69  close.  ** routi
ec80: 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43  ne (e.g. nolockC
ec90: 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65  lose()) would be
eca0: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e   called instead.
ecb0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
ecc0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
ecd0: 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d  Lock>0 || pFile-
ece0: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
ecf0: 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66  sLock==0 );.  if
ed00: 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e  ( ALWAYS(pFile->
ed10: 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65  pInode) && pFile
ed20: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
ed30: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
ed40: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
ed50: 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
ed60: 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
ed70: 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
ed80: 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
ed90: 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
eda0: 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
edb0: 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
edc0: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
edd0: 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
ede0: 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  e->pUnused list.
edf0: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
ee00: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
ee10: 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  d .    ** when t
ee20: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
ee30: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  cleared..    */.
ee40: 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
ee50: 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFile);.  }.  r
ee60: 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
ee70: 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63  pFile);.  rc = c
ee80: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
ee90: 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
eea0: 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
eeb0: 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}../*********
eec0: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
eed0: 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
eee0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
eef0: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
ef00: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef50: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efa0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
efb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efc0: 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b  ***** No-op Lock
efd0: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
efe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eff0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20  ******.**.** Of 
f000: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
f010: 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
f020: 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74  ons available, t
f030: 68 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68  his is by far th
f040: 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20  e.** simplest:  
f050: 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72  locking is ignor
f060: 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20  ed.  No attempt 
f070: 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20  is made to lock 
f080: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
f090: 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
f0a0: 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   or writing..**.
f0b0: 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20  ** This locking 
f0c0: 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69  mode is appropri
f0d0: 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72  ate for use on r
f0e0: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
f0f0: 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62  es.** (ex: datab
f100: 61 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75  ases that are bu
f110: 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d  rned into CD-ROM
f120: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20  , for example.) 
f130: 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20   It can.** also 
f140: 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61  be used if the a
f150: 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f  pplication emplo
f160: 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c  ys some external
f170: 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a   mechanism to.**
f180: 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61   prevent simulta
f190: 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20  neous access of 
f1a0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
f1b0: 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e by two or more
f1c0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
f1d0: 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  nections.  But t
f1e0: 68 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75  here is a seriou
f1f0: 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61  s risk of databa
f200: 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  se.** corruption
f210: 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   if this locking
f220: 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e   mode is used in
f230: 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72   situations wher
f240: 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61  e multiple.** da
f250: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
f260: 6e 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67  ns are accessing
f270: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
f280: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
f290: 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20  ame.** time and 
f2a0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
f2b0: 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  hose connections
f2c0: 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f   are writing..*/
f2d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  ..static int nol
f2e0: 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
f2f0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
f300: 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
f310: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55  *pResOut){.  UNU
f320: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
f330: 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f  tUsed);.  *pResO
f340: 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ut = 0;.  return
f350: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
f360: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c  atic int nolockL
f370: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
f380: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
f390: 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
f3a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
f3b0: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
f3c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f3d0: 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
f3e0: 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  nt nolockUnlock(
f3f0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
f400: 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
f410: 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
f420: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
f430: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
f440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
f460: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
f470: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
f480: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
f490: 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72  e *id) {.  retur
f4a0: 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
f4b0: 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  id);.}../*******
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
f4d0: 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f   of the no-op lo
f4e0: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
f4f0: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
f500: 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5a0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
f5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5c0: 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c  ** Begin dot-fil
f5d0: 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
f5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5f0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
f600: 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  he dotfile locki
f610: 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
f620: 6e 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74  n uses the exist
f630: 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65  ance of separate
f640: 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69   lock.** files i
f650: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72  n order to contr
f660: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ol access to the
f670: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
f680: 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a   works on just.*
f690: 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69  * about every fi
f6a0: 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61  lesystem imagina
f6b0: 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20  ble.  But there 
f6c0: 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e  are serious down
f6d0: 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  sides:.**.**    
f6e0: 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65  (1)  There is ze
f6f0: 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20  ro concurrency. 
f700: 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72   A single reader
f710: 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65   blocks all othe
f720: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e  r.**         con
f730: 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65  nections from re
f740: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
f750: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
f760: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20  *.**    (2)  An 
f770: 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73  application cras
f780: 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20  h or power loss 
f790: 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20  can leave stale 
f7a0: 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20  lock files.**   
f7b0: 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72        sitting ar
f7c0: 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74  ound that need t
f7d0: 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e  o be cleared man
f7e0: 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76  ually..**.** Nev
f7f0: 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74  ertheless, a dot
f800: 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f  lock is an appro
f810: 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
f820: 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e  ode for use if n
f830: 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  o.** other locki
f840: 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61  ng strategy is a
f850: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
f860: 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
f870: 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e  works by creatin
f880: 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20  g a file in the 
f890: 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
f8a0: 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  s the.** databas
f8b0: 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73  e and with the s
f8c0: 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74  ame name but wit
f8d0: 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65  h a ".lock" exte
f8e0: 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20  nsion added..** 
f8f0: 54 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  The existance of
f900: 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70   a lock file imp
f910: 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56  lies an EXCLUSIV
f920: 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68  E lock.  All oth
f930: 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73  er lock.** types
f940: 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56   (SHARED, RESERV
f950: 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65  ED, PENDING) are
f960: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43   mapped into EXC
f970: 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  LUSIVE..*/../*.*
f980: 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69  * The file suffi
f990: 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  x added to the d
f9a0: 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d  ata base filenam
f9b0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
f9c0: 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  eate the.** lock
f9d0: 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e   file..*/.#defin
f9e0: 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  e DOTLOCK_SUFFIX
f9f0: 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20   ".lock"../*.** 
fa00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
fa10: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
fa20: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
fa30: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
fa40: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
fa50: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
fa60: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
fa70: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
fa80: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
fa90: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
faa0: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
fab0: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
fac0: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
fad0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
fae0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
faf0: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
fb00: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
fb10: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
fb20: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f  ing..**.** In do
fb30: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65  tfile locking, e
fb40: 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69  ither a lock exi
fb50: 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e  sts or it does n
fb60: 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a  ot.  So in this.
fb70: 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20  ** variation of 
fb80: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
fb90: 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73  k(), *pResOut is
fba0: 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
fbb0: 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68  any lock.** is h
fbc0: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  eld on the file 
fbd0: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65  and false if the
fbe0: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
fbf0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
fc00: 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
fc10: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
fc20: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
fc30: 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
fc40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fc50: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
fc60: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
fc70: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
fc80: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
fc90: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
fca0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
fcb0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
fcc0: 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
fcd0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
fce0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
fcf0: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
fd00: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
fd10: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
fd20: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
fd30: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
fd40: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
fd50: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  is connection or
fd60: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
fd70: 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61  ection in the sa
fd80: 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a  me process.    *
fd90: 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  * holds a lock o
fda0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20  n the file.  No 
fdb0: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75  need to check fu
fdc0: 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  rther. */.    re
fdd0: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  served = 1;.  }e
fde0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
fdf0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20  lock is held if 
fe00: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  and only if the 
fe10: 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20  lockfile exists 
fe20: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
fe30: 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
fe40: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c  const char*)pFil
fe50: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
fe60: 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  t;.    reserved 
fe70: 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b  = osAccess(zLock
fe80: 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d  File, 0)==0;.  }
fe90: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
fea0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
feb0: 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
fec0: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
fed0: 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52  eserved));.  *pR
fee0: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
fef0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ff00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
ff10: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
ff20: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
ff30: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
ff40: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
ff50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
ff60: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
ff70: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
ff80: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
ff90: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
ffa0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
ffb0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
ffc0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
ffd0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
ffe0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
fff0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
10000 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
10010 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
10020 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
10030 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
10040 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
10050 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
10060 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
10070 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
10080 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
10090 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
100a0 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
100b0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
100c0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
100d0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
100e0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
100f0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
10100 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
10110 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
10120 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
10130 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
10140 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
10150 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
10160 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
10170 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
10180 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
10190 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
101a0 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
101b0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
101c0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
101d0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
101e0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
101f0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
10200 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
10210 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
10220 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f  l..**.** With do
10230 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77  tfile locking, w
10240 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75  e really only su
10250 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a  pport state (4):
10260 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42   EXCLUSIVE..** B
10270 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20  ut we track the 
10280 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65  other locking le
10290 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  vels internally.
102a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
102b0 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  otlockLock(sqlit
102c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
102d0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
102e0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
102f0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10300 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61  .  int fd;.  cha
10310 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
10320 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
10330 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
10340 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10350 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65  OK;...  /* If we
10360 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20   have any lock, 
10370 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69  then the lock fi
10380 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
10390 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a  s.  All we have.
103a0 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64    ** to do is ad
103b0 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61  just our interna
103c0 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  l record of the 
103d0 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f  lock level..  */
103e0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
103f0 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
10400 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
10410 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
10420 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c  eLock;.    /* Al
10430 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
10440 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
10450 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66   old file */.#if
10460 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20  def HAVE_UTIME. 
10470 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69     utime(zLockFi
10480 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65  le, NULL);.#else
10490 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
104a0 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
104b0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
104c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
104d0 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
104e0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
104f0 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
10500 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f  pen(zLockFile,O_
10510 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f  RDONLY|O_CREAT|O
10520 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69  _EXCL,0600);.  i
10530 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f  f( fd<0 ){.    /
10540 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * failed to open
10550 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65  /create the file
10560 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  , someone else m
10570 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74  ay have stolen t
10580 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
10590 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
105a0 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
105b0 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
105c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
105d0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
105e0 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
105f0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
10600 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10610 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
10620 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
10630 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10640 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
10650 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10660 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
10670 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
10680 72 63 3b 0a 20 20 7d 20 0a 20 20 72 6f 62 75 73  rc;.  } .  robus
10690 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66  t_close(pFile, f
106a0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
106b0 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
106c0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
106d0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
106e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
106f0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
10700 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10710 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
10720 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
10730 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
10740 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
10750 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
10760 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
10770 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
10780 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
10790 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
107a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
107b0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
107c0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
107d0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
107e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
107f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
10800 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68   no-op..**.** Wh
10810 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  en the locking l
10820 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f  evel reaches NO_
10830 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65  LOCK, delete the
10840 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73   lock file..*/.s
10850 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
10860 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
10870 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
10880 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
10890 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
108a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
108b0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
108c0 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
108d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
108e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
108f0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
10900 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
10910 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
10920 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
10930 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
10940 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
10950 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
10960 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
10970 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
10980 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
10990 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
109a0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
109b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
109c0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
109d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
109e0 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67  }..  /* To downg
109f0 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20  rade to shared, 
10a00 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75  simply update ou
10a10 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f  r internal notio
10a20 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
10a30 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65  ck state.  No ne
10a40 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20  ed to mess with 
10a50 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
10a60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
10a70 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
10a80 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
10a90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
10aa0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  ARED_LOCK;.    r
10ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ac0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20  .  }.  .  /* To 
10ad0 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65  fully unlock the
10ae0 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74   database, delet
10af0 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  e the lock file 
10b00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  */.  assert( eFi
10b10 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
10b20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28  );.  if( unlink(
10b30 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20  zLockFile) ){.  
10b40 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10b50 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
10b60 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e  rrno;.    if( EN
10b70 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
10b80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10b90 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10bb0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10bc0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
10bd0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10be0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
10bf0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
10c00 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10c10 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
10c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10c40 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
10c50 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
10c60 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
10c70 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
10c80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10c90 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
10ca0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
10cb0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64  int rc;.  if( id
10cc0 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
10cd0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10ce0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74  ile*)id;.    dot
10cf0 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
10d00 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c  O_LOCK);.    sql
10d10 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
10d20 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
10d30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f  ;.  }.  rc = clo
10d40 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
10d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f  ** End of the do
10d80 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c  t-file lock impl
10d90 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
10da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
10e00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
10e70 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a   flock Locking *
10e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10ea0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c  **.** Use the fl
10eb0 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ock() system cal
10ec0 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63  l to do file loc
10ed0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  king..**.** floc
10ee0 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  k() locking is l
10ef0 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  ike dot-file loc
10f00 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65  king in that the
10f10 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65   various.** fine
10f20 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c  -grain locking l
10f30 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20  evels supported 
10f40 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f  by SQLite are co
10f50 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20  llapsed into.** 
10f60 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69  a single exclusi
10f70 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68  ve lock.  In oth
10f80 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44  er words, SHARED
10f90 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a  , RESERVED, and.
10fa0 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73  ** PENDING locks
10fb0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68   are the same th
10fc0 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53  ing as an EXCLUS
10fd0 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74  IVE lock.  SQLit
10fe0 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73  e.** still works
10ff0 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69   when you do thi
11000 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e  s, but concurren
11010 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69  cy is reduced si
11020 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  nce.** only a si
11030 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
11040 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
11050 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69  database at a ti
11060 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74  me..**.** Omit t
11070 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53  his section if S
11080 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
11090 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75  KING_STYLE is tu
110a0 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a  rned off or if.*
110b0 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20  * compiling for 
110c0 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20  VXWORKS..*/.#if 
110d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
110e0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
110f0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
11100 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20  * Retry flock() 
11110 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20  calls that fail 
11120 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69  with EINTR.*/.#i
11130 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69  fdef EINTR.stati
11140 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f  c int robust_flo
11150 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ck(int fd, int o
11160 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
11170 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66  do{ rc = flock(f
11180 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72  d,op); }while( r
11190 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
111a0 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
111b0 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
111c0 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63  fine robust_floc
111d0 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62  k(a,b) flock(a,b
111e0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a  ).#endif.     ..
111f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11200 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
11210 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
11220 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
11230 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
11240 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
11250 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
11260 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
11270 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11280 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11290 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
112a0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
112b0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
112c0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
112d0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
112e0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
112f0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
11300 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
11310 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
11320 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68  atic int flockCh
11330 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
11340 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11350 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
11360 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11370 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
11380 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
11390 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
113a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
113b0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
113c0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
113d0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
113e0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
113f0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11400 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   );.  .  /* Chec
11410 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
11420 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
11430 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
11440 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11450 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
11460 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
11470 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
11480 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
11490 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
114a0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
114b0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
114c0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
114d0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
114e0 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
114f0 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73   int lrc = robus
11500 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
11510 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
11520 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c  _NB);.    if( !l
11530 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67  rc ){.      /* g
11540 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c  ot the lock, unl
11550 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ock it */.      
11560 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
11570 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11580 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20  K_UN);.      if 
11590 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20  ( lrc ) {.      
115a0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
115b0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rrno;.        /*
115c0 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77   unlock failed w
115d0 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ith an error */.
115e0 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51          lrc = SQ
115f0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11600 4b 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  K; .        if( 
11610 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
11620 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
11630 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11640 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
11650 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
11660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11670 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
11680 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
11690 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
116a0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
116b0 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
116c0 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
116d0 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
116e0 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
116f0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
11700 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
11710 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
11720 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
11730 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
11740 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
11750 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
11760 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
11770 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
11780 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
11790 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
117a0 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
117b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
117c0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
117d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
117e0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
117f0 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
11800 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
11810 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
11820 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11830 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
11840 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
11850 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
11860 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
11870 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
11880 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11890 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
118a0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
118b0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
118c0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
118d0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
118e0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
118f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
11900 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
11910 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
11920 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
11930 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
11940 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11950 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11960 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11970 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11980 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11990 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
119a0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
119b0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
119c0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
119d0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
119e0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
119f0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11a00 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11a10 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11a20 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11a30 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11a40 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11a50 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11a60 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11a70 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11a80 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11a90 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11aa0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11ab0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11ac0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11ad0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11ae0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11af0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11b00 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11b10 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11b20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11b30 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11b40 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11b50 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
11b60 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
11b70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
11b80 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
11b90 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
11ba0 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
11bb0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
11bc0 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
11bd0 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
11be0 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
11bf0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
11c00 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
11c10 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
11c20 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
11c30 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
11c40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11c50 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
11c60 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
11c70 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
11c80 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
11c90 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
11ca0 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
11cb0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11cc0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11cd0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11ce0 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
11cf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11d00 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11d10 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11d20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11d30 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
11d40 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
11d50 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
11d60 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
11d70 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
11d80 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
11d90 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
11da0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
11db0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
11dc0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11dd0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11de0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11df0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
11e00 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
11e10 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
11e20 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
11e30 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
11e40 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
11e50 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
11e60 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
11e70 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
11e80 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
11e90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
11ea0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11eb0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11ec0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
11ed0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11ee0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
11ef0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11f00 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
11f10 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
11f20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
11f30 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
11f40 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
11f50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
11f60 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
11f70 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
11f80 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
11f90 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
11fa0 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
11fb0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
11fc0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
11fd0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
11fe0 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
11ff0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
12000 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
12010 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
12020 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
12030 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
12040 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
12050 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
12060 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
12070 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
12080 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
12090 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
120a0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
120b0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
120c0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
120d0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
120e0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
120f0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
12100 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
12110 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
12120 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
12130 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12140 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
12150 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
12160 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
12170 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
12180 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
12190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
121a0 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
121b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
121c0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
121d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
121e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
121f0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
12200 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
12210 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
12220 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
12230 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12240 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
12250 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
12260 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
12270 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
12280 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
12290 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
122a0 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
122b0 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
122c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
122d0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
122e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
122f0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12300 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
12310 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
12320 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
12330 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
12340 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
12350 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
12360 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12370 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
12380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12390 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
123a0 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
123b0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lock. */.  if( r
123c0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
123d0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29  e->h, LOCK_UN) )
123e0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
123f0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
12400 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74  K_ERRORS.    ret
12410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
12420 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12430 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
12440 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
12450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12460 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65  ERR_UNLOCK;.  }e
12470 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
12480 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
12490 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
124a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
124b0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
124c0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
124d0 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
124e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
124f0 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
12500 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
12510 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  d, NO_LOCK);.  }
12520 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
12530 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
12540 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12550 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
12560 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
12570 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
12590 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
125a0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
125b0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
125c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
125d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
12690 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
126c0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
126d0 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
126e0 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
126f0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
12700 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
12710 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
12720 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
12730 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
12740 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
12750 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
12760 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12770 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
12780 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
12790 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
127a0 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
127b0 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
127c0 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
127d0 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
127e0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
127f0 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
12800 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
12810 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12820 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
12830 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
12840 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
12850 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
12860 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12870 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
12880 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
12890 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
128a0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
128b0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
128c0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
128d0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
128e0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
128f0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
12900 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
12910 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
12920 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
12930 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
12940 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
12950 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12960 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12970 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
12980 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12990 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
129a0 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
129b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
129c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
129d0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
129e0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
129f0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
12a00 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
12a10 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12a20 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
12a30 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
12a40 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
12a50 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
12a60 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
12a70 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
12a80 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
12a90 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
12aa0 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
12ab0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
12ac0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
12ad0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
12ae0 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
12af0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
12b00 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
12b10 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
12b20 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20  atBuf;..    if( 
12b30 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
12b40 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
12b50 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12b60 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
12b70 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
12b80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12b90 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12ba0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12bb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
12bc0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
12bd0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
12be0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
12bf0 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  no;.      } else
12c00 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
12c10 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
12c20 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
12c30 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
12c40 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
12c50 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
12c60 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
12c70 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
12c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c90 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
12ca0 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
12cb0 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
12cc0 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
12cd0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
12ce0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12cf0 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
12d00 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12d10 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
12d20 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
12d30 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
12d40 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
12d50 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
12d60 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
12d70 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
12d80 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
12d90 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
12da0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
12db0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
12dc0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
12dd0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
12de0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
12df0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
12e00 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
12e10 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
12e20 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
12e30 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
12e40 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
12e50 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
12e60 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
12e70 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
12e80 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
12e90 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
12ea0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
12eb0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
12ec0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
12ed0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
12ee0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
12ef0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
12f00 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
12f10 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
12f20 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12f30 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
12f40 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
12f50 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
12f60 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
12f70 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12f80 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
12f90 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
12fa0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12fb0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
12fc0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
12fd0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
12fe0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
12ff0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
13000 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
13010 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
13020 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
13030 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
13040 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
13050 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
13060 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
13070 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
13080 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
13090 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
130a0 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
130b0 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
130c0 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
130d0 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
130e0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
130f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13100 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
13110 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
13120 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
13130 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
13140 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
13150 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
13160 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
13170 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13180 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13190 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
131a0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
131b0 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
131c0 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
131d0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
131e0 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
131f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
13200 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
13210 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
13220 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
13230 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
13240 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
13250 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
13260 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
13270 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
13280 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
13290 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
132a0 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
132b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
132c0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
132d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
132e0 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
132f0 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
13300 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
13310 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
13320 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
13330 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13340 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
13350 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
13360 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
13370 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
13380 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
13390 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
133a0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
133b0 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
133c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
133d0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
133e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
133f0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
13400 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
13410 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
13420 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
13430 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
13440 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
13450 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
13460 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
13470 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13480 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
13490 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
134a0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
134b0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
134c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
134d0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
134e0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
134f0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13500 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
13510 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13520 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
13530 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
13540 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
13550 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
13570 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
13580 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
13590 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
135a0 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
135b0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20  , eFileLock,..  
135c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
135d0 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
135e0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
135f0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
13600 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
13610 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
13620 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13630 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
13640 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
13650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13660 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
13670 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
13680 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
13690 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
136a0 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
136b0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
136c0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
136d0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
136e0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
136f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13700 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
13710 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
13720 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
13730 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
13740 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
13750 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
13760 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13770 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13780 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13790 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
137a0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
137b0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
137c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
137d0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
137e0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
137f0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
13800 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
13810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13820 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
13830 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
13840 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
13850 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
13860 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
13870 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
13880 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13890 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
138a0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
138b0 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
138c0 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
138d0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
138e0 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
138f0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
13900 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
13910 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
13920 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
13930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13940 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
13950 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
13960 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
13970 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
13980 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
13990 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
139a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
139b0 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
139c0 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
139d0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
139e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
139f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
13ab0 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13ae0 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
13af0 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
13b00 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
13b10 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
13b20 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
13b30 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
13b40 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
13b50 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
13b60 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
13b70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
13b80 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
13b90 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
13ba0 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
13bb0 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
13bc0 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
13bd0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
13be0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
13bf0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
13c00 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
13c10 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
13c20 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
13c30 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
13c40 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
13c50 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
13c60 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
13c70 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
13c80 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
13c90 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
13ca0 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
13cb0 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
13cc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
13cd0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
13ce0 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
13cf0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
13d00 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
13d10 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
13d20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
13d30 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
13d40 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
13d50 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
13d60 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
13d70 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
13d80 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
13d90 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
13da0 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
13db0 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
13dc0 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
13dd0 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
13de0 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
13df0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
13e00 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
13e10 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
13e20 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
13e30 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
13e40 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
13e50 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
13e60 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e80 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
13e90 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
13ea0 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
13eb0 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
13ec0 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
13ed0 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
13ee0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
13ef0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
13f00 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
13f10 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
13f20 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
13f30 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
13f40 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
13f50 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
13f60 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
13f70 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
13f80 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
13f90 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
13fa0 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
13fb0 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
13fc0 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
13fd0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13fe0 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
13ff0 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
14000 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
14010 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
14020 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
14030 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
14040 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
14050 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14060 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
14070 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
14080 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
14090 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
140a0 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
140b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
140c0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
140d0 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
140e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
140f0 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
14100 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
14110 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
14120 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
14130 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
14140 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
14150 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
14160 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
14170 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
14180 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
14190 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
141a0 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
141b0 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
141c0 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
141d0 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
141e0 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
141f0 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
14200 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
14210 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
14220 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
14230 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
14240 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
14250 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
14260 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
14270 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
14280 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
14290 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
142a0 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
142b0 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
142c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
142d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
142e0 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
142f0 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
14300 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
14310 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
14320 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
14330 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
14340 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
14350 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
14360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14370 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
14380 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14390 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
143a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
143b0 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
143c0 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
143d0 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
143e0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
143f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14400 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
14410 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
14420 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
14430 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
14440 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14450 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
14460 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14470 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
14480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14490 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
144a0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
144b0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
144c0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
144d0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
144e0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
144f0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
14500 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
14510 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
14520 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
14530 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
14540 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
14550 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
14560 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
14570 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
14580 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
14590 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
145a0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
145b0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
145c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
145d0 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
145e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
145f0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
14600 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
14610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
14620 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
14630 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14640 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14650 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
14660 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
14670 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
14680 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
14690 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
146a0 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63  File );.  afpLoc
146b0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
146c0 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
146d0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
146e0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
146f0 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78  xt;.  if( contex
14700 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
14710 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
14720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14730 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
14740 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
14750 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
14760 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
14770 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
14780 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   */.  .  /* Chec
14790 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
147a0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
147b0 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
147c0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
147d0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
147e0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
147f0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
14800 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
14810 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
14820 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
14830 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20  ss holds it..   
14840 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
14850 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63  ed ){.    /* loc
14860 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62  k the RESERVED b
14870 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  yte */.    int l
14880 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
14890 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
148a0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
148b0 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
148c0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
148d0 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  ==lrc ){.      /
148e0 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65  * if we succeede
148f0 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20  d in taking the 
14900 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75  reserved lock, u
14910 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74  nlock it to rest
14920 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ore.      ** the
14930 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
14940 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61  */.      lrc = a
14950 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
14960 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
14970 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
14980 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c   1, 0);.    } el
14990 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  se {.      /* if
149a0 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65   we failed to ge
149b0 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20  t the lock then 
149c0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73  someone else mus
149d0 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20  t have it */.   
149e0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
149f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
14a00 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
14a10 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72  ) ){.      rc=lr
14a20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  c;.    }.  }.  .
14a30 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
14a40 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
14a50 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
14a60 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  %d %d (afp)\n", 
14a70 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
14a80 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a  served));.  .  *
14a90 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
14aa0 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
14ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
14ac0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
14ad0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
14ae0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
14af0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
14b00 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14b10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
14b20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14b30 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14b40 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14b50 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14b60 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14b70 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14b80 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
14b90 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
14ba0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
14bb0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
14bc0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
14bd0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
14be0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
14bf0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
14c00 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
14c10 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
14c20 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14c30 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14c40 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14c50 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14c60 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14c70 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14c80 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
14c90 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
14ca0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
14cb0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
14cc0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
14cd0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
14ce0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14cf0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
14d00 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
14d10 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14d20 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14d30 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14d40 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14d50 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14d60 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
14d70 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14d80 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
14d90 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
14da0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
14db0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
14dc0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
14dd0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
14de0 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
14df0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14e00 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69   eFileLock){.  i
14e10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14e20 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
14e30 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14e40 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
14e50 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
14e60 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
14e70 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14e80 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
14e90 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14ea0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
14eb0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
14ec0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14ed0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
14ee0 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
14ef0 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
14f00 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
14f10 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
14f20 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
14f30 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
14f40 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
14f50 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  k),.           a
14f60 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
14f70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
14f80 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
14f90 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
14fa0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
14fb0 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
14fc0 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
14fd0 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
14fe0 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
14ff0 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
15000 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
15010 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
15020 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
15030 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
15040 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
15050 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
15060 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
15070 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
15080 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
15090 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
150a0 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
150b0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
150c0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
150d0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
150e0 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
150f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15100 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
15110 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
15120 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
15130 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
15140 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
15150 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
15160 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
15170 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
15180 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
15190 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
151a0 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
151b0 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
151c0 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
151d0 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
151e0 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
151f0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
15200 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
15210 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
15220 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
15230 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
15240 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
15250 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
15260 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
15270 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
15280 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
15290 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
152a0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
152b0 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
152c0 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
152d0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
152e0 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
152f0 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
15300 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
15310 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
15320 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
15330 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
15340 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
15350 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
15360 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
15370 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
15380 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
15390 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
153a0 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
153b0 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
153c0 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
153d0 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
153e0 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
153f0 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
15400 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
15410 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
15420 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
15430 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
15440 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
15450 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
15460 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
15470 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
15480 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
15490 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
154a0 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
154b0 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
154c0 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
154d0 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
154e0 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
154f0 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
15500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15510 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
15520 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
15530 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
15540 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
15550 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
15560 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
15570 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
15580 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
15590 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
155a0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
155b0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
155c0 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
155d0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
155e0 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
155f0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15600 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
15610 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
15620 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
15630 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
15640 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
15650 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
15660 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
15670 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
15680 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
15690 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
156a0 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
156b0 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
156c0 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
156d0 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
156e0 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
156f0 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
15700 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
15710 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
15720 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
15730 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
15740 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
15750 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
15760 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
15770 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
15780 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
15790 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
157a0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
157b0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
157c0 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
157d0 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
157e0 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
157f0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
15800 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
15810 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
15820 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
15830 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
15840 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
15850 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
15860 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
15870 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
15880 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
15890 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
158a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
158b0 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
158c0 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20  , lrc1Errno;.   
158d0 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
158e0 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
158f0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15900 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
15910 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
15920 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
15930 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
15940 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
15950 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
15960 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
15970 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
15980 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
15990 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
159a0 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
159b0 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
159c0 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
159d0 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
159e0 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
159f0 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
15a00 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
15a10 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
15a20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
15a30 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
15a40 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15a50 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15a60 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
15a70 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
15a80 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
15a90 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
15aa0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
15ab0 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
15ac0 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
15ad0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
15ae0 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
15af0 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
15b00 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
15b10 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15b20 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15b30 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
15b40 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
15b50 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
15b60 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
15b70 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15b80 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f  rrno = lrc1Errno
15b90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  ;.      rc = lrc
15ba0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  1;.      goto af
15bb0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
15bc0 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f  } else if( IS_LO
15bd0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29  CK_ERROR(lrc2) )
15be0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
15bf0 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  2;.      goto af
15c00 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
15c10 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20  } else if( lrc1 
15c20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  != SQLITE_OK ) {
15c30 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15c40 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
15c50 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
15c60 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
15c70 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
15c80 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
15c90 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
15ca0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
15cb0 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
15cc0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15cd0 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
15ce0 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
15cf0 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
15d00 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
15d10 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
15d20 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
15d30 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  .     ** same pr
15d40 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
15d50 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
15d60 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
15d70 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
15d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
15d90 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
15da0 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
15db0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
15dc0 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
15dd0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
15de0 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
15df0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
15e00 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
15e10 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
15e20 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
15e30 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
15e40 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
15e50 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28  Lock );.    if (
15e60 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53  eFileLock >= RES
15e70 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
15e80 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
15e90 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
15ea0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
15eb0 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
15ec0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
15ed0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
15ee0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
15ef0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
15f00 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
15f10 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c  .      if( !fail
15f20 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ed ){.        co
15f30 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
15f40 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
15f50 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
15f60 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20  ed && eFileLock 
15f70 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  == EXCLUSIVE_LOC
15f80 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63  K) {.      /* Ac
15f90 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
15fa0 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  VE lock */.     
15fb0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d     .      /* Rem
15fc0 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c  ove the shared l
15fd0 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e  ock before tryin
15fe0 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65  g the range.  we
15ff0 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20  'll need to .   
16000 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73     ** reestablis
16010 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
16020 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65  k if we can't ge
16030 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b  t the  afpUnlock
16040 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16050 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61  if( !(failed = a
16060 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16070 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16080 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
16090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
160a0 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65            pInode
160b0 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
160c0 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   0)) ){.        
160d0 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51  int failed2 = SQ
160e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
160f0 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
16100 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
16110 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
16120 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
16130 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
16140 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16150 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
16160 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
16190 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  E, 1);.        i
161a0 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61  f( failed && (fa
161b0 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f  iled2 = afpSetLo
161c0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
161d0 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20     SHARED_FIRST 
16200 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  + pInode->shared
16210 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
16220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
16230 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
16240 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
16250 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
16260 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
16270 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
16280 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
16290 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
162a0 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
162b0 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
162c0 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
162d0 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
162e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
162f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
16300 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
16310 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16320 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
16330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16340 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
16350 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16360 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
16370 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
16380 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
16390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
163a0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
163b0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
163c0 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
163d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
163e0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
163f0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
16400 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
16410 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
16420 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
16430 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
16440 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
16450 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
16460 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
16470 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
16480 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
16490 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
164a0 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %s (afp)\n", pF
164b0 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
164c0 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
164d0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
164e0 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
164f0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
16500 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16510 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
16520 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
16530 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
16540 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
16550 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
16560 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
16570 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
16580 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
16590 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
165a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
165b0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
165c0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
165d0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
165e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
165f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
16600 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
16610 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
16620 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
16630 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
16640 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
16650 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
16660 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
16670 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
16680 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
16690 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
166a0 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
166b0 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
166c0 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
166d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
166e0 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65  .  int skipShare
166f0 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
16700 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
16710 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65  h = pFile->h;.#e
16720 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
16730 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
16740 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
16750 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
16760 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
16770 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
16780 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
16790 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
167a0 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
167b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
167c0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
167d0 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ared,.          
167e0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
167f0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
16800 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
16810 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
16820 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
16830 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
16840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16850 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
16860 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
16870 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
16880 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16890 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
168a0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
168b0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
168c0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
168d0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
168e0 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
168f0 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
16900 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
16910 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
16920 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
16930 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
16940 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
16950 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e  ;.    .#ifndef N
16960 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
16970 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
16980 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
16990 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
169a0 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
169b0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
169c0 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
169d0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
169e0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
169f0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
16a00 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
16a10 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
16a20 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
16a30 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
16a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
16a50 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
16a60 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
16a70 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
16a80 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
16a90 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
16aa0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
16ab0 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
16ac0 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
16ad0 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
16ae0 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
16af0 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
16b00 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
16b10 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
16b20 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
16b30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
16b40 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
16b50 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
16b60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
16b70 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
16b80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
16b90 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
16ba0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
16bb0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
16bc0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
16bd0 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
16be0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  >eFileLock==EXCL
16bf0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
16c00 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
16c10 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16c20 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
16c30 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
16c40 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
16c50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16c60 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
16c70 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
16c80 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16c90 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >1) ){.        /
16ca0 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c  * only re-establ
16cb0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
16cc0 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ock if necessary
16cd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
16ce0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
16cf0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
16d00 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16d10 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
16d20 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16d30 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16d40 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
16d50 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 1, 1);.      }
16d60 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
16d70 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a  skipShared = 1;.
16d80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16da0 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
16db0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
16dc0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
16dd0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16de0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16df0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
16e00 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
16e10 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  } .    if( rc==S
16e20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
16e30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45  e->eFileLock>=RE
16e40 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63  SERVED_LOCK && c
16e50 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
16e60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
16e70 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16e80 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16e90 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
16ea0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
16eb0 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20  ( !rc ){ .      
16ec0 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
16ed0 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  ved = 0; .      
16ee0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
16ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16f00 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
16f10 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
16f20 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b  de->nShared>1)){
16f30 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
16f40 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
16f50 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
16f60 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
16f70 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f  TE_OK && eFileLo
16f80 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a  ck==NO_LOCK ){..
16f90 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
16fa0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16fb0 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
16fc0 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
16fd0 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
16fe0 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
16ff0 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
17000 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
17010 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
17020 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
17030 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65    */.    unsigne
17040 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
17050 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
17060 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
17070 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
17080 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
17090 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
170a0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
170b0 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ){.      Simulat
170c0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
170d0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
170e0 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
170f0 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
17100 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
17110 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b  );.      if( !sk
17120 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ipShared ){.    
17130 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
17140 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17150 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
17160 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
17170 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17180 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
17190 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
171a0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
171b0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
171c0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
171d0 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
171e0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
171f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17200 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
17210 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
17220 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
17230 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
17240 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
17250 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
17260 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
17270 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17280 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
17290 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
172a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
172b0 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
172c0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
172d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
172e0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
172f0 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
17300 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
17310 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
17320 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
17330 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
17340 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
17350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
17360 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
17370 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
17380 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
17390 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e   afpUnlock(id, N
173a0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69  O_LOCK);.    uni
173b0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
173c0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49     if( pFile->pI
173d0 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70  node && pFile->p
173e0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
173f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
17400 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
17410 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
17420 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
17430 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
17440 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
17450 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
17460 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
17470 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
17480 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
17490 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
174a0 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  node->aPending. 
174b0 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
174c0 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
174d0 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
174e0 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
174f0 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
17500 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
17510 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
17520 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e   }.    releaseIn
17530 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
17540 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17550 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
17560 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20  ontext);.    rc 
17570 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
17580 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  id);.    unixLea
17590 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20  veMutex();.  }. 
175a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
175b0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
175c0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
175d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
175e0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
175f0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
17600 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f  ve is the AFP lo
17610 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17620 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
17630 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
17640 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
17650 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
17660 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
17670 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
17680 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
17690 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20  .  If you don't 
176a0 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61  compile for a ma
176b0 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69  c, then the "uni
176c0 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73  x-afp".** VFS is
176d0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a   not available..
176e0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
176f0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
17700 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
17710 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
17720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17730 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
17740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17780 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
17790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177d0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
177e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
177f0 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e  Begin NFS Lockin
17800 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
17810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17820 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  **/..#if defined
17830 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
17840 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17850 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a  KING_STYLE./*. *
17860 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17870 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
17880 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
17890 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
178a0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20    eFileLock. ** 
178b0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
178c0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
178d0 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49  _LOCK.. **. ** I
178e0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
178f0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
17900 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
17910 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
17920 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73  w. ** the reques
17930 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17940 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17950 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a  is a no-op.. */.
17960 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e  static int nfsUn
17970 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
17980 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
17990 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20  Lock){.  return 
179a0 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
179b0 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d  eFileLock, 1);.}
179c0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
179d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
179e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
179f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
17a00 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
17a10 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53  above is the NFS
17a20 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
17a30 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
17a40 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
17a50 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
17a60 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
17a70 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
17a80 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
17a90 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
17aa0 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  ble.  .**.******
17ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
17ac0 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c  End of the NFS l
17ad0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
17ae0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
17af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
17b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b40 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
17b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d  *********** Non-
17bb0 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
17bc0 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  file methods ***
17bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
17bf0 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69   The next divisi
17c00 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c  on contains impl
17c10 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
17c20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  all methods of t
17c30 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  he .** sqlite3_f
17c40 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72  ile object other
17c50 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   than the lockin
17c60 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  g methods.  The 
17c70 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f  locking.** metho
17c80 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  ds were defined 
17c90 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f  in divisions abo
17ca0 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20  ve (one locking 
17cb0 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69  method per.** di
17cc0 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20  vision).  Those 
17cd0 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65  methods that are
17ce0 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
17cf0 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20  ocking modes.** 
17d00 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74  are gather toget
17d10 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69  her into this di
17d20 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  vision..*/../*.*
17d30 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
17d40 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74  fset passed as t
17d50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17d60 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e  nt, then read cn
17d70 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f  t .** bytes into
17d80 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68   pBuf. Return th
17d90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
17da0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
17db0 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79  .**.** NB:  If y
17dc0 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ou define USE_PR
17dd0 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44  EAD or USE_PREAD
17de0 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  64, then it migh
17df0 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63  t also.** be nec
17e00 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65  essary to define
17e10 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74   _XOPEN_SOURCE t
17e20 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20  o be 500.  This 
17e30 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f  varies from.** o
17e40 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f  ne system to ano
17e50 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c  ther.  Since SQL
17e60 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66  ite does not def
17e70 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a  ine USE_PREAD.**
17e80 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79   any any form by
17e90 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c   default, we wil
17ea0 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
17eb0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
17ec0 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69  OURCE..** See ti
17ed0 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20  ckets #2741 and 
17ee0 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  #2681..**.** To 
17ef0 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
17f00 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
17f10 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20  n a failed read 
17f20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
17f30 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
17f40 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
17f50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
17f60 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69  ekAndRead(unixFi
17f70 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
17f80 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f  int64 offset, vo
17f90 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
17fa0 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23  t){.  int got;.#
17fb0 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
17fc0 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
17fd0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
17fe0 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
17ff0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
18000 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
18010 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
18020 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72    do{ got = osPr
18030 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
18040 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d   cnt, offset); }
18050 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
18060 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
18070 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18080 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
18090 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
180a0 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
180b0 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28  got = osPread64(
180c0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
180d0 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c  , offset); }whil
180e0 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
180f0 6f 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d  o==EINTR);.  Sim
18100 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
18110 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
18120 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
18130 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
18140 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
18150 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18160 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
18170 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
18180 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69  =offset ){.    i
18190 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
181a0 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e  -1 ){.      ((un
181b0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
181c0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
181d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
181e0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
181f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
18200 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ....    }.    re
18210 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64  turn -1;.  }.  d
18220 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28  o{ got = osRead(
18230 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18240 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
18250 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
18260 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d   );.#endif.  TIM
18270 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
18280 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
18290 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
182a0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
182b0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52   }.  OSTRACE(("R
182c0 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
182d0 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69  %7lld %llu\n", i
182e0 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65  d->h, got, offse
182f0 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  t, TIMER_ELAPSED
18300 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  ));.  return got
18310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
18320 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
18330 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
18340 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18350 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
18360 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
18370 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
18380 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
18390 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
183a0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
183b0 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
183c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
183d0 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
183e0 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
183f0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
18400 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
18410 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
18420 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
18430 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
18440 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  d );..  /* If th
18450 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
18460 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
18470 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
18480 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
18490 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
184a0 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
184b0 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
184c0 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
184d0 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
184e0 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
184f0 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
18500 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
18510 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
18520 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
18530 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
18540 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
18550 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ..  got = seekAn
18560 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66  dRead(pFile, off
18570 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
18580 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
18590 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
185a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
185b0 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
185c0 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
185d0 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
185e0 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  d */.    return 
185f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
18600 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
18610 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
18620 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
18630 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
18640 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
18650 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
18660 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
18670 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
18680 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
18690 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
186a0 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
186b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
186c0 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
186d0 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
186e0 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
186f0 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
18700 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
18710 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
18720 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18730 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
18740 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
18750 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ffset..**.** To 
18760 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
18770 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
18780 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65  n a failed write
18790 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
187a0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
187b0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
187c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
187d0 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
187e0 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
187f0 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
18800 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
18810 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66  {.  int got;.#if
18820 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
18830 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
18840 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
18850 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
18860 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
18870 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
18880 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
18890 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69  do{ got = osPwri
188a0 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
188b0 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77  cnt, offset); }w
188c0 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
188d0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
188e0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
188f0 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
18900 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34  got = osPwrite64
18910 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18920 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c  t, offset);}whil
18930 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
18940 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
18950 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
18960 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
18970 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
18980 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18990 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
189a0 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
189b0 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
189c0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
189d0 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
189e0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
189f0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18a00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18a10 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18a20 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
18a30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
18a40 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
18a50 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 57 72 69 74  do{ got = osWrit
18a60 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
18a70 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  nt); }while( got
18a80 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
18a90 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  TR );.#endif.  T
18aa0 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20  IMER_END;.  if( 
18ab0 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75  got<0 ){.    ((u
18ac0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18ad0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18ae0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
18af0 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
18b00 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
18b10 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66  , id->h, got, of
18b20 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
18b30 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
18b40 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  got;.}.../*.** W
18b50 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
18b60 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
18b70 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
18b80 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18b90 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
18ba0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
18bb0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
18bc0 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74  tic int unixWrit
18bd0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
18be0 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20  e *id, .  const 
18bf0 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
18c00 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
18c10 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a  3_int64 offset .
18c20 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
18c30 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18c40 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74  *)id;.  int wrot
18c50 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
18c60 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28   id );.  assert(
18c70 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20   amt>0 );..  /* 
18c80 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
18c90 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
18ca0 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
18cb0 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
18cc0 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
18cd0 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
18ce0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
18cf0 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
18d00 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
18d10 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
18d20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
18d30 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
18d40 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
18d50 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
18d60 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
18d70 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
18d80 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
18d90 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
18da0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
18db0 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
18dc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
18dd0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
18de0 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
18df0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
18e00 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
18e10 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
18e20 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
18e30 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
18e40 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
18e50 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
18e60 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
18e70 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
18e80 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
18e90 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
18ea0 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
18eb0 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
18ec0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
18ed0 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
18ee0 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
18ef0 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
18f00 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
18f10 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
18f20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
18f30 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
18f40 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
18f50 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
18f60 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
18f70 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18f80 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
18f90 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
18fa0 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
18fb0 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
18fc0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18fd0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
18fe0 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
18ff0 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
19000 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
19010 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
19020 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
19030 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
19040 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
19050 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
19060 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
19070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
19080 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20  endif..  while( 
19090 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
190a0 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
190b0 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42  File, offset, pB
190c0 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20  uf, amt))>0 ){. 
190d0 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
190e0 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
190f0 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
19100 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
19110 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
19120 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
19130 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
19140 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
19150 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
19160 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
19170 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20  );..  if( amt>0 
19180 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65  ){.    if( wrote
19190 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73  <0 && pFile->las
191a0 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29  tErrno!=ENOSPC )
191b0 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45  {.      /* lastE
191c0 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
191d0 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  AndWrite */.    
191e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
191f0 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
19200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
19210 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
19220 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
19230 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
19240 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19250 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
19260 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
19270 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
19280 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
19290 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
192a0 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
192b0 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
192c0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
192d0 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
192e0 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
192f0 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
19300 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
19310 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
19320 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
19330 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
19340 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
19350 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
19360 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
19370 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
19380 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
19390 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
193a0 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
193b0 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
193c0 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
193d0 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f  ck with the (slo
193e0 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a  wer) fsync()..**
193f0 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
19400 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
19410 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
19420 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
19430 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
19440 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
19450 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
19460 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ync.*/.#if !defi
19470 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
19480 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  & !defined(__lin
19490 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66  ux__).# define f
194a0 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
194b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
194c0 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
194d0 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
194e0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
194f0 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
19500 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
19510 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
19520 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
19530 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
19540 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
19550 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
19560 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
19570 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
19580 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
19590 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
195a0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
195b0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
195c0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
195d0 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54  LITE_USE_REQUEST
195e0 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70 6f  _FULLFSYNC.#impo
195f0 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23 69  rt <notify.h>.#i
19600 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f 4f  mport <libkern/O
19610 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74 69  SAtomic.h>.stati
19620 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f 74  c OSSpinLock not
19630 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23 64  ify_lock = 0;.#d
19640 65 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46 55  efine REQUEST_FU
19650 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54  LLSYNC_NOTIFICAT
19660 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70 6c  ION    "com.appl
19670 65 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64 69  e.reqsync".#endi
19680 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  f../*.** The fsy
19690 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
196a0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
196b0 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
196c0 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
196d0 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
196e0 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
196f0 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
19700 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
19710 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
19720 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
19730 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
19740 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
19750 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
19760 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
19770 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
19780 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
19790 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
197a0 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
197b0 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
197c0 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
197d0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
197e0 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
197f0 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
19800 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
19810 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
19820 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
19830 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
19840 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
19850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19860 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
19870 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
19880 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
19890 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
198a0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
198b0 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
198c0 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
198d0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
198e0 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
198f0 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
19900 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
19910 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
19920 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
19930 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
19940 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
19950 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
19960 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
19970 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
19980 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
19990 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
199a0 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
199b0 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
199c0 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
199d0 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
199e0 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
199f0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
19a00 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
19a10 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
19a20 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
19a30 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
19a40 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
19a50 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
19a60 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
19a70 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
19a80 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
19a90 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
19aa0 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
19ab0 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
19ac0 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
19ad0 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
19ae0 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
19af0 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
19b00 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
19b10 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
19b20 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
19b30 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
19b40 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
19b50 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
19b60 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
19b70 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
19b80 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
19b90 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
19ba0 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
19bb0 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
19bc0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
19bd0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
19be0 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
19bf0 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
19c00 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
19c10 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
19c20 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
19c30 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
19c40 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
19c50 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
19c60 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
19c70 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
19c80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
19c90 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
19ca0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
19cb0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
19cc0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
19cd0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
19ce0 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
19cf0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
19d00 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
19d10 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
19d20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
19d30 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
19d40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
19d50 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
19d60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19d70 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
19d80 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
19d90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
19da0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
19db0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
19dc0 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
19dd0 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
19de0 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
19df0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
19e00 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
19e10 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
19e20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
19e30 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
19e40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
19e50 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
19e60 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
19e70 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
19e80 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
19e90 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
19ea0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
19eb0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
19ec0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
19ed0 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
19ee0 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
19ef0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
19f00 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
19f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
19f20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
19f30 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
19f40 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
19f50 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c  USE_REQUEST_FULL
19f60 46 53 59 4e 43 0a 20 20 20 20 72 63 20 3d 20 6f  FSYNC.    rc = o
19f70 73 46 73 79 6e 63 28 66 64 29 3b 0a 20 20 20 20  sFsync(fd);.    
19f80 69 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20 20  if (!rc) {.     
19f90 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c 6f 63 6b 28   OSSpinLockLock(
19fa0 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20  &notify_lock);. 
19fb0 20 20 20 20 20 72 63 20 3d 20 6e 6f 74 69 66 79       rc = notify
19fc0 5f 70 6f 73 74 28 52 45 51 55 45 53 54 5f 46 55  _post(REQUEST_FU
19fd0 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54  LLSYNC_NOTIFICAT
19fe0 49 4f 4e 29 3b 0a 20 20 20 20 20 20 4f 53 53 70  ION);.      OSSp
19ff0 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b 28 26 6e 6f  inLockUnlock(&no
1a000 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20  tify_lock);.    
1a010 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  }.#else.    rc =
1a020 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46   osFcntl(fd, F_F
1a030 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 23 65  ULLFSYNC, 0);.#e
1a040 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
1a050 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
1a060 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53  /* If the FULLFS
1a070 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c  YNC failed, fall
1a080 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74   back to attempt
1a090 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a  ing an fsync()..
1a0a0 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27    ** It shouldn'
1a0b0 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f  t be possible fo
1a0c0 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66  r fullfsync to f
1a0d0 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ail on the local
1a0e0 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74   .  ** file syst
1a0f0 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20  em (on OSX), so 
1a100 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65  failure indicate
1a110 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43  s that FULLFSYNC
1a120 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70  .  ** isn't supp
1a130 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66  orted for this f
1a140 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20  ile system. So, 
1a150 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63  attempt an fsync
1a160 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20   .  ** and (for 
1a170 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20  now) ignore the 
1a180 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75  overhead of a su
1a190 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20  perfluous fcntl 
1a1a0 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27  call.  .  ** It'
1a1b0 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64  d be better to d
1a1c0 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20  etect fullfsync 
1a1d0 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64  support once and
1a1e0 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65   avoid .  ** the
1a1f0 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72   fcntl call ever
1a200 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63  y time sync is c
1a210 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  alled..  */.  if
1a220 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e  ( rc ) rc = fsyn
1a230 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65  c(fd);..#elif de
1a240 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1a250 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28  .  /* fdatasync(
1a260 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27  ) on HFS+ doesn'
1a270 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20  t yet flush the 
1a280 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20  file size if it 
1a290 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c  changed correctl
1a2a0 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e  y.  ** so curren
1a2b0 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74  tly we default t
1a2c0 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74  o the macro that
1a2d0 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61   redefines fdata
1a2e0 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20  sync to fsync.  
1a2f0 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28  */.  rc = fsync(
1a300 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63  fd);.#else .  rc
1a310 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
1a320 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
1a330 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26  .  if( rc==-1 &&
1a340 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20   errno==ENOTSUP 
1a350 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e  ){.    rc = fsyn
1a360 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  c(fd);.  }.#endi
1a370 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
1a380 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64  */.#endif /* ifd
1a390 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1a3a0 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  C elif HAVE_FULL
1a3b0 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20  FSYNC */..  if( 
1a3c0 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63  OS_VXWORKS && rc
1a3d0 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  != -1 ){.    rc 
1a3e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1a3f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1a400 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1a410 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1a420 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1a430 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1a440 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1a450 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1a460 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1a470 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1a480 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1a490 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1a4a0 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1a4b0 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1a4c0 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1a4d0 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1a4e0 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1a4f0 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1a500 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1a510 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1a520 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1a530 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1a540 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1a550 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1a560 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1a570 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1a580 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1a590 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1a5a0 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1a5b0 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1a5c0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1a5d0 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1a5e0 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1a5f0 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1a600 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1a610 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1a620 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1a630 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1a640 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1a650 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1a660 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1a670 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1a680 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1a690 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1a6a0 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1a6b0 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1a6c0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1a6d0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1a6e0 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1a6f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1a700 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1a710 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1a720 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1a730 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1a740 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1a750 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1a760 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1a770 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1a780 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1a790 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1a7a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1a7b0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1a7c0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1a7d0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1a7e0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1a7f0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1a800 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1a810 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1a820 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1a830 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1a840 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1a850 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1a860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1a870 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1a880 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1a890 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1a8a0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1a8b0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1a8c0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1a8d0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1a8e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1a8f0 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1a900 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1a910 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1a920 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1a930 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1a940 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1a950 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1a960 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1a970 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1a980 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1a990 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1a9a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1a9b0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1a9c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1a9d0 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1a9e0 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1a9f0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ath);.  }.  if( 
1aa00 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
1aa10 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
1aa20 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68  "DIRSYNC %-3d (h
1aa30 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64  ave_fullfsync=%d
1aa40 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22   fullsync=%d)\n"
1aa50 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a  , pFile->dirfd,.
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45              HAVE
1aa70 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75  _FULLFSYNC, isFu
1aa80 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e 64 65  llsync));.#ifnde
1aa90 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
1aaa0 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20  _DIRSYNC.    /* 
1aab0 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  The directory sy
1aac0 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  nc is only attem
1aad0 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79  pted if full_fsy
1aae0 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72  nc is.    ** tur
1aaf0 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61  ned off or unava
1ab00 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75  ilable.  If a fu
1ab10 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65  ll_fsync occurre
1ab20 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20  d above,.    ** 
1ab30 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f  then the directo
1ab40 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72  ry sync is super
1ab50 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  fluous..    */. 
1ab60 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55     if( (!HAVE_FU
1ab70 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75  LLFSYNC || !isFu
1ab80 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f  llsync) && full_
1ab90 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72  fsync(pFile->dir
1aba0 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
1abb0 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57    /*.       ** W
1abc0 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  e have received 
1abd0 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73  multiple reports
1abe0 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75   of fsync() retu
1abf0 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20  rning.       ** 
1ac00 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c  errors when appl
1ac10 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69  ied to directori
1ac20 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69  es on certain fi
1ac30 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  le systems..    
1ac40 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64     ** A failed d
1ac50 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
1ac60 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e   not a big deal.
1ac70 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20    So it seems.  
1ac80 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74       ** better t
1ac90 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72  o ignore the err
1aca0 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35  or.  Ticket #165
1acb0 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  7.       */.    
1acc0 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61 73     /* pFile->las
1acd0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20  tErrno = errno; 
1ace0 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74  */.       /* ret
1acf0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ad00 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ; */.    }.#endi
1ad10 66 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65  f.    /* Only ne
1ad20 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
1ad30 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 20 64   so close the  d
1ad40 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77 65  irectory when we
1ad50 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20 20   are done */.   
1ad60 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1ad70 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  ile, pFile->dirf
1ad80 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
1ad90 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d    pFile->dirfd =
1ada0 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
1adb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1adc0 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
1add0 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
1ade0 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
1adf0 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
1ae00 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
1ae10 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
1ae20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1ae30 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
1ae40 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)id;.  int rc;.
1ae50 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1ae60 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1ae70 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1ae80 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1ae90 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  TE );..  /* If t
1aea0 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
1aeb0 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
1aec0 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
1aed0 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
1aee0 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
1aef0 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
1af00 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
1af10 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
1af20 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
1af30 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
1af40 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
1af50 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
1af60 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
1af70 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
1af80 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1af90 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e  szChunk ){.    n
1afa0 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
1afb0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1afc0 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
1afd0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1afe0 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63  Chunk;.  }..  rc
1aff0 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63   = robust_ftrunc
1b000 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f  ate(pFile->h, (o
1b010 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69  ff_t)nByte);.  i
1b020 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1b030 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1b040 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1b050 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1b060 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1b070 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1b080 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1b090 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64  ;.  }else{.#ifnd
1b0a0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
1b0b0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1b0c0 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1b0d0 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1b0e0 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1b0f0 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61  o.    ** doing a
1b100 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1b110 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1b120 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1b130 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a  her than a.    *
1b140 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1b150 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74  e file) and we t
1b160 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1b170 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c   to zero length,
1b180 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66  .    ** that eff
1b190 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73  ectively updates
1b1a0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1b1b0 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ter.  This might
1b1c0 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77   happen.    ** w
1b1d0 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20  hen restoring a 
1b1e0 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
1b1f0 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72  he backup API fr
1b200 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  om a zero-length
1b210 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a  .    ** source..
1b220 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b230 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
1b240 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20  ite && nByte==0 
1b250 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1b260 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
1b270 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
1b280 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b290 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
1b2a0 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
1b2b0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1b2c0 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
1b2d0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1b2e0 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
1b2f0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1b300 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
1b310 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
1b320 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
1b330 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
1b340 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69  osFstat(((unixFi
1b350 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
1b360 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1b370 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1b380 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1b390 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1b3a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1b3b0 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1b3c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1b3d0 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1b3e0 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1b3f0 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1b400 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1b410 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1b420 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f  dInodeInfo() pro
1b430 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74  cedure.  ** writ
1b440 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  es a single byte
1b450 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20   into that file 
1b460 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
1b470 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20   around a bug.  
1b480 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d  ** in the OS-X m
1b490 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e  sdos filesystem.
1b4a0 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76    In order to av
1b4b0 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  oid problems wit
1b4c0 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79  h upper.  ** lay
1b4d0 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ers, we need to 
1b4e0 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65  report this file
1b4f0 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76   size as zero ev
1b500 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a  en though it is.
1b510 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20    ** really 1.  
1b520 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20   Ticket #3260.. 
1b530 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65   */.  if( *pSize
1b540 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30  ==1 ) *pSize = 0
1b550 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ;...  return SQL
1b560 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
1b570 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1b580 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1b590 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1b5a0 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66  ./*.** Handler f
1b5b0 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  or proxy-locking
1b5c0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65   file-control ve
1b5d0 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65  rbs.  Defined be
1b5e0 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72  low in the.** pr
1b5f0 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64  oxying locking d
1b600 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ivision..*/.stat
1b610 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
1b620 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1b630 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29  file*,int,void*)
1b640 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a  ;.#endif../* .**
1b650 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b660 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64  s called to hand
1b670 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  le the SQLITE_FC
1b680 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a  NTL_SIZE_HINT .*
1b690 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f  * file-control o
1b6a0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
1b6b0 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
1b6c0 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
1b6d0 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
1b6e0 20 66 69 6c 65 2c 20 69 74 20 63 6f 75 6c 64 20   file, it could 
1b6f0 62 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 66  be.** that the f
1b700 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
1b710 65 78 74 65 6e 64 65 64 20 61 74 20 74 68 69 73  extended at this
1b720 20 70 6f 69 6e 74 2e 20 4f 74 68 65 72 77 69 73   point. Otherwis
1b730 65 2c 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45  e, the.** SQLITE
1b740 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1b750 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
1b760 6e 6f 2d 6f 70 20 66 6f 72 20 55 6e 69 78 2e 0a  no-op for Unix..
1b770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63  */.static int fc
1b780 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78  ntlSizeHint(unix
1b790 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34  File *pFile, i64
1b7a0 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70   nByte){.  if( p
1b7b0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b  File->szChunk ){
1b7c0 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1b7f0 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1b800 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b820 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65   Used to hold re
1b830 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66  turn values of f
1b840 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20  stat() */.   .  
1b850 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
1b860 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20  ile->h, &buf) ) 
1b870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b880 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20  ERR_FSTAT;..    
1b890 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1b8a0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1b8b0 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1b8c0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1b8d0 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1b8e0 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1b8f0 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1b900 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1b910 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1b920 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1b930 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1b940 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1b950 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1b960 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1b970 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1b980 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1b990 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1b9a0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1b9b0 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1b9c0 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1b9d0 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1b9e0 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1b9f0 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1ba00 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1ba10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1ba20 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1ba30 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1ba40 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1ba50 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1ba60 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1ba70 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1ba80 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1ba90 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
1baa0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1bab0 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
1bac0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
1bad0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
1bae0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1baf0 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74  , fake it. First
1bb00 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74   use.      ** ft
1bb10 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74  runcate() to set
1bb20 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1bb30 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e  then write a sin
1bb40 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20  gle byte to.    
1bb50 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79    ** the last by
1bb60 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1bb70 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1bb80 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69  nded region. Thi
1bb90 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  s.      ** is th
1bba0 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65  e same technique
1bbb0 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74   used by glibc t
1bbc0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69  o implement posi
1bbd0 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20  x_fallocate().  
1bbe0 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d      ** on system
1bbf0 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  s that do not ha
1bc00 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1bc10 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ate() system cal
1bc20 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
1bc30 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66    int nBlk = buf
1bc40 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a  .st_blksize;  /*
1bc50 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f   File-system blo
1bc60 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ck size */.     
1bc70 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20   i64 iWrite;    
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc90 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77  Next offset to w
1bca0 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20  rite to */..    
1bcb0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1bcc0 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1bcd0 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   nSize) ){.     
1bce0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1bcf0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1bd00 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
1bd10 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1bd20 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1bd30 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1bd40 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1bd50 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65    }.      iWrite
1bd60 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65   = ((buf.st_size
1bd70 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e   + 2*nBlk - 1)/n
1bd80 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20  Blk)*nBlk-1;.   
1bd90 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65     while( iWrite
1bda0 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  <nSize ){.      
1bdb0 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73    int nWrite = s
1bdc0 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1bdd0 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1bde0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1bdf0 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1be00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1be10 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57  RITE;.        iW
1be20 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20  rite += nBlk;.  
1be30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1be40 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1be50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1be60 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  if (SQLITE_ENABL
1be70 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
1be80 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1be90 45 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  E__).#include "s
1bea0 71 6c 69 74 65 33 5f 70 72 69 76 61 74 65 2e 68  qlite3_private.h
1beb0 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79  ".#include <copy
1bec0 66 69 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20 69  file.h>.static i
1bed0 6e 74 20 67 65 74 44 62 50 61 74 68 46 6f 72 55  nt getDbPathForU
1bee0 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
1bef0 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64   *pFile, char *d
1bf00 62 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a  bPath);.#endif..
1bf10 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
1bf20 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
1bf30 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
1bf40 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1bf50 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
1bf60 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1bf70 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1bf80 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
1bf90 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1bfa0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1bfb0 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
1bfc0 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1bfd0 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  = ((unixFile*)id
1bfe0 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  )->eFileLock;.  
1bff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c000 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1c010 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
1c020 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
1c030 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
1c040 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1c050 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
1c060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c080 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1c090 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1c0a0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1c0b0 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  )->szChunk = *(i
1c0c0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
1c0d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c0e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1c0f0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1c100 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
1c110 20 20 72 65 74 75 72 6e 20 66 63 6e 74 6c 53 69    return fcntlSi
1c120 7a 65 48 69 6e 74 28 28 75 6e 69 78 46 69 6c 65  zeHint((unixFile
1c130 20 2a 29 69 64 2c 20 2a 28 69 36 34 20 2a 29 70   *)id, *(i64 *)p
1c140 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  Arg);.    }.#ifn
1c150 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
1c160 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
1c170 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
1c180 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
1c190 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
1c1a0 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
1c1b0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1c1c0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
1c1d0 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
1c1e0 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
1c1f0 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
1c200 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
1c210 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
1c220 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
1c230 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c240 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1c250 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
1c260 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1c270 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
1c280 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c290 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c2a0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1c2b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c2c0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1c2d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
1c2e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54   case SQLITE_SET
1c2f0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a  _LOCKPROXYFILE:.
1c300 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c310 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
1c320 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
1c330 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  n proxyFileContr
1c340 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a  ol(id,op,pArg);.
1c350 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1c360 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c370 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1c380 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c390 29 20 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54 45  ) */.#if (SQLITE
1c3a0 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
1c3b0 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
1c3c0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63  __APPLE__).    c
1c3d0 61 73 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43  ase SQLITE_TRUNC
1c3e0 41 54 45 5f 44 41 54 41 42 41 53 45 3a 20 7b 0a  ATE_DATABASE: {.
1c3f0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
1c400 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1c410 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  e*)id;.      int
1c420 20 74 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   trc = SQLITE_OK
1c430 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 46 69 6c  ;.      int eFil
1c440 65 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 65  eLock = pFile->e
1c450 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  FileLock;.      
1c460 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c470 4f 4b 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6a  OK;.      char j
1c480 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b  Path[MAXPATHLEN+
1c490 39 5d 3b 0a 20 20 20 20 20 20 73 69 7a 65 5f 74  9];.      size_t
1c4a0 20 6a 4c 65 6e 3b 0a 20 20 20 20 20 20 0a 20 20   jLen;.      .  
1c4b0 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
1c4c0 6b 3c 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48  k<SQLITE_LOCK_SH
1c4d0 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ARED ){.        
1c4e0 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  rc = pFile->pMet
1c4f0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53  hod->xLock(id, S
1c500 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45  QLITE_LOCK_SHARE
1c510 44 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  D);.      }.    
1c520 20 20 69 66 28 20 21 72 63 20 26 26 20 65 46 69    if( !rc && eFi
1c530 6c 65 4c 6f 63 6b 3c 53 51 4c 49 54 45 5f 4c 4f  leLock<SQLITE_LO
1c540 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  CK_EXCLUSIVE ){.
1c550 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 46 69          rc = pFi
1c560 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
1c570 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  ck(id, SQLITE_LO
1c580 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  CK_EXCLUSIVE);. 
1c590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c5a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
1c5b0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
1c5c0 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20  ock > eFileLock 
1c5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
1c5e0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
1c5f0 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
1c600 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ck);.        }. 
1c610 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c620 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c630 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  rc = pFile->pMet
1c640 68 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65 28 69  hod->xTruncate(i
1c650 64 2c 20 28 28 70 46 69 6c 65 2d 3e 66 73 46 6c  d, ((pFile->fsFl
1c660 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46  ags & SQLITE_FSF
1c670 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20 21  LAGS_IS_MSDOS) !
1c680 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29 3b  = 0) ? 1L : 0L);
1c690 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 26  .      if( !rc &
1c6a0 26 20 28 53 51 4c 49 54 45 5f 4f 4b 3d 3d 67 65  & (SQLITE_OK==ge
1c6b0 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69  tDbPathForUnixFi
1c6c0 6c 65 28 70 46 69 6c 65 2c 20 6a 50 61 74 68 29  le(pFile, jPath)
1c6d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 4c 65  ) ){.        jLe
1c6e0 6e 20 3d 20 73 74 72 6c 63 61 74 28 6a 50 61 74  n = strlcat(jPat
1c6f0 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 4d  h, "-journal", M
1c700 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20  AXPATHLEN+9);.  
1c710 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c        if( jLen <
1c720 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 20 29 7b   MAXPATHLEN+9 ){
1c730 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
1c740 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c  fd = open(jPath,
1c750 20 4f 5f 54 52 55 4e 43 29 3b 0a 20 20 20 20 20   O_TRUNC);.     
1c760 20 20 20 20 20 69 66 28 20 28 6a 66 64 20 3d 3d       if( (jfd ==
1c770 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20   -1) ){.        
1c780 20 20 20 20 69 66 20 28 20 65 72 72 6e 6f 21 3d      if ( errno!=
1c790 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  ENOENT ){.      
1c7a0 20 20 20 20 20 20 20 20 70 65 72 72 6f 72 28 6a          perror(j
1c7b0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  Path);.         
1c7c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1c7d0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1c7e0 20 20 20 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a      fsync(jfd);.
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
1c800 65 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  e(jfd);.        
1c810 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1c820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c830 20 20 20 74 72 63 3d 72 63 3b 0a 20 20 20 20 20     trc=rc;.     
1c840 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 74 72   }.      if( !tr
1c850 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74 72 63  c ){.        trc
1c860 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
1c870 64 2d 3e 78 53 79 6e 63 28 69 64 2c 20 53 51 4c  d->xSync(id, SQL
1c880 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a  ITE_SYNC_FULL);.
1c890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c8a0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
1c8b0 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29  ck > eFileLock )
1c8c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e  {.        int un
1c8d0 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e  lockRC = pFile->
1c8e0 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
1c8f0 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
1c900 5f 53 48 41 52 45 44 29 3b 0a 20 20 20 20 20 20  _SHARED);.      
1c910 20 20 69 66 20 28 21 72 63 29 20 72 63 20 3d 20    if (!rc) rc = 
1c920 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20 20 20 20 20  unlockRC;.      
1c930 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  }.      if( pFil
1c940 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65  e->eFileLock > e
1c950 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
1c960 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 43      int unlockRC
1c970 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
1c980 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 53  d->xUnlock(id, S
1c990 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45 29  QLITE_LOCK_NONE)
1c9a0 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 72  ;.        if (!r
1c9b0 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43  c) rc = unlockRC
1c9c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c9d0 69 66 28 20 74 72 63 20 29 7b 0a 20 20 20 20 20  if( trc ){.     
1c9e0 20 20 20 72 65 74 75 72 6e 20 74 72 63 3b 0a 20     return trc;. 
1c9f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1ca00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ca10 20 20 20 20 0a 20 20 20 20 63 61 73 65 20 53 51      .    case SQ
1ca20 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f 44 41 54  LITE_REPLACE_DAT
1ca30 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 75  ABASE: {.      u
1ca40 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1ca50 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1ca60 20 20 20 20 20 20 69 6e 74 20 74 72 63 20 3d 20        int trc = 
1ca70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1ca80 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d   int eFileLock =
1ca90 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1caa0 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  k;.      int rc 
1cab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1cac0 20 20 20 63 68 61 72 20 6a 50 61 74 68 5b 4d 41     char jPath[MA
1cad0 58 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20 20  XPATHLEN+9];.   
1cae0 20 20 20 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a     size_t jLen;.
1caf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73        sqlite3 *s
1cb00 72 63 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20  rcdb = (sqlite3 
1cb10 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 42 74  *)pArg;.      Bt
1cb20 72 65 65 20 2a 70 53 72 63 42 74 72 65 65 20 3d  ree *pSrcBtree =
1cb30 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 69 6e 74   NULL;.      int
1cb40 20 65 53 72 63 46 69 6c 65 4c 6f 63 6b 20 3d 20   eSrcFileLock = 
1cb50 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45  SQLITE_LOCK_NONE
1cb60 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 72 63 4c  ;.      int srcL
1cb70 6f 63 6b 52 43 20 3d 20 2d 31 3b 0a 20 20 20 20  ockRC = -1;.    
1cb80 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1cb90 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b  src_file = NULL;
1cba0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
1cbb0 2a 70 53 72 63 46 69 6c 65 20 3d 20 4e 55 4c 4c  *pSrcFile = NULL
1cbc0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  ;.      .      i
1cbd0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1cbe0 79 43 68 65 63 6b 4f 6b 28 73 72 63 64 62 29 20  yCheckOk(srcdb) 
1cbf0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1cc00 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
1cc10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cc20 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 53 51 4c  f( eFileLock<SQL
1cc30 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 20  ITE_LOCK_SHARED 
1cc40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1cc50 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
1cc60 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45  xLock(id, SQLITE
1cc70 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20  _LOCK_SHARED);. 
1cc80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1cc90 20 21 72 63 20 26 26 20 65 46 69 6c 65 4c 6f 63   !rc && eFileLoc
1cca0 6b 3c 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  k<SQLITE_LOCK_EX
1ccb0 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
1ccc0 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70     rc = pFile->p
1ccd0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64  Method->xLock(id
1cce0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
1ccf0 43 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CLUSIVE);.      
1cd00 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
1cd10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 67 65  ){.        /* ge
1cd20 74 20 74 68 65 20 73 72 63 20 66 69 6c 65 20 64  t the src file d
1cd30 65 73 63 72 69 70 74 6f 72 20 61 64 68 65 72 69  escriptor adheri
1cd40 6e 67 20 74 6f 20 74 68 65 20 64 62 20 73 74 72  ng to the db str
1cd50 75 63 74 20 61 63 63 65 73 73 20 72 75 6c 65 73  uct access rules
1cd60 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68   .         ** th
1cd70 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 65 6c  is code is model
1cd80 65 64 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  ed after sqlite3
1cd90 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20  _file_control() 
1cda0 69 6e 20 6d 61 69 6e 2e 63 0a 20 20 20 20 20 20  in main.c.      
1cdb0 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 73     */ .        s
1cdc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1cdd0 65 72 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29  er(srcdb->mutex)
1cde0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 72  ;.        if( sr
1cdf0 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20 20  cdb->nDb>0 ){.  
1ce00 20 20 20 20 20 20 20 20 70 53 72 63 42 74 72 65          pSrcBtre
1ce10 65 20 3d 20 73 72 63 64 62 2d 3e 61 44 62 5b 30  e = srcdb->aDb[0
1ce20 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 7d  ].pBt;.        }
1ce30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 72  .        if( pSr
1ce40 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20  cBtree ){.      
1ce50 20 20 20 20 50 61 67 65 72 20 2a 70 53 72 63 50      Pager *pSrcP
1ce60 61 67 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ager;.          
1ce70 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1ce80 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20  r(pSrcBtree);.  
1ce90 20 20 20 20 20 20 20 20 70 53 72 63 50 61 67 65          pSrcPage
1cea0 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
1ceb0 50 61 67 65 72 28 70 53 72 63 42 74 72 65 65 29  Pager(pSrcBtree)
1cec0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1ced0 72 74 28 20 70 53 72 63 50 61 67 65 72 21 3d 30  rt( pSrcPager!=0
1cee0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 72   );.          sr
1cef0 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  c_file = sqlite3
1cf00 50 61 67 65 72 46 69 6c 65 28 70 53 72 63 50 61  PagerFile(pSrcPa
1cf10 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
1cf20 61 73 73 65 72 74 28 20 73 72 63 5f 66 69 6c 65  assert( src_file
1cf30 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1cf40 20 69 66 28 20 73 72 63 5f 66 69 6c 65 2d 3e 70   if( src_file->p
1cf50 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
1cf60 20 20 20 20 20 20 20 70 53 72 63 46 69 6c 65 20         pSrcFile 
1cf70 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 72  = (unixFile *)sr
1cf80 63 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 20 20  c_file;.        
1cf90 20 20 20 20 65 53 72 63 46 69 6c 65 4c 6f 63 6b      eSrcFileLock
1cfa0 20 3d 20 70 53 72 63 46 69 6c 65 2d 3e 65 46 69   = pSrcFile->eFi
1cfb0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  leLock;.        
1cfc0 20 20 20 20 69 66 28 20 65 53 72 63 46 69 6c 65      if( eSrcFile
1cfd0 4c 6f 63 6b 3c 53 51 4c 49 54 45 5f 4c 4f 43 4b  Lock<SQLITE_LOCK
1cfe0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20  _SHARED ){.     
1cff0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 53           rc = pS
1d000 72 63 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  rcFile->pMethod-
1d010 3e 78 4c 6f 63 6b 28 73 72 63 5f 66 69 6c 65 2c  >xLock(src_file,
1d020 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41   SQLITE_LOCK_SHA
1d030 52 45 44 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RED);.          
1d040 20 20 20 20 73 72 63 4c 6f 63 6b 52 43 20 3d 20      srcLockRC = 
1d050 72 63 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b  rc; /* SQLITE_OK
1d060 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
1d070 6f 20 75 6e 6c 6f 63 6b 20 6c 61 74 65 72 20 2a  o unlock later *
1d080 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  /.            } 
1d090 65 6c 73 65 20 69 66 28 20 65 53 72 63 46 69 6c  else if( eSrcFil
1d0a0 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 4c 4f  eLock==SQLITE_LO
1d0b0 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  CK_EXCLUSIVE ){.
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d0d0 20 69 66 20 74 68 65 20 73 72 63 20 64 61 74 61   if the src data
1d0e0 62 61 73 65 20 68 61 73 20 61 6e 20 65 78 63 6c  base has an excl
1d0f0 75 73 69 76 65 20 6c 6f 63 6b 2c 20 76 65 72 69  usive lock, veri
1d100 66 79 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  fy that the.    
1d110 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
1d120 20 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61 20   doesn't have a 
1d130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
1d140 68 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  h open transacti
1d150 6f 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 20  ons .           
1d160 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1d170 20 20 20 20 20 69 66 28 20 67 65 74 44 62 50 61       if( getDbPa
1d180 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 53  thForUnixFile(pS
1d190 72 63 46 69 6c 65 2c 20 6a 50 61 74 68 29 20 29  rcFile, jPath) )
1d1a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d1b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
1d1c0 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  TERNAL;.        
1d1d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 4c 65               jLe
1d1f0 6e 20 3d 20 73 74 72 6c 63 61 74 28 6a 50 61 74  n = strlcat(jPat
1d200 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 4d  h, "-journal", M
1d210 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20  AXPATHLEN+9);.  
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1d230 28 20 6a 4c 65 6e 20 3c 20 4d 41 58 50 41 54 48  ( jLen < MAXPATH
1d240 4c 45 4e 2b 39 20 29 7b 0a 20 20 20 20 20 20 20  LEN+9 ){.       
1d250 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
1d260 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c  fd = open(jPath,
1d270 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20   O_RDONLY);.    
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1d290 28 20 6a 66 64 3d 3d 2d 31 20 29 7b 0a 20 20 20  ( jfd==-1 ){.   
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45   if( errno!=ENOE
1d2c0 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
1d2e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1d2f0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
1d300 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d310 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d340 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 20 20 2f 2a 20 69 66 20 74 68 65 20 6a 6f 75 72    /* if the jour
1d370 6e 61 6c 20 65 78 69 73 74 73 20 65 6e 73 75 72  nal exists ensur
1d380 65 20 74 68 65 72 65 27 73 20 6e 6f 20 70 65 6e  e there's no pen
1d390 64 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20  ding .          
1d3a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72             ** tr
1d3b0 61 6e 73 61 63 74 69 6f 6e 20 62 79 20 63 68 65  ansaction by che
1d3c0 63 6b 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  cking the journa
1d3d0 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 63 68 61 72 20 6d 61 67 69 63 5b 38 5d 3b 0a 20  char magic[8];. 
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 20 20 20 73 73 69 7a 65 5f 74 20 72 6c 65 6e 20     ssize_t rlen 
1d420 3d 20 70 72 65 61 64 28 6a 66 64 2c 20 6d 61 67  = pread(jfd, mag
1d430 69 63 2c 20 38 2c 20 30 29 3b 0a 20 20 20 20 20  ic, 8, 0);.     
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1d450 66 28 20 72 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  f( rlen<0 ){.   
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d470 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1d480 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1d4b0 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20  OERR;.          
1d4c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
1d4d0 69 66 28 20 72 6c 65 6e 3d 3d 38 20 29 7b 0a 20  if( rlen==8 ){. 
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4f0 20 20 20 20 20 63 68 61 72 20 74 65 73 74 5b 38       char test[8
1d500 5d 20 3d 20 7b 27 5c 30 27 2c 27 5c 30 27 2c 27  ] = {'\0','\0','
1d510 5c 30 27 2c 27 5c 30 27 2c 27 5c 30 27 2c 27 5c  \0','\0','\0','\
1d520 30 27 2c 27 5c 30 27 2c 27 5c 30 27 7d 3b 0a 20  0','\0','\0'};. 
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
1d550 6d 61 67 69 63 2c 74 65 73 74 2c 38 29 20 29 7b  magic,test,8) ){
1d560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d570 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1d580 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d5b0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
1d5c0 66 28 20 72 6c 65 6e 21 3d 30 20 29 7b 0a 20 20  f( rlen!=0 ){.  
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d5f0 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20  INTERNAL;.      
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d620 20 20 20 20 63 6c 6f 73 65 28 6a 66 64 29 3b 0a      close(jfd);.
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d670 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
1d680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1d690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53   rc = SQLITE_MIS
1d6a0 55 53 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USE;.          }
1d6b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1d6c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
1d6d0 20 69 66 28 20 73 72 63 4c 6f 63 6b 52 43 3d 3d   if( srcLockRC==
1d6e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6f0 20 20 20 20 20 20 20 20 20 20 20 70 53 72 63 46             pSrcF
1d700 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
1d710 6e 6c 6f 63 6b 28 73 72 63 5f 66 69 6c 65 2c 20  nlock(src_file, 
1d720 65 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  eSrcFileLock);. 
1d730 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1d740 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d750 42 74 72 65 65 4c 65 61 76 65 28 70 53 72 63 42  BtreeLeave(pSrcB
1d760 74 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  tree);.         
1d770 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1d780 20 20 20 20 20 69 66 28 20 70 53 72 63 46 69 6c       if( pSrcFil
1d790 65 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 70 53 72 63  e==NULL || (pSrc
1d7a0 46 69 6c 65 2d 3e 68 3c 30 29 20 29 7b 0a 20 20  File->h<0) ){.  
1d7b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1d7c0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
1d7d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1d7e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72 63 64  mutex_leave(srcd
1d7f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1d800 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d810 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1d820 20 20 20 20 20 2f 2a 20 75 6e 72 6f 6c 6c 20 73       /* unroll s
1d830 74 61 74 65 20 63 68 61 6e 67 65 73 20 61 6e 64  tate changes and
1d840 20 72 65 74 75 72 6e 20 65 72 72 6f 72 20 63 6f   return error co
1d850 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  de */.        if
1d860 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
1d870 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29  ck > eFileLock )
1d880 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
1d890 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
1d8a0 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
1d8b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
1d8c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d8d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d8e0 20 20 20 20 20 20 2f 2a 20 62 6f 74 68 20 64 61        /* both da
1d8f0 74 61 62 61 73 65 73 20 61 72 65 20 6c 6f 63 6b  tabases are lock
1d900 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  ed appropriately
1d910 2c 20 63 6f 70 79 20 66 69 6c 65 20 64 61 74 61  , copy file data
1d920 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  .         ** and
1d930 20 74 68 65 6e 20 75 6e 72 6f 6c 6c 20 74 68 65   then unroll the
1d940 20 6c 6f 63 6b 73 20 77 65 20 61 64 64 65 64 2e   locks we added.
1d950 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20   .         */.  
1d960 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73        copyfile_s
1d970 74 61 74 65 5f 74 20 73 3b 0a 20 20 20 20 20 20  tate_t s;.      
1d980 20 20 0a 20 20 20 20 20 20 20 20 73 20 3d 20 63    .        s = c
1d990 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c  opyfile_state_al
1d9a0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
1d9b0 66 28 20 66 63 6f 70 79 66 69 6c 65 28 70 53 72  f( fcopyfile(pSr
1d9c0 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  cFile->h, pFile-
1d9d0 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f  >h, s, COPYFILE_
1d9e0 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
1d9f0 20 20 73 77 69 74 63 68 28 65 72 72 6e 6f 29 20    switch(errno) 
1da00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
1da10 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20  se ENOMEM:.     
1da20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1da30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1da40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1da50 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
1da60 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ault:.          
1da70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1da80 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20  INTERNAL;.      
1da90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1daa0 20 20 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65          copyfile
1dab0 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a  _state_free(s);.
1dac0 20 20 20 20 20 20 20 20 69 66 28 20 73 72 63 4c          if( srcL
1dad0 6f 63 6b 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ockRC==SQLITE_OK
1dae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53   ){.          pS
1daf0 72 63 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  rcFile->pMethod-
1db00 3e 78 55 6e 6c 6f 63 6b 28 73 72 63 5f 66 69 6c  >xUnlock(src_fil
1db10 65 2c 20 65 53 72 63 46 69 6c 65 4c 6f 63 6b 29  e, eSrcFileLock)
1db20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1db30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1db40 4c 65 61 76 65 28 70 53 72 63 42 74 72 65 65 29  Leave(pSrcBtree)
1db50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1db60 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72  3_mutex_leave(sr
1db70 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  cdb->mutex);.   
1db80 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
1db90 20 20 69 66 28 20 21 72 63 20 26 26 20 28 53 51    if( !rc && (SQ
1dba0 4c 49 54 45 5f 4f 4b 3d 3d 67 65 74 44 62 50 61  LITE_OK==getDbPa
1dbb0 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46  thForUnixFile(pF
1dbc0 69 6c 65 2c 20 6a 50 61 74 68 29 29 20 29 7b 0a  ile, jPath)) ){.
1dbd0 20 20 20 20 20 20 20 20 6a 4c 65 6e 20 3d 20 73          jLen = s
1dbe0 74 72 6c 63 61 74 28 6a 50 61 74 68 2c 20 22 2d  trlcat(jPath, "-
1dbf0 6a 6f 75 72 6e 61 6c 22 2c 20 4d 41 58 50 41 54  journal", MAXPAT
1dc00 48 4c 45 4e 2b 39 29 3b 0a 20 20 20 20 20 20 20  HLEN+9);.       
1dc10 20 69 66 28 20 6a 4c 65 6e 20 3c 20 4d 41 58 50   if( jLen < MAXP
1dc20 41 54 48 4c 45 4e 2b 39 20 29 7b 0a 20 20 20 20  ATHLEN+9 ){.    
1dc30 20 20 20 20 20 20 69 6e 74 20 6a 66 64 20 3d 20        int jfd = 
1dc40 6f 70 65 6e 28 6a 50 61 74 68 2c 20 4f 5f 54 52  open(jPath, O_TR
1dc50 55 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  UNC);.          
1dc60 69 66 28 20 28 6a 66 64 20 3d 3d 20 2d 31 29 20  if( (jfd == -1) 
1dc70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1dc80 66 20 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e  f ( errno!=ENOEN
1dc90 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T ){.           
1dca0 20 20 20 70 65 72 72 6f 72 28 6a 50 61 74 68 29     perror(jPath)
1dcb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1dcc0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1dcd0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
1dce0 73 79 6e 63 28 6a 66 64 29 3b 0a 20 20 20 20 20  sync(jfd);.     
1dcf0 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a 66 64         close(jfd
1dd00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1dd10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dd20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 72  else{.        tr
1dd30 63 3d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  c=rc;.      }.  
1dd40 20 20 20 20 69 66 28 20 21 74 72 63 20 29 7b 0a      if( !trc ){.
1dd50 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 70 46          trc = pF
1dd60 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 53  ile->pMethod->xS
1dd70 79 6e 63 28 69 64 2c 20 53 51 4c 49 54 45 5f 53  ync(id, SQLITE_S
1dd80 59 4e 43 5f 46 55 4c 4c 29 3b 0a 20 20 20 20 20  YNC_FULL);.     
1dd90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 69   }.      if( pFi
1dda0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
1ddb0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
1ddc0 20 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63 6b 52       int unlockR
1ddd0 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  C = pFile->pMeth
1dde0 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  od->xUnlock(id, 
1ddf0 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
1de00 45 44 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  ED);.        if 
1de10 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63  (!rc) rc = unloc
1de20 6b 52 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  kRC;.      }.   
1de30 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
1de40 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c  ileLock > eFileL
1de50 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ock ){.        i
1de60 6e 74 20 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46  nt unlockRC = pF
1de70 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
1de80 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45  nlock(id, SQLITE
1de90 5f 4c 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20  _LOCK_NONE);.   
1dea0 20 20 20 20 20 69 66 20 28 21 72 63 29 20 72 63       if (!rc) rc
1deb0 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20 20   = unlockRC;.   
1dec0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
1ded0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
1dee0 74 75 72 6e 20 74 72 63 3b 0a 20 20 20 20 20 20  turn trc;.      
1def0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
1df00 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  c;.    }.#endif 
1df10 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  /* (SQLITE_ENABL
1df20 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
1df30 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1df40 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61 73 65  E__) */.    case
1df50 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59   SQLITE_FCNTL_SY
1df60 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20  NC_OMITTED: {.  
1df70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1df80 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f  E_OK;  /* A no-o
1df90 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p */.    }.  }. 
1dfa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1dfb0 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  OTFOUND;.}../*.*
1dfc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
1dfd0 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tor size in byte
1dfe0 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  s of the underly
1dff0 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65  ing block device
1e000 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63   for.** the spec
1e010 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73  ified file. This
1e020 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
1e030 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74  s 512 bytes, but
1e040 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65   may be.** large
1e050 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63  r for some devic
1e060 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  es..**.** SQLite
1e070 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
1e080 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e  is function cann
1e090 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f  ot fail. It also
1e0a0 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   assumes that.**
1e0b0 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72   if two files ar
1e0c0 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  e created in the
1e0d0 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65   same file-syste
1e0e0 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  m directory (i.e
1e0f0 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  ..** a database 
1e100 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  and its journal 
1e110 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73  file) that the s
1e120 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1e130 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66  be the.** same f
1e140 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74  or both..*/.stat
1e150 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f  ic int unixSecto
1e160 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1e170 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  le *NotUsed){.  
1e180 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1e190 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1e1a0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
1e1b0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1e1c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e1d0 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
1e1e0 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74  cteristics for t
1e1f0 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
1e200 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e   always 0 for un
1e210 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ix..*/.static in
1e220 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
1e230 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
1e240 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
1e250 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
1e260 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1e270 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1e280 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e290 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20  MIT_WAL.../*.** 
1e2a0 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
1e2b0 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
1e2c0 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
1e2d0 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
1e2e0 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
1e2f0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
1e300 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
1e310 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
1e320 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
1e330 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
1e340 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
1e350 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
1e360 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
1e370 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1e380 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
1e390 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
1e3a0 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
1e3b0 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
1e3c0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
1e3d0 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
1e3e0 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
1e3f0 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
1e400 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
1e410 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
1e420 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
1e430 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
1e440 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
1e450 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
1e460 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
1e470 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
1e480 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
1e490 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
1e4a0 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
1e4b0 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
1e4c0 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
1e4d0 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
1e4e0 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
1e4f0 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
1e500 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
1e510 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1e520 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
1e530 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
1e540 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
1e550 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
1e560 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
1e570 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
1e580 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
1e590 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
1e5a0 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
1e5b0 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
1e5c0 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
1e5d0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
1e5e0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1e5f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
1e600 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
1e610 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
1e620 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
1e630 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
1e640 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
1e650 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
1e660 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
1e670 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
1e680 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
1e690 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
1e6a0 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
1e6b0 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
1e6c0 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
1e6d0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1e6e0 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
1e6f0 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
1e700 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
1e710 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1e720 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
1e730 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
1e740 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
1e750 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
1e760 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
1e770 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1e780 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
1e790 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
1e7a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
1e7b0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
1e7c0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1e7d0 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
1e7e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
1e810 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
1e820 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
1e830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1e840 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
1e850 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
1e860 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
1e870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1e880 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
1e890 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
1e8a0 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
1e8b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e8c0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1e8d0 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
1e8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
1e8f0 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
1e900 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1e910 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
1e920 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1e930 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e940 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
1e950 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
1e960 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
1e970 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
1e980 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
1e990 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1e9a0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
1e9b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1e9c0 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e9e0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
1e9f0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
1ea00 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
1ea10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ea20 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1ea30 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1ea40 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
1ea50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1ea60 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
1ea70 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
1ea80 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
1ea90 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
1eaa0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
1eab0 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
1eac0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
1ead0 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
1eae0 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
1eaf0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
1eb00 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1eb10 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
1eb20 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
1eb30 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
1eb40 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
1eb50 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
1eb60 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69  *    unixShm.pFi
1eb70 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  le.**    unixShm
1eb80 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
1eb90 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
1eba0 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
1ebb0 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d  unixShm.pFile->m
1ebc0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
1ebd0 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
1ebe0 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
1ebf0 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
1ec00 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
1ec10 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
1ec20 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
1ec30 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
1ec40 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1ec50 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
1ec60 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
1ec70 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
1ec80 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
1ec90 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
1eca0 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ecc0 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
1ecd0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
1ece0 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
1ecf0 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
1ed00 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1ed10 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
1ed20 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
1ed30 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1ed40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
1ed50 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
1ed60 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
1ed70 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
1ed80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed90 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
1eda0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1edb0 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68  ithin its unixSh
1edc0 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  mNode */.#endif.
1edd0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
1ede0 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
1edf0 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
1ee00 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20  UNIX_SHM_BASE   
1ee10 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
1ee20 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
1ee30 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
1ee40 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
1ee50 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20  UNIX_SHM_DMS    
1ee60 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53  (UNIX_SHM_BASE+S
1ee70 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1ee80 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
1ee90 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
1eea0 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f  ply posix adviso
1eeb0 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
1eec0 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74   bytes from ofst
1eed0 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d   through ofst+n-
1eee0 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62  1..**.** Locks b
1eef0 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b  lock if the mask
1ef00 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58   is exactly UNIX
1ef10 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e  _SHM_C and are n
1ef20 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  on-blocking.** o
1ef30 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1ef40 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53  tic int unixShmS
1ef50 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69  ystemLock(.  uni
1ef60 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
1ef70 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63  de, /* Apply loc
1ef80 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
1ef90 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1efa0 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
1efb0 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
1efc0 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f    /* F_UNLCK, F_
1efd0 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43  RDLCK, or F_WRLC
1efe0 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f000 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
1f010 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
1f020 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f040 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1f050 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  to lock */.){.  
1f060 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
1f070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73        /* The pos
1f080 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
1f090 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
1f0a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f0b0 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75  TE_OK;   /* Resu
1f0c0 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e  lt code form fcn
1f0d0 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  tl() */..  /* Ac
1f0e0 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
1f0f0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
1f100 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
1f110 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
1f120 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f130 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
1f140 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ode->mutex) || p
1f150 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1f160 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64   );..  /* Shared
1f170 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61   locks never spa
1f180 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
1f190 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  byte */.  assert
1f1a0 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79  ( n==1 || lockTy
1f1b0 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a  pe!=F_RDLCK );..
1f1c0 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77    /* Locks are w
1f1d0 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20  ithin range */. 
1f1e0 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26   assert( n>=1 &&
1f1f0 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   n<SQLITE_SHM_NL
1f200 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  OCK );..  if( pS
1f210 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
1f220 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1f230 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
1f240 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
1f250 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69  memset(&f, 0, si
1f260 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e  zeof(f));.    f.
1f270 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70  l_type = lockTyp
1f280 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63  e;.    f.l_whenc
1f290 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
1f2a0 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66    f.l_start = of
1f2b0 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20  st;.    f.l_len 
1f2c0 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = n;..    rc = o
1f2d0 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
1f2e0 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
1f2f0 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d  ;.    rc = (rc!=
1f300 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
1f310 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
1f320 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
1f330 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63  e the global loc
1f340 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64  k state and do d
1f350 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a  ebug tracing */.
1f360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1f370 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b  BUG.  { u16 mask
1f380 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1f390 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61  M-LOCK "));.  ma
1f3a0 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
1f3b0 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
1f3c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f3d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  _OK ){.    if( l
1f3e0 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
1f3f0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1f400 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b  E(("unlock %d ok
1f410 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
1f420 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
1f430 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1f440 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
1f450 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
1f460 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
1f470 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
1f480 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1f490 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
1f4a0 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
1f4b0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1f4c0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
1f4d0 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
1f4e0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  e->sharedMask |=
1f4f0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65   mask;.    }else
1f500 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f510 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
1f520 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
1f530 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
1f540 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
1f550 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1f560 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
1f570 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1f580 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1f590 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ~mask;.    }.  }
1f5a0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f  else{.    if( lo
1f5b0 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
1f5c0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1f5d0 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69  (("unlock %d fai
1f5e0 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
1f5f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
1f600 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
1f610 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1f620 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65  "read-lock faile
1f630 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  d"));.    }else{
1f640 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
1f650 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
1f660 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
1f670 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
1f680 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
1f690 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
1f6a0 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65  STRACE((" - afte
1f6b0 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78  rwards %03x,%03x
1f6c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f6d0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1f6e0 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Mask, pShmNode->
1f6f0 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a  exclMask));.  }.
1f700 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1f710 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a   rc;        .}..
1f720 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
1f730 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74   unixShmNodeList
1f740 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
1f750 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68  ries with unixSh
1f760 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
1f770 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
1f780 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
1f790 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
1f7a0 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
1f7b0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
1f7c0 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
1f7d0 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
1f7e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1f7f0 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69  xShmPurge(unixFi
1f800 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78  le *pFd){.  unix
1f810 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64  ShmNode *p = pFd
1f820 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1f830 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
1f840 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
1f850 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e  .  if( p && p->n
1f860 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Ref==0 ){.    in
1f870 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
1f880 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d   p->pInode==pFd-
1f890 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 69  >pInode );.    i
1f8a0 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71  f( p->mutex ) sq
1f8b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
1f8c0 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
1f8d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
1f8e0 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
1f8f0 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
1f900 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e 6d 61 70  {.        munmap
1f910 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c  (p->apRegion[i],
1f920 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   p->szRegion);. 
1f930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f940 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f950 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29  (p->apRegion[i])
1f960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f970 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f980 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20  (p->apRegion);. 
1f990 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
1f9a0 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
1f9b0 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20  lose(pFd, p->h, 
1f9c0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
1f9d0 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20   p->h = -1;.    
1f9e0 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d  }.    p->pInode-
1f9f0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20  >pShmNode = 0;. 
1fa00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1fa10 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  p);.  }.}..stati
1fa20 63 20 69 6e 74 20 69 73 50 72 6f 78 79 4c 6f 63  c int isProxyLoc
1fa30 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46 69 6c  kingMode(unixFil
1fa40 65 20 2a 29 3b 0a 73 74 61 74 69 63 20 63 6f 6e  e *);.static con
1fa50 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53 68  st char *proxySh
1fa60 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61  aredMemoryBasePa
1fa70 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a  th(unixFile *);.
1fa80 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
1fa90 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
1faa0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1fab0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
1fac0 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20  ile pDbFd.  .** 
1fad0 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
1fae0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
1faf0 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ses mmapped file
1fb00 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  s..**.** The fil
1fb10 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1fb20 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ent shared-memor
1fb30 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  y is in the same
1fb40 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73   directory.** as
1fb50 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1fb60 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20  se file and has 
1fb70 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
1fb80 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1fb90 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20  se.** file with 
1fba0 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69  the "-shm" suffi
1fbb0 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78  x added.  For ex
1fbc0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61  ample, if the da
1fbd0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
1fbe0 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  s "/home/user1/c
1fbf0 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74  onfig.db" then t
1fc00 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  he file that is 
1fc10 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70  created and mmap
1fc20 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65  ped.** for share
1fc30 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
1fc40 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75   called "/home/u
1fc50 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73  ser1/config.db-s
1fc60 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f  hm".  .**.** Ano
1fc70 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f  ther approach to
1fc80 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73   is to use files
1fc90 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20   in /dev/shm or 
1fca0 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a  /dev/tmp or an.*
1fcb0 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70  * some other tmp
1fcc0 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66  fs mount. But if
1fcd0 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66   a file in a dif
1fce0 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  ferent directory
1fcf0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74  .** from the dat
1fd00 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73  abase file is us
1fd10 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69  ed, then differi
1fd20 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  ng access permis
1fd30 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68  sions.** or a ch
1fd40 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75  root() might cau
1fd50 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74  se two different
1fd60 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68   processes on th
1fd70 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61  e same.** databa
1fd80 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69  se to end up usi
1fd90 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  ng different fil
1fda0 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  es for shared me
1fdb0 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69  mory - .** meani
1fdc0 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65  ng that their me
1fdd0 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72  mory would not r
1fde0 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20  eally be shared 
1fdf0 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69  - resulting.** i
1fe00 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  n database corru
1fe10 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65  ption.  Neverthe
1fe20 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73  less, this tmpfs
1fe30 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63   file usage.** c
1fe40 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74  an be enabled at
1fe50 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
1fe60 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d  ing -DSQLITE_SHM
1fe70 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76  _DIRECTORY="/dev
1fe80 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20  /shm".** or the 
1fe90 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65  equivalent.  The
1fea0 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49   use of the SQLI
1feb0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1fec0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a   compile-time.**
1fed0 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20   option results 
1fee0 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
1fef0 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69  le build of SQLi
1ff00 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53  te;  builds of S
1ff10 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69  QLite.** that wi
1ff20 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c  th differing SQL
1ff30 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1ff40 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d  Y settings attem
1ff50 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  pt to use the.**
1ff60 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
1ff70 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ile at the same 
1ff80 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63  time, database c
1ff90 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c  orruption will l
1ffa0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e  ikely.** result.
1ffb0 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   The SQLITE_SHM_
1ffc0 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
1ffd0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
1ffe0 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22   considered.** "
1fff0 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64  unsupported" and
20000 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20   may go away in 
20010 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20  a future SQLite 
20020 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  release..**.** W
20030 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
20040 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
20050 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
20060 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
20070 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
20080 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
20090 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
200a0 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
200b0 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
200c0 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
200d0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
200e0 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
200f0 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
20100 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
20110 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
20120 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29  ase file (pDbFd)
20130 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75   is using the "u
20140 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a  nix-excl" VFS.**
20150 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
20160 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
20170 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
20180 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20190 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f  and.** that no o
201a0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
201b0 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  re able to read 
201c0 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74  or write the dat
201d0 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68  abase.  In.** th
201e0 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e  at case, we do n
201f0 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73  ot really need s
20200 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e  hared memory.  N
20210 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a  o shared memory.
20220 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ** file is creat
20230 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20  ed.  The shared 
20240 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73  memory will be s
20250 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65  imulated with he
20260 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ap memory..*/.st
20270 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
20280 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  nSharedMemory(un
20290 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  ixFile *pDbFd){.
202a0 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
202b0 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
202c0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
202d0 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
202e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
202f0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
20300 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  de;   /* The und
20310 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
20320 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
20330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
20350 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  ult code */.  un
20360 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
20370 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
20380 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64   The inode of fd
20390 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d   */.  char *zShm
203a0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
203b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
203c0 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
203d0 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20  or SHM */.  int 
203e0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  nShmFilename;   
203f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20400 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66  ize of the SHM f
20410 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  ilename in bytes
20420 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
20430 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
20440 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a   new unixShm obj
20450 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71  ect. */.  p = sq
20460 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
20470 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
20480 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
20490 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
204a0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
204b0 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65  eof(*p));.  asse
204c0 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
204d0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
204e0 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e  k to see if a un
204f0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
20500 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
20510 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   Reuse an existi
20520 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70  ng.  ** one if p
20530 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61  resent. Create a
20540 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
20550 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e  ssary..  */.  un
20560 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
20570 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64    pInode = pDbFd
20580 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d  ->pInode;.  pShm
20590 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Node = pInode->p
205a0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70  ShmNode;.  if( p
205b0 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
205c0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
205d0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
205e0 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20       /* fstat() 
205f0 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73  info for databas
20600 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  e file */..    /
20610 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74  * Call fstat() t
20620 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
20630 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
20640 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20650 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e  e. If.    ** a n
20660 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73  ew *-shm file is
20670 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74   created, an att
20680 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64  empt will be mad
20690 65 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20  e to create it. 
206a0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73     ** with the s
206b0 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ame permissions.
206c0 20 54 68 65 20 61 63 74 75 61 6c 20 70 65 72 6d   The actual perm
206d0 69 73 73 69 6f 6e 73 20 74 68 65 20 66 69 6c 65  issions the file
206e0 20 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20   is created.    
206f0 2a 2a 20 77 69 74 68 20 61 72 65 20 73 75 62 6a  ** with are subj
20700 65 63 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  ect to the curre
20710 6e 74 20 75 6d 61 73 6b 20 73 65 74 74 69 6e 67  nt umask setting
20720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20730 20 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e   osFstat(pDbFd->
20740 68 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49  h, &sStat) && pI
20750 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
20760 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ck==0 ){.      r
20770 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
20780 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f  _FSTAT;.      go
20790 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
207a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6f 6e 73  .    }..    cons
207b0 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74  t char *zBasePat
207c0 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  h = pDbFd->zPath
207d0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
207e0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
207f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
20800 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 49  G_STYLE.    /* I
20810 66 20 70 44 62 46 64 20 69 73 20 63 6f 6e 66 69  f pDbFd is confi
20820 67 75 72 65 64 20 77 69 74 68 20 70 72 6f 78 79  gured with proxy
20830 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 75   locking mode, u
20840 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  se the local .  
20850 20 20 20 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 20     ** lock file 
20860 70 61 74 68 20 74 6f 20 64 65 74 65 72 6d 69 6e  path to determin
20870 65 20 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 20  e the -shm file 
20880 70 61 74 68 0a 20 20 20 20 20 2a 2f 0a 20 20 20  path.     */.   
20890 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b   if( isProxyLock
208a0 69 6e 67 4d 6f 64 65 28 70 44 62 46 64 29 20 29  ingMode(pDbFd) )
208b0 7b 0a 20 20 20 20 20 20 7a 42 61 73 65 50 61 74  {.      zBasePat
208c0 68 20 3d 20 70 72 6f 78 79 53 68 61 72 65 64 4d  h = proxySharedM
208d0 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28 70 44  emoryBasePath(pD
208e0 62 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bFd);.      if( 
208f0 21 7a 42 61 73 65 50 61 74 68 20 29 7b 0a 20 20  !zBasePath ){.  
20900 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20910 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
20920 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
20930 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
20940 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
20950 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
20960 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
20970 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  Y.    nShmFilena
20980 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49  me = sizeof(SQLI
20990 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
209a0 29 20 2b 20 33 30 3b 0a 23 65 6c 73 65 0a 20 20  ) + 30;.#else.  
209b0 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    nShmFilename =
209c0 20 35 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e   5 + (int)strlen
209d0 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e  (zBasePath);.#en
209e0 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
209f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
20a00 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  c( sizeof(*pShmN
20a10 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
20a20 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
20a30 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
20a40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20a50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
20a60 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
20a70 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
20a80 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
20a90 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29  zeof(*pShmNode))
20aa0 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
20ab0 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
20ac0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
20ad0 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
20ae0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
20af0 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
20b00 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
20b10 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
20b20 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b40 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
20b50 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
20b60 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
20b90 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
20ba0 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
20bb0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
20bc0 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
20bd0 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
20be0 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50  "%s-shm", zBaseP
20bf0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
20c00 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
20c10 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46  Fd->zPath, zShmF
20c20 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
20c30 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
20c40 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
20c50 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
20c60 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
20c70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
20c80 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
20c90 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
20ca0 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
20cb0 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
20cc0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
20cd0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
20ce0 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
20cf0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
20d00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
20d10 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
20d20 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
20d30 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
20d40 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
20d50 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
20d60 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
20d70 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57  mFilename, O_RDW
20d80 52 7c 4f 5f 43 52 45 41 54 2c 0a 20 20 20 20 20  R|O_CREAT,.     
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20da0 20 20 20 20 20 20 20 20 20 20 28 73 53 74 61 74            (sStat
20db0 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29  .st_mode & 0777)
20dc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
20dd0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
20de0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
20df0 20 2a 7a 52 4f 3b 0a 20 20 20 20 20 20 20 20 7a   *zRO;.        z
20e00 52 4f 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  RO = sqlite3_uri
20e10 5f 70 61 72 61 6d 65 74 65 72 28 70 44 62 46 64  _parameter(pDbFd
20e20 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e  ->zPath, "readon
20e30 6c 79 5f 73 68 6d 22 29 3b 0a 20 20 20 20 20 20  ly_shm");.      
20e40 20 20 69 66 28 20 7a 52 4f 20 26 26 20 73 71 6c    if( zRO && sql
20e50 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
20e60 52 4f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RO) ){.         
20e70 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
20e80 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46  obust_open(zShmF
20e90 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  ilename, O_RDONL
20ea0 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 20 20 20 20 20 20 20 28 73 53 74 61 74 2e 73 74         (sStat.st
20ed0 5f 6d 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a  _mode & 0777));.
20ee0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
20ef0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d  de->isReadonly =
20f00 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
20f10 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
20f20 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
20f30 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
20f40 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
20f50 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
20f60 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  en", zShmFilenam
20f70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
20f80 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
20f90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20fa0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43   }.  .      /* C
20fb0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
20fc0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
20fd0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
20fe0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
20ff0 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
21000 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
21010 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
21020 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
21030 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21040 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
21050 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
21060 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
21070 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
21080 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
21090 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
210a0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
210b0 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
210c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
210d0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
210e0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
210f0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
21100 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
21110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21120 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21140 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
21150 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
21160 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  de, F_RDLCK, UNI
21170 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
21180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21190 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
211a0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
211b0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
211c0 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
211d0 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
211e0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
211f0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
21200 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
21210 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
21220 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
21230 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
21240 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
21250 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
21260 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e  ->pShm = p;.  un
21270 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
21280 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
21290 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
212a0 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
212b0 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
212c0 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
212d0 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75  e cover of the u
212e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
212f0 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
21300 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
21310 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
21320 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20  unixShm) object 
21330 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
21340 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
21350 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
21360 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
21370 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
21380 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
21390 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
213a0 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
213b0 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
213c0 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
213d0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
213e0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
213f0 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
21400 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
21410 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
21420 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
21430 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
21440 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
21450 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
21460 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
21470 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
21480 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
21490 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
214a0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
214b0 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
214c0 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69  _open_err:.  uni
214d0 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
214e0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ;       /* This 
214f0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
21500 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
21510 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
21520 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  e(p);.  unixLeav
21530 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
21540 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21560 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
21570 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
21580 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
21590 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
215a0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
215b0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
215c0 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
215d0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
215e0 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
215f0 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
21600 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
21610 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
21620 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
21630 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
21640 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
21650 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
21660 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21670 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
21680 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
21690 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
216a0 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72   the bExtend par
216b0 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
216c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
216d0 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
216e0 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
216f0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
21700 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
21710 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
21720 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
21730 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
21740 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
21750 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
21760 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
21770 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20   .** bExtend is 
21780 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
21790 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
217a0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
217b0 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
217c0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
217d0 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
217e0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
217f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
21800 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
21810 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
21820 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
21830 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
21840 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
21850 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
21860 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
21870 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
21880 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
21890 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
218a0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
218b0 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
218c0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
218d0 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
218e0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
218f0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
21900 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70  c int unixShmMap
21910 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
21920 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
21930 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
21940 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
21950 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
21960 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
21970 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
21980 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
21990 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
219a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
219b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
219c0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
219d0 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20  bExtend,        
219e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
219f0 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
21a00 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
21a10 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
21a20 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
21a30 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
21a40 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
21a50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
21a60 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
21a70 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
21a80 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
21a90 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
21aa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21ab0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
21ac0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
21ad0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
21ae0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
21af0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
21b00 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
21b10 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
21b20 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
21b30 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
21b40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21b50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
21b60 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
21b70 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
21b80 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
21b90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
21ba0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
21bb0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
21bc0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
21bd0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
21be0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
21bf0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
21c00 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
21c10 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
21c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
21c30 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
21c40 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
21c50 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
21c60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
21c70 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
21c80 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
21c90 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
21ca0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
21cb0 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
21cc0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
21cd0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
21ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
21cf0 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
21d00 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
21d10 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
21d20 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
21d30 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
21d40 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
21d50 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
21d60 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
21d70 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
21d80 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
21d90 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
21da0 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
21db0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
21dc0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
21dd0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
21de0 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
21df0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
21e00 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
21e10 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
21e20 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
21e30 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
21e40 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
21e50 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
21e60 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
21e70 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
21e80 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
21e90 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
21ea0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
21eb0 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
21ec0 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
21ed0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
21ee0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
21ef0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
21f00 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
21f10 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
21f20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
21f30 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
21f40 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
21f50 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
21f60 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
21f70 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
21f80 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
21f90 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
21fa0 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
21fb0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
21fc0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
21fd0 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ned..        **.
21fe0 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72          ** Alter
21ff0 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78  natively, if bEx
22000 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73  tend is true, us
22010 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
22020 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
22030 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
22040 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
22050 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
22060 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
22070 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  d ) goto shmpage
22080 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66  _out;.        if
22090 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
220a0 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
220b0 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
220c0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
220d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
220e0 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72  RR_SHMSIZE, "ftr
220f0 75 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20  uncate",.       
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22110 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
22120 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
22130 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
22140 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
22150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
22160 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
22170 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
22180 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
22190 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
221a0 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
221b0 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   apNew = (char *
221c0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
221d0 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
221e0 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28  ode->apRegion, (
221f0 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
22200 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
22210 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
22220 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
22230 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22240 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
22250 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
22260 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
22270 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
22280 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f      while(pShmNo
22290 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
222a0 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69  gion){.      voi
222b0 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  d *pMem;.      i
222c0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
222d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 ){.        pMe
222e0 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65  m = mmap(0, szRe
222f0 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  gion,.          
22300 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
22310 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45  adonly ? PROT_RE
22320 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50  AD : PROT_READ|P
22330 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
22340 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
22350 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ED, pShmNode->h,
22360 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
22370 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20 20  on*szRegion.    
22380 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
22390 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49  f( pMem==MAP_FAI
223a0 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LED ){.         
223b0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
223c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
223d0 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20  SHMMAP, "mmap", 
223e0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
223f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
22400 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
22410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22430 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
22440 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29  malloc(szRegion)
22450 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
22460 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
22470 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
22480 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
22490 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
224a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
224b0 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c      memset(pMem,
224c0 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   0, szRegion);. 
224d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
224e0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
224f0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
22500 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20  n] = pMem;.     
22510 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
22520 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
22530 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
22540 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
22550 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
22560 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e  .    *pp = pShmN
22570 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52  ode->apRegion[iR
22580 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
22590 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
225a0 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
225b0 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20  ->isReadonly && 
225c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
225d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
225e0 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ONLY;.  sqlite3_
225f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
22600 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
22610 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22620 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
22630 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
22640 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
22650 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
22660 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
22670 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
22680 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
22690 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
226a0 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
226b0 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
226c0 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
226d0 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
226e0 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
226f0 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
22700 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
22710 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
22720 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
22730 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
22740 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
22750 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
22760 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
22770 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
22780 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
22790 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
227a0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
227b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
227c0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
227d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
227e0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22800 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
22810 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
22820 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22840 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22850 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
22860 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
22870 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
22880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
22890 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
228a0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
228b0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
228c0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
228d0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
228e0 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
228f0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
22900 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
22910 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
22920 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
22930 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
22940 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
22950 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22970 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
22980 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
22990 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
229a0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
229b0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
229c0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
229d0 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
229e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
229f0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
22a00 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
22a10 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
22a20 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
22a50 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
22a60 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
22a70 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
22a80 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
22a90 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
22aa0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
22ab0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
22ac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
22ad0 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
22ae0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
22af0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
22b00 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
22b10 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
22b20 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
22b30 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
22b40 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
22b50 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
22b60 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
22b70 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
22b80 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
22b90 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
22ba0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
22bb0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
22bc0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
22bd0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
22be0 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
22bf0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
22c00 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
22c10 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
22c20 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
22c30 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
22c40 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
22c50 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
22c60 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
22c70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
22c80 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
22c90 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
22ca0 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
22cb0 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
22cc0 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
22cd0 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
22ce0 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
22cf0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
22d00 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
22d10 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
22d20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
22d30 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
22d40 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
22d50 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
22d60 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
22d70 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
22d80 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
22d90 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
22da0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
22db0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
22dc0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
22dd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
22de0 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
22df0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
22e00 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
22e10 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
22e20 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
22e30 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
22e40 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
22e50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
22e60 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
22e70 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
22e80 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
22e90 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
22ea0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
22eb0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
22ec0 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f  Node, F_UNLCK, o
22ed0 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
22ee0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
22ef0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22f00 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
22f10 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
22f20 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
22f30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
22f50 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
22f60 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
22f70 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
22f80 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
22f90 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
22fa0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
22fb0 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
22fc0 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
22fd0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
22fe0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
22ff0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
23000 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
23010 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
23020 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
23030 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
23040 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
23050 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
23060 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
23070 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
23080 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
23090 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
230a0 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
230b0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
230c0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
230d0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
230e0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
230f0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
23100 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
23110 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
23120 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
23130 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
23140 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
23150 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
23160 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
23170 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
23180 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
23190 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
231a0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
231b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
231c0 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
231d0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
231e0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
231f0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
23200 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
23210 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
23220 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
23230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
23240 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
23250 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23260 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
23270 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
23280 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
232a0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
232b0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
232c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
232d0 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
232e0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
232f0 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
23300 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
23310 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
23320 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
23330 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
23340 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
23350 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
23360 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
23370 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
23380 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
23390 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
233a0 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
233b0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
233c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
233d0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
233e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
233f0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
23400 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
23410 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
23420 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
23430 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
23440 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
23450 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
23460 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
23470 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
23480 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
234a0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
234b0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
234c0 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
234d0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
234e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
234f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23500 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
23510 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
23520 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
23530 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
23540 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
23550 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
23560 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
23570 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
23580 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
23590 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
235a0 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
235b0 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
235c0 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69      p->id, getpi
235d0 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  d(), p->sharedMa
235e0 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29  sk, p->exclMask)
235f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23600 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
23610 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
23620 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
23630 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
23640 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
23650 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
23660 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
23670 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
23680 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
23690 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
236a0 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
236b0 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
236c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
236d0 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  ixShmBarrier(.  
236e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23700 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
23710 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
23720 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
23730 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
23740 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45  TER(fd);.  unixE
23750 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75  nterMutex();.  u
23760 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
23770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
23780 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
23790 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
237a0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
237b0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
237c0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
237d0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
237e0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
237f0 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
23800 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
23810 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
23820 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
23830 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
23840 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
23850 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
23860 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
23870 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
23880 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
23890 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
238a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
238b0 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
238c0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
238d0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
238e0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
238f0 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
23920 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
23930 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
23940 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
23950 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
23960 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
23970 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
23980 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
239a0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
239b0 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
239c0 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
239d0 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
239e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
239f0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
23a00 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
23a10 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
23a20 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
23a30 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
23a40 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
23a50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
23a60 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
23a70 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
23a80 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
23a90 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
23aa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23ab0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
23ac0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
23ad0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
23ae0 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
23af0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
23b00 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
23b10 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
23b20 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
23b30 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
23b40 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
23b50 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
23b60 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
23b70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
23b80 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
23b90 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
23ba0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
23bb0 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
23bc0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
23bd0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
23be0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
23bf0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
23c00 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
23c10 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
23c20 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
23c30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
23c40 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
23c50 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
23c60 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
23c70 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
23c80 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
23c90 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
23ca0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
23cb0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
23cc0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
23cd0 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
23ce0 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
23cf0 30 20 29 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e  0 ) unlink(pShmN
23d00 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
23d10 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67  .    unixShmPurg
23d20 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20  e(pDbFd);.  }.  
23d30 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
23d40 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
23d50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65  TE_OK;.}...#else
23d60 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
23d70 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
23d80 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20  ine unixShmLock 
23d90 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
23da0 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  ixShmBarrier 0.#
23db0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55   define unixShmU
23dc0 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
23dd0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
23de0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
23df0 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
23e00 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
23e10 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
23e20 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
23e30 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
23e40 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
23e50 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
23e60 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
23e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e80 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
23e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ed0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69  /../*.** This di
23ee0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
23ef0 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73  definitions of s
23f00 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
23f10 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a  s objects that.*
23f20 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69  * implement vari
23f30 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ous file locking
23f40 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74   strategies.  It
23f50 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64   also contains d
23f60 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66  efinitions.** of
23f70 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
23f80 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66  ons.  A finder-f
23f90 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23fa0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70  to locate the ap
23fb0 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c  propriate.** sql
23fc0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23fd0 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72  object for a par
23fe0 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
23ff0 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70   file.  The pApp
24000 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  Data.** field of
24010 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
24020 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65   VFS objects are
24030 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
24040 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  be pointers to.*
24050 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69  * the correct fi
24060 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f  nder-function fo
24070 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a  r that VFS..**.*
24080 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75  * Most finder fu
24090 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61  nctions return a
240a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
240b0 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
240c0 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
240d0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65  .  The only inte
240e0 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66  resting finder-f
240f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c  unction is autol
24100 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69  ockIoFinder, whi
24110 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74  ch.** looks at t
24120 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79  he filesystem ty
24130 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20  pe and tries to 
24140 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c  guess the best l
24150 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65  ocking.** strate
24160 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a  gy from that..**
24170 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66  .** For finder-f
24180 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  untion F, two ob
24190 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
241a0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
241b0 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
241c0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
241d0 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
241e0 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
241f0 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
24200 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
24210 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
24220 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
24230 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
24240 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
24250 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
24260 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
24270 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
24280 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
24290 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
242a0 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
242b0 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
242c0 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
242d0 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
242e0 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
242f0 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
24300 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
24310 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
24320 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
24330 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
24340 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
24350 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
24360 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
24370 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
24380 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
24390 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
243a0 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
243b0 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
243c0 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
243d0 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
243e0 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
243f0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
24400 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
24410 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
24420 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
24430 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
24440 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
24450 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
24460 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48  ODS(FINDER, METH
24470 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f  OD, VERSION, CLO
24480 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
24490 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c  , CKLOCK)      \
244a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
244b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
244c0 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
244f0 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24510 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
24540 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24560 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
24590 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
245b0 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
245c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
245e0 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
245f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24600 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24620 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
24630 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
24640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
24650 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
24680 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
24690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
246a0 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
246d0 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
246e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
246f0 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24710 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
24720 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24730 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
24740 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
24770 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
24780 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
24790 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
247c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
247d0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
247e0 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24800 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
24810 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
24820 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
24830 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
24860 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
24870 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
24880 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248a0 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
248b0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
248c0 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
248d0 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70   \.   unixShmMap
24900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24910 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24940 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
24950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24960 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
24990 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
249a0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
249b0 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
249c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
249e0 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20     unixShmUnmap 
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a00 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
24a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
24a80 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
24a90 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46  e3_io_methods *F
24aa0 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73  INDER##Impl(cons
24ab0 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46  t char *z, unixF
24ac0 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55  ile *p){   \.  U
24ad0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24ae0 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  z); UNUSED_PARAM
24af0 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20  ETER(p);        
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b10 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65            \.  re
24b20 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20  turn &METHOD;   
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20           \.}    
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bb0 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
24bc0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
24bd0 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e  o_methods *(*con
24be0 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74  st FINDER)(const
24bf0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20   char*,unixFile 
24c00 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46  *p)    \.    = F
24c10 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a  INDER##Impl;../*
24c20 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c  .** Here are all
24c30 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
24c40 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
24c50 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ts for each of t
24c60 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74  he.** locking st
24c70 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74  rategies.  Funct
24c80 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e  ions that return
24c90 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
24ca0 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72  se methods.** ar
24cb0 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a  e also created..
24cc0 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  */.IOMETHODS(.  
24cd0 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20  posixIoFinder,  
24ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
24cf0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
24d00 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65  e */.  posixIoMe
24d10 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
24d20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
24d30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
24d40 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20  me */.  2,      
24d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d60 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
24d70 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ry is enabled */
24d80 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24da0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
24db0 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24dd0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
24de0 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20    unixUnlock,   
24df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24e00 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
24e10 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
24e20 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20  rvedLock     /* 
24e30 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
24e40 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
24e50 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
24e60 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
24e70 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
24e80 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
24e90 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
24ea0 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
24eb0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24ec0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
24ed0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ef0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
24f00 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
24f10 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
24f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
24f30 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
24f40 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
24f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
24f60 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
24f70 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
24f80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
24f90 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
24fa0 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
24fb0 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68  vedLock   /* xCh
24fc0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
24fd0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
24fe0 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
24ff0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
25000 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
25010 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
25020 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
25030 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
25040 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
25050 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
25060 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
25070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
25080 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
25090 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
250a0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
250b0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
250c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
250d0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
250e0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
250f0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
25100 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
25110 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
25120 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
25130 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
25140 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b  dLock  /* xCheck
25150 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
25160 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
25170 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25180 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
25190 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
251a0 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
251b0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
251c0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
251d0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
251e0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
251f0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
25200 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
25210 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25230 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
25240 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
25250 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
25260 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
25270 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
25280 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
25290 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
252a0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
252b0 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
252c0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
252d0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
252e0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
252f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
25300 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
25310 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
25320 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
25330 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d  f OS_VXWORKS.IOM
25340 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46  ETHODS(.  semIoF
25350 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
25360 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
25370 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
25380 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20   semIoMethods,  
25390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
253a0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
253b0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
253c0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
253d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
253e0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
253f0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65  disabled */.  se
25400 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  mClose,         
25410 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
25420 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  e method */.  se
25430 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
25440 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
25450 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
25460 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
25470 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
25480 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
25490 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
254a0 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
254b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
254c0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
254d0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
254e0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
254f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25500 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
25510 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
25520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25530 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
25540 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
25550 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
25560 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
25570 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
25580 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
255b0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
255c0 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  led */.  afpClos
255d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
255e0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
255f0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
25600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25610 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
25620 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
25630 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
25640 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
25650 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
25660 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
25670 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
25680 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
25690 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  */.).#endif../*.
256a0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
256b0 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61  king method is a
256c0 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20   "super-method" 
256d0 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
256e0 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65  t it.** opens se
256f0 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73  condary file des
25700 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65  criptors for the
25710 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20   conch and lock 
25720 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20  files and.** it 
25730 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d  uses proxy, dot-
25740 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66  file, AFP, and f
25750 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d  lock() locking m
25760 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a  ethods on those.
25770 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ** secondary fil
25780 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  es.  For this re
25790 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
257a0 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
257b0 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b  ts.** proxy lock
257c0 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d  ing is located m
257d0 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e  uch further down
257e0 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42   in the file.  B
257f0 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f  ut we need.** to
25800 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65   go ahead and de
25810 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33  fine the sqlite3
25820 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20  _io_methods and 
25830 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a  finder function.
25840 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ** for proxy loc
25850 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77  king here.  So w
25860 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
25870 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  e the I/O method
25880 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
25890 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
258a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
258b0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74  CKING_STYLE.stat
258c0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73  ic int proxyClos
258d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e(sqlite3_file*)
258e0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
258f0 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
25900 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
25910 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f  ic int proxyUnlo
25920 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
25930 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
25940 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
25950 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
25960 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a  3_file*, int*);.
25970 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f  IOMETHODS(.  pro
25980 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  xyIoFinder,     
25990 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
259a0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
259b0 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f  /.  proxyIoMetho
259c0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
259d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
259e0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
259f0 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20  */.  2,         
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a10 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
25a20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
25a30 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20  proxyClose,     
25a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
25a50 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
25a60 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20  proxyLock,      
25a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
25a80 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
25a90 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  roxyUnlock,     
25aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
25ab0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
25ac0 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
25ad0 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68  edLock    /* xCh
25ae0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
25af0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
25b00 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64  if../* nfs lockd
25b10 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f   on OSX 10.3+ do
25b20 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74  esn't clear writ
25b30 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72  e locks when a r
25b40 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20  ead lock is set 
25b50 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
25b60 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
25b70 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25b80 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
25b90 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65  DS(.  nfsIoFinde
25ba0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
25bb0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
25bc0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66  ion name */.  nf
25bd0 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  sIoMethods,     
25be0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
25bf0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
25c00 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
25c10 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
25c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
25c30 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
25c40 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  isabled */.  uni
25c50 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
25c60 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
25c70 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
25c80 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
25c90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
25ca0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66  k method */.  nf
25cb0 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  sUnlock,        
25cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
25cd0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
25ce0 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
25cf0 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
25d00 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
25d10 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
25d20 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
25d30 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
25d40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
25d50 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a  KING_STYLE./* .*
25d60 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
25d70 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
25d80 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  s to determine t
25d90 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20  he best locking 
25da0 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72  strategy .** for
25db0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25dc0 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20  le "filePath".  
25dd0 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  It then returns 
25de0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
25df0 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
25e00 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
25e10 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
25e20 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f  **.** This is fo
25e30 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a  r MacOSX only..*
25e40 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
25e50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
25e60 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
25e70 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
25e80 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
25e90 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
25ea0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25eb0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
25ec0 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
25ed0 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  * open file obje
25ee0 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ct for the datab
25ef0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ase file */.){. 
25f00 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
25f10 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20  ruct Mapping {. 
25f20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
25f30 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20  Filesystem;     
25f40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
25f50 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65  system type name
25f60 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71   */.    const sq
25f70 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
25f80 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a   *pMethods;   /*
25f90 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   Appropriate loc
25fa0 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  king method */. 
25fb0 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20   } aMap[] = {.  
25fc0 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70    { "hfs",    &p
25fd0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
25fe0 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20  .    { "ufs",   
25ff0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
26000 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73   },.    { "afpfs
26010 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
26020 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66  s },.    { "smbf
26030 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
26040 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62  ds },.    { "web
26050 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  dav", &nolockIoM
26060 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
26070 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0, 0 }.  };.  in
26080 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
26090 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73  atfs fsInfo;.  s
260a0 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
260b0 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
260c0 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
260d0 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
260e0 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
260f0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
26100 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
26110 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
26120 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
26130 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
26140 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
26150 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20  IoMethods;.  }. 
26160 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65   if( statfs(file
26170 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
26180 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  = -1 ){.    if( 
26190 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
261a0 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20   MNT_RDONLY ){. 
261b0 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c       return &nol
261c0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
261d0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
261e0 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
261f0 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  stem; i++){.    
26200 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
26210 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
26220 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  , aMap[i].zFiles
26230 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  ystem)==0 ){.   
26240 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70       return aMap
26250 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20  [i].pMethods;.  
26260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26270 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61  .  /* Default ca
26280 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f  se. Handles, amo
26290 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66  ngst others, "nf
262a0 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79  s"..  ** Test by
262b0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73  te-range lock us
262c0 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20  ing fcntl(). If 
262d0 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64  the call succeed
262e0 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  s, .  ** assume 
262f0 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79  that the file-sy
26300 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f  stem supports PO
26310 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
26320 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66   .  */.  lockInf
26330 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
26340 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
26350 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
26360 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
26370 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
26380 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
26390 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
263a0 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
263b0 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
263c0 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72   ) {.    if( str
263d0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
263e0 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d  ypename, "nfs")=
263f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
26400 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  rn &nfsIoMethods
26410 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
26420 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73       return &pos
26430 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ixIoMethods;.   
26440 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
26450 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49  return &dotlockI
26460 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
26470 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
26480 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
26490 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
264a0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
264b0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
264c0 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
264d0 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
264e0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
264f0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
26500 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
26510 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
26520 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  f OS_VXWORKS && 
26530 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
26540 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
26550 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
26560 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
26570 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
26580 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
26590 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
265a0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
265b0 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
265c0 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
265d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
265e0 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
265f0 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
26600 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
26610 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
26620 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e  or VXWorks only.
26630 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
26640 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
26650 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
26660 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
26670 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
26680 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
26690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
266a0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
266b0 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
266c0 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
266d0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
266e0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
266f0 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
26700 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
26710 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
26720 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
26730 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
26740 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
26750 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
26760 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
26770 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
26780 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
26790 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
267a0 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
267b0 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
267c0 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
267d0 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
267e0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
267f0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
26800 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
26810 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
26820 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
26830 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
26840 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
26850 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
26860 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
26870 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
26880 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
26890 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
268a0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
268b0 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
268c0 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
268d0 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
268e0 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
268f0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
26900 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
26910 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
26920 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
26930 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
26940 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
26950 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
26960 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
26970 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
26980 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  S && SQLITE_ENAB
26990 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
269a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62   */../*.** An ab
269b0 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20  stract type for 
269c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49  a pointer to a I
269d0 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
269e0 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
269f0 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
26a00 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
26a10 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
26a20 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
26a30 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
26a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a80 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
26a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26aa0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
26ab0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
26ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26ad0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
26ae0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
26af0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
26b00 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
26b10 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
26b20 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
26b30 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
26b40 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
26b50 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
26b60 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
26b70 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
26b80 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
26b90 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
26ba0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
26bb0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
26bc0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
26bd0 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
26be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
26bf0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
26c00 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
26c10 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
26c20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20 20  dirfd,          
26c30 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
26c40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
26c50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
26c60 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
26c70 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
26c80 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
26c90 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
26ca0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
26cb0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
26cc0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
26cd0 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  ned */.  int noL
26ce0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
26cf0 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67   /* Omit locking
26d00 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
26d10 74 20 69 73 44 65 6c 65 74 65 2c 20 20 20 20 20  t isDelete,     
26d20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
26d30 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65  on close if true
26d40 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 61 64   */.  int isRead
26d50 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 2f 2a  Only          /*
26d60 20 54 72 75 65 20 69 66 20 74 68 65 20 66 69 6c   True if the fil
26d70 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
26d80 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  -only */.){.  co
26d90 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
26da0 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
26db0 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
26dc0 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
26dd0 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
26de0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26df0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
26e00 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
26e10 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65  ;..  /* Paramete
26e20 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f 6e  r isDelete is on
26e30 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f 72  ly used on vxwor
26e40 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68 69 73  ks. Express this
26e50 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a   explicitly .  *
26e60 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76 65 6e  * here to preven
26e70 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  t compiler warni
26e80 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64  ngs about unused
26e90 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
26ea0 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
26eb0 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b 0a  ETER(isDelete);.
26ec0 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68  .  /* Usually th
26ed0 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65  e path zFilename
26ee0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
26ef0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
26f00 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63  me. The.  ** exc
26f10 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f  eption is when o
26f20 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79  pening the proxy
26f30 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e   "conch" file in
26f40 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a   builds that.  *
26f50 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70  * include the sp
26f60 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b  ecial Apple lock
26f70 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f  ing styles..  */
26f80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
26f90 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
26fa0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
26fb0 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28  _STYLE.  assert(
26fc0 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
26fd0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27   zFilename[0]=='
26fe0 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d  /' .    || pVfs-
26ff0 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64  >pAppData==(void
27000 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
27010 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61  der );.#else.  a
27020 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
27030 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
27040 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64  [0]=='/' );.#end
27050 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
27060 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
27070 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
27080 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20  ));.  pNew->h = 
27090 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64  h;.  pNew->dirfd
270a0 20 3d 20 64 69 72 66 64 3b 0a 20 20 70 4e 65 77   = dirfd;.  pNew
270b0 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  ->zPath = zFilen
270c0 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d  ame;.  if( memcm
270d0 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75  p(pVfs->zName,"u
270e0 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30  nix-excl",10)==0
270f0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
27100 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58 46 49  rlFlags = UNIXFI
27110 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c 73 65  LE_EXCL;.  }else
27120 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
27130 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  Flags = 0;.  }. 
27140 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c 79 20   if( isReadOnly 
27150 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
27160 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
27170 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  LE_RDONLY;.  }..
27180 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
27190 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
271a0 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
271b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
271c0 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
271d0 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b  .    noLock = 1;
271e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
271f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
27200 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  if..  if( noLock
27210 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
27220 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
27230 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
27240 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
27250 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
27260 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
27270 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
27280 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
27290 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
272a0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
272b0 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
272c0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
272d0 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
272e0 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
272f0 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
27300 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
27310 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
27320 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
27330 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
27340 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
27350 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
27360 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
27370 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
27380 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
27390 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
273a0 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
273b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
273c0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
273d0 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
273e0 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
273f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
27400 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
27410 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
27420 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
27430 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
27440 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20  .#endif.  ){.   
27450 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
27460 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
27470 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
27480 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
27490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
274a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
274b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
274c0 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  cured in findIno
274d0 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
274e0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
274f0 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
27500 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
27510 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
27520 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
27530 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
27540 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
27550 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
27560 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
27570 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
27580 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
27590 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
275a0 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
275b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
275c0 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
275d0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
275e0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
275f0 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
27600 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
27610 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
27620 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
27630 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
27640 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
27650 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
27660 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
27670 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
27680 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
27690 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
276a0 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
276b0 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
276c0 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
276d0 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
276e0 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
276f0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
27700 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
27710 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
27720 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
27730 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
27740 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
27750 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
27760 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
27770 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
27780 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
27790 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
277a0 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
277b0 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
277c0 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
277d0 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
277e0 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
277f0 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
27800 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
27810 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
27820 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27830 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
27840 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
27850 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
27860 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
27870 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
27880 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
27890 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
278a0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
278b0 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
278c0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
278d0 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
278e0 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
278f0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
27900 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
27910 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
27920 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
27930 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
27940 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
27950 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
27960 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
27970 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
27980 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
27990 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
279a0 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
279b0 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
279c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
279d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
279e0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
279f0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
27a00 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
27a10 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
27a20 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
27a30 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
27a40 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
27a50 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
27a60 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
27a70 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
27a80 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
27a90 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
27aa0 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
27ab0 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
27ac0 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
27ad0 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
27ae0 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
27af0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
27b00 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
27b10 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
27b20 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
27b30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27b40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
27b50 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
27b60 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
27b70 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
27b80 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
27b90 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
27ba0 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
27bb0 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
27bc0 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
27bd0 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
27be0 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
27bf0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
27c00 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
27c10 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
27c20 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
27c30 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
27c40 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
27c50 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
27c60 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
27c70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
27c80 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
27c90 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
27ca0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
27cb0 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
27cc0 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
27cd0 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
27ce0 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
27cf0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
27d00 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (nFilename);.   
27d10 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d   if( zLockFile==
27d20 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
27d30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
27d50 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
27d60 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
27d70 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
27d80 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
27d90 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
27da0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
27db0 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
27dc0 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
27dd0 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
27de0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
27df0 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
27e00 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
27e10 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
27e20 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
27e30 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
27e40 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
27e50 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
27e60 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
27e70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
27e80 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
27e90 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
27ea0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
27eb0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
27ec0 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
27ed0 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e  K) && (pNew->pIn
27ee0 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  ode->pSem==NULL)
27ef0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
27f00 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
27f10 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
27f20 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
27f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
27f40 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
27f50 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
27f60 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f80 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
27f90 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
27fa0 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
27fb0 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
27fc0 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
27fd0 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
27fe0 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
27ff0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49  ;.      pNew->pI
28000 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  node->pSem = sem
28010 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
28020 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
28030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
28040 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
28050 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
28060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
28070 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
28080 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
28090 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20  ->aSemName[0] = 
280a0 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20  '\0';.      }.  
280b0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
280c0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
280d0 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e  ndif.  .  pNew->
280e0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23  lastErrno = 0;.#
280f0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
28100 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28110 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
28120 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
28130 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
28140 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  __);.    h = -1;
28150 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
28160 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65  ename);.    isDe
28170 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lete = 0;.  }.  
28180 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d  pNew->isDelete =
28190 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69   isDelete;.#endi
281a0 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
281b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
281c0 20 64 69 72 66 64 3e 3d 30 20 29 20 72 6f 62 75   dirfd>=0 ) robu
281d0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 64  st_close(pNew, d
281e0 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
281f0 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
28200 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
28210 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
28220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
28230 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
28240 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
28250 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
28260 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28270 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
28280 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
28290 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
282a0 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
282b0 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
282c0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
282d0 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
282e0 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
282f0 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
28300 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
28310 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
28320 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
28330 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
28340 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
28350 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
28360 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
28370 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
28380 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
28390 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
283a0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
283b0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
283c0 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
283d0 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
283e0 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
283f0 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
28400 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
28410 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
28420 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
28430 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
28440 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
28450 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
28460 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
28470 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
28480 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
28490 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
284a0 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
284b0 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e  e);.  for(ii=(in
284c0 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  t)strlen(zDirnam
284d0 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72  e); ii>1 && zDir
284e0 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
284f0 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
28500 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
28510 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  [ii] = '\0';.   
28520 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
28530 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44  n(zDirname, O_RD
28540 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30  ONLY|O_BINARY, 0
28550 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  );.    if( fd>=0
28560 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c   ){.#ifdef FD_CL
28570 4f 45 58 45 43 0a 20 20 20 20 20 20 6f 73 46 63  OEXEC.      osFc
28580 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
28590 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
285a0 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
285b0 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
285c0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
285d0 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e  PENDIR %-3d %s\n
285e0 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  ", fd, zDirname)
285f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
28600 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75  pFd = fd;.  retu
28610 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45  rn (fd>=0?SQLITE
28620 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72  _OK:unixLogError
28630 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
28640 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
28650 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a  Dirname));.}../*
28660 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
28670 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
28680 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
28690 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
286a0 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
286b0 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
286c0 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
286d0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
286e0 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
286f0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
28700 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
28710 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
28720 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
28730 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
28740 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
28750 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
28760 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
28770 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20  "/tmp",.     0  
28780 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
28790 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b  rminator */.  };
287a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
287b0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
287c0 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
287d0 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20  ar *zDir = 0;.. 
287e0 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
287f0 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
28800 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  ory;.  if( !azDi
28810 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
28820 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
28830 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  IR");.  for(i=0;
28840 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
28850 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
28860 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
28870 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20  [i++]){.    if( 
28880 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
28890 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74  ue;.    if( osSt
288a0 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29  at(zDir, &buf) )
288b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
288c0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
288d0 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
288e0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41  nue;.    if( osA
288f0 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20  ccess(zDir, 07) 
28900 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
28910 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
28920 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zDir;.}../*.
28930 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
28940 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
28950 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
28960 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
28970 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
28980 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
28990 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
289a0 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
289b0 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
289c0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
289d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
289e0 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
289f0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
28a00 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
28a10 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
28a20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
28a30 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
28a40 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
28a50 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
28a60 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
28a70 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
28a80 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
28a90 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
28aa0 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74   *zDir;..  /* It
28ab0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
28ac0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
28ad0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
28ae0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
28af0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
28b00 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
28b10 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
28b20 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
28b30 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
28b40 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
28b50 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
28b60 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
28b70 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
28b80 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
28b90 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
28ba0 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20  Dir==0 ) zDir = 
28bb0 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ".";..  /* Check
28bc0 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
28bd0 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
28be0 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
28bf0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
28c00 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
28c10 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
28c20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
28c30 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
28c40 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
28c50 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
28c60 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e  _PREFIX) + 17) >
28c70 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
28c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28c90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
28ca0 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
28cb0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
28cc0 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  17, zBuf, "%s/"S
28cd0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
28ce0 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
28cf0 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
28d00 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
28d10 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
28d20 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
28d30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
28d40 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
28d50 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
28d60 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
28d70 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
28d80 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
28d90 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
28da0 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
28db0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63  ;.  }while( osAc
28dc0 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
28dd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
28de0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
28df0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
28e00 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
28e10 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
28e20 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f  /*.** Routine to
28e30 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69   transform a uni
28e40 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f  xFile into a pro
28e50 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46  xy-locking unixF
28e60 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ile..** Implemen
28e70 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72  tation in the pr
28e80 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f  oxy-lock divisio
28e90 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75  n, but used by u
28ea0 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20  nixOpen().** if 
28eb0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
28ec0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64  OXY_LOCKING is d
28ed0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
28ee0 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
28ef0 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
28f00 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68  xFile*, const ch
28f10 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ar*);.#endif../*
28f20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
28f30 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
28f40 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61  scriptor that wa
28f50 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
28f60 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
28f70 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
28f80 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   or master-journ
28f90 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66  al file) identif
28fa0 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a  ied by pathname.
28fb0 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51  ** zPath with SQ
28fc0 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
28fd0 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f  ags matching tho
28fe0 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
28ff0 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
29000 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
29010 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68  tion..**.** Such
29020 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
29030 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20  or may exist if 
29040 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
29050 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64  ction was closed
29060 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f  .** but the asso
29070 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63  ciated file desc
29080 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74  riptor could not
29090 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75   be closed becau
290a0 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  se some.** other
290b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
290c0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
290d0 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e  e file is holdin
290e0 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a  g a file-lock..*
290f0 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65  * Refer to comme
29100 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43  nts in the unixC
29110 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  lose() function 
29120 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20  and the lengthy 
29130 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72  comment.** descr
29140 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76  ibing "Posix Adv
29150 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61  isory Locking" a
29160 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
29170 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  his file for .**
29180 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73   further details
29190 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23  . Also, ticket #
291a0 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  4018..**.** If a
291b0 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64   suitable file d
291c0 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75  escriptor is fou
291d0 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72  nd, then it is r
291e0 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a  eturned. If no.*
291f0 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  * such file desc
29200 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65  riptor is locate
29210 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
29220 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69  d..*/.static Uni
29230 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52  xUnusedFd *findR
29240 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20  eusableFd(const 
29250 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
29260 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55   flags){.  UnixU
29270 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
29280 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e   = 0;..  /* Do n
29290 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e  ot search for an
292a0 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
292b0 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72  criptor on vxwor
292c0 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a  ks. Not because.
292d0 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75    ** vxworks wou
292e0 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66  ld not benefit f
292f0 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28  rom the change (
29300 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20  it might, we're 
29310 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20  not sure),.  ** 
29320 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77  but because no w
29330 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73  ay to test it is
29340 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
29350 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74  able. It is bett
29360 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  er .  ** not to 
29370 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78  risk breaking vx
29380 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f  works support fo
29390 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75  r the sake of su
293a0 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20  ch an obscure . 
293b0 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f   ** feature.  */
293c0 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
293d0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
293e0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
293f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
29400 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c  ts of stat() cal
29410 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61  l */..  /* A sta
29420 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69  t() call may fai
29430 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65  l for various re
29440 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68  asons. If this h
29450 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20  appens, it is.  
29460 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ** almost certai
29470 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29  n that an open()
29480 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d   call on the sam
29490 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f  e path will also
294a0 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20   fail..  ** For 
294b0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20  this reason, if 
294c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
294d0 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61  in the stat() ca
294e0 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20  ll here, it is. 
294f0 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   ** ignored and 
29500 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  -1 is returned. 
29510 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
29520 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  try to open a ne
29530 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  w file.  ** desc
29540 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61  riptor on the sa
29550 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61  me path, fail, a
29560 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
29570 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20  or to SQLite..  
29580 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20  **.  ** Even if 
29590 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65  a subsequent ope
295a0 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75  n() call does su
295b0 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65  cceed, the conse
295c0 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20  quences of.  ** 
295d0 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f  not searching fo
295e0 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66 69  r a resusable fi
295f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
29600 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
29610 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50    if( 0==stat(zP
29620 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ath, &sStat) ){.
29630 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66      unixInodeInf
29640 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20  o *pInode;..    
29650 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
29660 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ;.    pInode = i
29670 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
29680 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
29690 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
296a0 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
296b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
296c0 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
296d0 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
296e0 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
296f0 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
29700 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
29710 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
29720 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
29730 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
29740 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
29750 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
29760 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
29770 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
29780 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
29790 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
297a0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
297b0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
297c0 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
297d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
297e0 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
297f0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
29800 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
29810 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
29820 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
29830 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
29840 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
29850 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  by unixOpen() to
29860 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
29870 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  nix permissions.
29880 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ** to create new
29890 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20   files with. If 
298a0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
298b0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
298c0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
298d0 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61  nd a value suita
298e0 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20  ble for passing 
298f0 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
29900 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29  ument to open(2)
29910 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74   is.** written t
29920 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20  o *pMode. If an 
29930 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
29940 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
29950 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
29960 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
29970 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73  lue of *pMode is
29980 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   not modified..*
29990 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
299a0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
299b0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
299c0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
299d0 63 72 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  created with.** 
299e0 74 68 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73  the octal permis
299f0 73 69 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64  sions 0600 (read
29a00 2f 77 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e  /writable by own
29a10 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65  er only). If the
29a20 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61   file.** is a da
29a30 74 61 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72  tabase or master
29a40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69   journal file, i
29a50 74 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  t is created wit
29a60 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
29a70 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54  s .** mask SQLIT
29a80 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
29a90 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a  ERMISSIONS..**.*
29aa0 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68  * Finally, if th
29ab0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
29ac0 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
29ad0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
29ae0 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
29af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
29b00 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
29b10 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
29b20 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
29b30 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
29b40 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
29b50 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
29b60 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
29b70 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
29b80 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
29b90 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
29ba0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
29bb0 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
29bc0 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
29bd0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
29be0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
29bf0 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
29c00 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74  LE_8_3_NAMES opt
29c10 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
29c20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67  then the.** orig
29c30 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
29c40 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42   unavailable.  B
29c50 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  ut 8_3_NAMES is 
29c60 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
29c70 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73   FAT filesystems
29c80 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
29c90 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74   do not matter t
29ca0 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73  here, so just us
29cb0 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  e.** the default
29cc0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f   permissions..*/
29cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
29ce0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a  CreateFileMode(.
29cf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
29d00 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
29d10 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c    /* Path of fil
29d20 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69  e (possibly) bei
29d30 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  ng created */.  
29d40 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
29d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d60 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
29d70 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  as 4th argument 
29d80 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  to xOpen() */.  
29d90 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20 20 20  mode_t *pMode   
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29db0 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
29dc0 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ons to open file
29dd0 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e   with */.){.  in
29de0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29e00 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
29e10 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49 54    *pMode = SQLIT
29e20 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
29e30 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 69 66  ERMISSIONS;.  if
29e40 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
29e50 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
29e60 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
29e70 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NAL) ){.    char
29e80 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
29e90 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
29ea0 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
29eb0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ed0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29ee0 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
29ef0 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75   zDb */.    stru
29f00 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
29f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
29f20 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
29f30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
29f40 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20  /..    /* zPath 
29f50 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57  is a path to a W
29f60 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  AL or journal fi
29f70 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
29f80 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a  g block derives.
29f90 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20      ** the path 
29fa0 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
29fb0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
29fc0 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73  from zPath. This
29fd0 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20   block handles. 
29fe0 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
29ff0 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65  ing naming conve
2a000 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20  ntions:.    **. 
2a010 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2a020 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20  o db>-journal". 
2a030 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2a040 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a  o db>-wal".    *
2a050 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2a060 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20  >-journalNN".   
2a070 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2a080 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a  db>-walNN".    *
2a090 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
2a0a0 4e 20 69 73 20 61 20 34 20 64 69 67 69 74 20 64  N is a 4 digit d
2a0b0 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54  ecimal number. T
2a0c0 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68  he NN naming sch
2a0d0 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  emes are .    **
2a0e0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
2a0f0 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f  t_multiplex.c mo
2a100 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dule..    */.   
2a110 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74   nDb = sqlite3St
2a120 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20  rlen30(zPath) - 
2a130 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  1; .    while( n
2a140 44 62 3e 30 20 26 26 20 7a 50 61 74 68 5b 6e 44  Db>0 && zPath[nD
2a150 62 5d 21 3d 27 2d 27 20 29 20 6e 44 62 2d 2d 3b  b]!='-' ) nDb--;
2a160 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20  .    if( nDb==0 
2a170 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2a180 4f 4b 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  OK;.    memcpy(z
2a190 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
2a1a0 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
2a1b0 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30  '\0';..    if( 0
2a1c0 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26 73 53 74  ==stat(zDb, &sSt
2a1d0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d  at) ){.      *pM
2a1e0 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d  ode = sStat.st_m
2a1f0 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20  ode & 0777;.    
2a200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2a210 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
2a220 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  STAT;.    }.  }e
2a230 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
2a240 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2a250 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20  TEONCLOSE ){.   
2a260 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a   *pMode = 0600;.
2a270 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
2a290 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
2a2a0 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
2a2b0 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
2a2c0 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
2a2d0 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
2a2e0 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
2a2f0 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
2a300 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
2a310 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
2a320 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
2a330 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
2a340 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
2a350 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
2a360 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
2a370 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
2a380 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
2a390 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
2a3a0 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
2a3b0 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
2a3c0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
2a3d0 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
2a3e0 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
2a3f0 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
2a400 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
2a410 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
2a420 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
2a430 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
2a440 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
2a450 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
2a460 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
2a470 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
2a480 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
2a490 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
2a4a0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
2a4b0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
2a4c0 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
2a4d0 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
2a4e0 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
2a4f0 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
2a500 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
2a510 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
2a520 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
2a530 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
2a540 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
2a550 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
2a560 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2a570 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
2a580 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2a590 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
2a5a0 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
2a5b0 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  s the xOpen meth
2a5c0 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
2a5d0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2a5e0 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
2a5f0 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f   of file to be o
2a600 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
2a610 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
2a620 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
2a630 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2a640 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a  o be filled in *
2a650 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20   /* Input flags 
2a680 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f  to control the o
2a690 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  pening */.  int 
2a6a0 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
2a6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2a6c0 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  ut flags returne
2a6d0 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65  d to SQLite core
2a6e0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
2a6f0 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
2a700 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
2a710 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
2a720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a730 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
2a740 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
2a750 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20   */.  int dirfd 
2a760 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
2a770 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
2a780 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
2a790 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  r */.  int openF
2a7a0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
2a7b0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
2a7c0 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
2a7d0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
2a7e0 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
2a7f0 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
2a800 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2a810 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a830 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
2a840 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
2a850 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
2a860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a870 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
2a880 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
2a890 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
2a8a0 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
2a8b0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
2a8c0 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
2a8d0 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
2a8e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2a8f0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2a900 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
2a910 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
2a920 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
2a930 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
2a940 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
2a950 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2a960 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
2a970 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
2a980 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2a990 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
2a9a0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2a9b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2a9c0 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  E.  int isAutoPr
2a9d0 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
2a9e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
2a9f0 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 0a  PROXY);.#endif..
2aa00 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
2aa10 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
2aa20 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
2aa30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2aa40 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
2aa50 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
2aa60 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
2aa70 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
2aa80 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
2aa90 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
2aaa0 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
2aab0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
2aac0 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
2aad0 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
2aae0 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72  .  int isOpenDir
2aaf0 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61  ectory = (isCrea
2ab00 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
2ab10 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ab20 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2ab30 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2ab40 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2ab50 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
2ab60 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2ab70 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
2ab80 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
2ab90 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
2aba0 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
2abb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
2abc0 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
2abd0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
2abe0 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
2abf0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
2ac00 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
2ac10 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
2ac20 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
2ac30 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E+1];.  const ch
2ac40 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74  ar *zName = zPat
2ac50 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  h;..  /* Check t
2ac60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
2ac70 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
2ac80 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
2ac90 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
2aca0 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
2acb0 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
2acc0 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
2acd0 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
2ace0 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
2acf0 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
2ad00 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2ad10 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
2ad20 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
2ad30 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
2ad40 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2ad50 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
2ad60 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
2ad70 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
2ad80 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
2ad90 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
2ada0 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
2adb0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
2adc0 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
2add0 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
2ade0 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
2adf0 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
2ae00 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
2ae10 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
2ae20 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
2ae30 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
2ae40 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
2ae50 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
2ae60 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
2ae70 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
2ae80 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
2ae90 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
2aea0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2aeb0 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
2aec0 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
2aed0 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
2aee0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
2aef0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2af00 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2af10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
2af20 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
2af30 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2af40 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2af50 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2af60 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
2af70 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2af80 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2af90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2afa0 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
2afb0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2afc0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2afd0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2afe0 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
2aff0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
2b000 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
2b010 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
2b020 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
2b030 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
2b040 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2b050 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
2b060 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2b070 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
2b080 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2b090 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2b0a0 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
2b0b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
2b0c0 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
2b0d0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2b0e0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2b0f0 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
2b100 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2b110 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
2b120 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2b130 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
2b140 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
2b150 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
2b160 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70    );..  memset(p
2b170 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
2b180 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65  File));..  if( e
2b190 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2b1a0 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
2b1b0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2b1c0 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75  Unused;.    pUnu
2b1d0 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
2b1e0 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  leFd(zName, flag
2b1f0 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75  s);.    if( pUnu
2b200 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20  sed ){.      fd 
2b210 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
2b220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b230 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2b240 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2b250 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2b260 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
2b270 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2b280 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b2a0 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55   p->pUnused = pU
2b2b0 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69  nused;.  }else i
2b2c0 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
2b2d0 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2b2e0 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
2b2f0 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
2b300 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
2b310 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
2b320 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
2b330 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  enDirectory);.  
2b340 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65    rc = unixGetTe
2b350 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e  mpname(MAX_PATHN
2b360 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29  AME+1, zTmpname)
2b370 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2b380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b390 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b3a0 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54  }.    zName = zT
2b3b0 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
2b3c0 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
2b3d0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61  value of the fla
2b3e0 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  gs parameter pas
2b3f0 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e  sed to POSIX fun
2b400 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28  ction.  ** open(
2b410 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65  ). These must be
2b420 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e   calculated even
2b430 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f   if open() is no
2b440 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a  t called, as.  *
2b450 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74  * they may be st
2b460 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
2b470 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
2b480 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20  and used by the 
2b490 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c  .  ** 'conch fil
2b4a0 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74  e' locking funct
2b4b0 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20  ions later on.  
2b4c0 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  */.  if( isReado
2b4d0 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73  nly )  openFlags
2b4e0 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
2b4f0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
2b500 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f  ) openFlags |= O
2b510 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43  _RDWR;.  if( isC
2b520 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46  reate )    openF
2b530 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b  lags |= O_CREAT;
2b540 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
2b550 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  ve ) openFlags |
2b560 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  = (O_EXCL|O_NOFO
2b570 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61  LLOW);.  openFla
2b580 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49  gs |= (O_LARGEFI
2b590 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20  LE|O_BINARY);.. 
2b5a0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2b5b0 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65   mode_t openMode
2b5c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b5d0 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  * Permissions to
2b5e0 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74   create file wit
2b5f0 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69  h */.    rc = fi
2b600 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
2b610 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26  (zName, flags, &
2b620 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 69  openMode);.    i
2b630 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b640 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2b650 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b  ( !p->pUnused );
2b660 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2b670 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2b680 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  N_WAL || eType==
2b690 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2b6a0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20  _JOURNAL );.    
2b6b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b6c0 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75   }.    fd = robu
2b6d0 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2b6e0 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2b6f0 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  de);.    OSTRACE
2b700 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
2b710 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
2b720 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
2b730 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
2b740 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52  && errno!=EISDIR
2b750 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20   && isReadWrite 
2b760 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
2b770 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  ){.      /* Fail
2b780 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ed to open the f
2b790 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ile for read/wri
2b7a0 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72  te access. Try r
2b7b0 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  ead-only. */.   
2b7c0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
2b7d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2b7e0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2b7f0 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f  CREATE);.      o
2b800 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f  penFlags &= ~(O_
2b810 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20  RDWR|O_CREAT);. 
2b820 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
2b830 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2b840 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  LY;.      openFl
2b850 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
2b860 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
2b870 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20  y = 1;.      fd 
2b880 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
2b890 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
2b8a0 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
2b8b0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
2b8c0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
2b8d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2b8e0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
2b8f0 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  open", zName);. 
2b900 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2b910 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
2b920 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e   }.  assert( fd>
2b930 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74  =0 );.  if( pOut
2b940 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f  Flags ){.    *pO
2b950 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  utFlags = flags;
2b960 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70  .  }..  if( p->p
2b970 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d  Unused ){.    p-
2b980 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66  >pUnused->fd = f
2b990 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  d;.    p->pUnuse
2b9a0 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  d->flags = flags
2b9b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44  ;.  }..  if( isD
2b9c0 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f  elete ){.#if OS_
2b9d0 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74  VXWORKS.    zPat
2b9e0 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65  h = zName;.#else
2b9f0 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d  .    unlink(zNam
2ba00 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
2ba10 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2ba20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2ba30 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
2ba40 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
2ba50 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
2ba60 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72  .  if( isOpenDir
2ba70 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63  ectory ){.    rc
2ba80 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79   = openDirectory
2ba90 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b  (zPath, &dirfd);
2baa0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2bab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bac0 2f 2a 20 49 74 20 69 73 20 73 61 66 65 20 74 6f  /* It is safe to
2bad0 20 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68 69   close fd at thi
2bae0 73 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73 65  s point, because
2baf0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2bb00 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74  d not.      ** t
2bb10 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64  o be open on a d
2bb20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2bb30 20 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e   it were open on
2bb40 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2bb50 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77 6f  ,.      ** it wo
2bb60 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
2bb70 74 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69 73  to close as this
2bb80 20 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20 61   would release a
2bb90 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20  ny locks held.  
2bba0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69      ** on the fi
2bbb0 6c 65 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  le by this proce
2bbc0 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  ss.  */.      as
2bbd0 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c  sert( eType!=SQL
2bbe0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2bbf0 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   );.      robust
2bc00 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
2bc10 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 67  LINE__);.      g
2bc20 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
2bc30 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  d;.    }.  }..#i
2bc40 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
2bc50 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
2bc60 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66  SETFD, osFcntl(f
2bc70 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  d, F_GETFD, 0) |
2bc80 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
2bc90 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
2bca0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2bcb0 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
2bcc0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2bcd0 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
2bce0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2bcf0 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20  _STYLE.  struct 
2bd00 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
2bd10 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
2bd20 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
2bd30 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
2bd40 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45  e*)pFile)->lastE
2bd50 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2bd60 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29    if( dirfd>=0 )
2bd70 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
2bd80 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
2bd90 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  );.    robust_cl
2bda0 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
2bdb0 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E__);.    return
2bdc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2bdd0 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  CESS;.  }.  if (
2bde0 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73  0 == strncmp("ms
2bdf0 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  dos", fsInfo.f_f
2be00 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
2be10 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2be20 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
2be30 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
2be40 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
2be50 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
2be60 63 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73 49  cmp("exfat", fsI
2be70 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2be80 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
2be90 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2bea0 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
2beb0 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
2bec0 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  OS;.  }.#endif. 
2bed0 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
2bee0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2bef0 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45  E.#if SQLITE_PRE
2bf00 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2bf10 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20  G.  isAutoProxy 
2bf20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 1;.#endif.  if
2bf30 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26  ( isAutoProxy &&
2bf40 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26   (zPath!=NULL) &
2bf50 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70  & (!noLock) && p
2bf60 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20  Vfs->xOpen ){.  
2bf70 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65    char *envforce
2bf80 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
2bf90 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2bfa0 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74  CKING");.    int
2bfb0 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a   useProxy = 0;..
2bfc0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
2bfd0 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
2bfe0 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65  G==1 means force
2bff0 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78   always use prox
2c000 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20  y, 0 means .    
2c010 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f  ** never use pro
2c020 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75  xy, NULL means u
2c030 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e  se proxy for non
2c040 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c  -local files onl
2c050 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  y.  */.    if( e
2c060 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b  nvforce!=NULL ){
2c070 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
2c080 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29  = atoi(envforce)
2c090 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >0;.    }else{. 
2c0a0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2c0b0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20  fs fsInfo;.     
2c0c0 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
2c0d0 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
2c0e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
2c0f0 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
2c100 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73  lose(fd) call is
2c110 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66   sub-optimal. If
2c120 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
2c130 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
2c140 20 66 64 20 69 73 20 61 20 64 61 74 61 62 61 73   fd is a databas
2c150 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  e file, and ther
2c160 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e  e are other conn
2c170 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20  ections open.   
2c180 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20       ** on that 
2c190 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 63 75  file that are cu
2c1a0 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20  rrently holding 
2c1b0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f  advisory locks o
2c1c0 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  n it,.        **
2c1d0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74   then the call t
2c1e0 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63  o close() will c
2c1f0 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b  ancel those lock
2c200 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a  s. In practice,.
2c210 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65          ** we're
2c220 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73   assuming that s
2c230 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20  tatfs() doesn't 
2c240 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e  fail very often.
2c250 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   At least.      
2c260 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f    ** not while o
2c270 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
2c280 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20  ptors opened by 
2c290 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
2c2a0 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   on.        ** t
2c2b0 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65  he same file are
2c2c0 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20   working.  */.  
2c2d0 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72        p->lastErr
2c2e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2c2f0 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30      if( dirfd>=0
2c300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 6f   ){.          ro
2c310 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 64 69  bust_close(p, di
2c320 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
2c330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c340 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2c350 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2c360 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2c370 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
2c380 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  S;.        goto 
2c390 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
2c3a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65       }.      use
2c3b0 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
2c3c0 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
2c3d0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
2c3e0 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
2c3f0 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
2c400 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
2c410 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c  d, dirfd, pFile,
2c420 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a   zPath, noLock,.
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 20 20 20 20 20 20 20 20 20 20 69 73 44 65 6c 65            isDele
2c450 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b  te, isReadonly);
2c460 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2c470 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c480 20 20 20 20 2f 2a 20 63 61 63 68 65 20 74 68 65      /* cache the
2c490 20 70 4d 65 74 68 6f 64 20 69 6e 20 63 61 73 65   pMethod in case
2c4a0 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 20 66   the transform f
2c4b0 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ails */.        
2c4c0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
2c4d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c4e0 2a 70 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65  *pMethod = pFile
2c4f0 2d 3e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ->pMethods;.    
2c500 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
2c510 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
2c520 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
2c530 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
2c540 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c560 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
2c570 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
2c580 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
2c590 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
2c5a0 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
2c5b0 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
2c5c0 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
2c5d0 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
2c5e0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
2c5f0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
2c600 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
2c610 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
2c620 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
2c630 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
2c640 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c650 20 20 20 69 66 28 20 70 4d 65 74 68 6f 64 21 3d     if( pMethod!=
2c660 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
2c670 20 20 20 20 70 4d 65 74 68 6f 64 2d 3e 78 43 6c      pMethod->xCl
2c680 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ose(pFile);.    
2c690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c6a0 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f           unixClo
2c6b0 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
2c6c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c6d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2c6e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c6f0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2c700 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
2c710 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63  }.#endif.  .  rc
2c720 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
2c730 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66  e(pVfs, fd, dirf
2c740 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
2c750 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20   noLock,.       
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2c770 73 44 65 6c 65 74 65 2c 20 69 73 52 65 61 64 6f  sDelete, isReado
2c780 6e 6c 79 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73  nly);.open_finis
2c790 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  hed:.  if( rc!=S
2c7a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c7b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
2c7c0 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20  pUnused);.  }.  
2c7d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2c7e0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
2c7f0 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49  file at zPath. I
2c800 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72  f the dirSync ar
2c810 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
2c820 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64  fsync().** the d
2c830 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64  irectory after d
2c840 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
2c850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c860 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71  unixDelete(.  sq
2c870 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2c880 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63  ed,     /* VFS c
2c890 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61  ontaining this a
2c8a0 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65  s the xDelete me
2c8b0 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
2c8c0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2c8d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
2c8e0 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
2c8f0 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79  d */.  int dirSy
2c900 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
2c910 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79   /* If true, fsy
2c920 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61  nc() directory a
2c930 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69  fter deleting fi
2c940 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
2c950 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c960 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2c970 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
2c980 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
2c990 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2c9a0 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28  R_DELETE);.  if(
2c9b0 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d   unlink(zPath)==
2c9c0 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45  (-1) && errno!=E
2c9d0 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74  NOENT ){.    ret
2c9e0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
2c9f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
2ca00 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20  LETE, "unlink", 
2ca10 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e  zPath);.  }.#ifn
2ca20 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2ca30 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28  LE_DIRSYNC.  if(
2ca40 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20   dirSync ){.    
2ca50 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d  int fd;.    rc =
2ca60 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a   openDirectory(z
2ca70 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20  Path, &fd);.    
2ca80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ca90 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  K ){.#if OS_VXWO
2caa0 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73  RKS.      if( fs
2cab0 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65  ync(fd)==-1 ).#e
2cac0 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73  lse.      if( fs
2cad0 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66  ync(fd) ).#endif
2cae0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2caf0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2cb00 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
2cb10 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e  DIR_FSYNC, "fsyn
2cb20 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  c", zPath);.    
2cb30 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74    }.      robust
2cb40 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
2cb50 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
2cb60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2cb70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2cb80 54 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e  Test the existan
2cb90 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20  ce of or access 
2cba0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66  permissions of f
2cbb0 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a  ile zPath. The.*
2cbc0 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64  * test performed
2cbd0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
2cbe0 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a  value of flags:.
2cbf0 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
2cc00 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20  _ACCESS_EXISTS: 
2cc10 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2cc20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20  file exists.**  
2cc30 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
2cc40 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75  _READWRITE: Retu
2cc50 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
2cc60 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69   is read and wri
2cc70 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51  table..**     SQ
2cc80 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
2cc90 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69  ONLY: Return 1 i
2cca0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
2ccb0 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  adable..**.** Ot
2ccc0 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30  herwise return 0
2ccd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cce0 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71  unixAccess(.  sq
2ccf0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2cd00 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53  ed,   /* The VFS
2cd10 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
2cd20 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20   xAccess method 
2cd30 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2cd40 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20  *zPath,      /* 
2cd50 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65  Path of the file
2cd60 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20   to examine */. 
2cd70 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2cd80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
2cd90 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c   do we want to l
2cda0 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a  earn about the z
2cdb0 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20  Path file? */.  
2cdc0 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
2cdd0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2cde0 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20   result boolean 
2cdf0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2ce00 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e   amode = 0;.  UN
2ce10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2ce20 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c  otUsed);.  Simul
2ce30 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2ce40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2ce50 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69  ACCESS; );.  swi
2ce60 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
2ce70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
2ce80 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
2ce90 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b     amode = F_OK;
2cea0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ceb0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
2cec0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
2ced0 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f        amode = W_
2cee0 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62  OK|R_OK;.      b
2cef0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2cf00 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2cf10 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  D:.      amode =
2cf20 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   R_OK;.      bre
2cf30 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
2cf40 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
2cf50 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
2cf60 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
2cf70 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41   *pResOut = (osA
2cf80 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f  ccess(zPath, amo
2cf90 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66  de)==0);.  if( f
2cfa0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
2cfb0 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70  ESS_EXISTS && *p
2cfc0 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74  ResOut ){.    st
2cfd0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
2cfe0 20 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a     if( 0==stat(z
2cff0 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62  Path, &buf) && b
2d000 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
2d010 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20  .      *pResOut 
2d020 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2d030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d040 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
2d050 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
2d060 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
2d070 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
2d080 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
2d090 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
2d0a0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
2d0b0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
2d0c0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
2d0d0 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
2d0e0 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
2d0f0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
2d100 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
2d110 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
2d120 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
2d130 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
2d140 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
2d150 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
2d160 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
2d170 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
2d180 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
2d190 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
2d1a0 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
2d1b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2d1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2d1d0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
2d1e0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2d1f0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
2d200 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
2d210 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
2d220 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
2d230 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
2d240 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2d250 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
2d260 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
2d270 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
2d280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d290 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
2d2a0 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
2d2b0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
2d2c0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
2d2d0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
2d2e0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
2d2f0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
2d300 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
2d310 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
2d320 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
2d330 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
2d340 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
2d350 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
2d360 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
2d370 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
2d380 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
2d390 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
2d3a0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
2d3b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2d3c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2d3d0 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
2d3e0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
2d3f0 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
2d400 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2d410 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
2d420 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
2d430 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
2d440 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
2d450 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2d460 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
2d470 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
2d480 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
2d490 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  d;.    if( osGet
2d4a0 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  cwd(zOut, nOut-1
2d4b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
2d4c0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
2d4d0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2d4e0 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
2d4f0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
2d500 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
2d510 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
2d520 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2d530 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
2d540 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
2d550 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
2d560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d570 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
2d580 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
2d590 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
2d5a0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
2d5b0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
2d5c0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
2d5d0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
2d5e0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
2d5f0 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
2d600 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
2d610 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
2d620 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
2d630 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
2d640 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
2d650 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
2d660 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2d670 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
2d680 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2d690 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
2d6a0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
2d6b0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
2d6c0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
2d6d0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
2d6e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
2d6f0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
2d700 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
2d710 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
2d720 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
2d730 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
2d740 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
2d750 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
2d760 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
2d770 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
2d780 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
2d790 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
2d7a0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
2d7b0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
2d7c0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
2d7d0 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
2d7e0 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
2d7f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
2d800 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
2d810 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
2d820 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2d830 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2d840 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
2d850 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
2d860 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d870 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
2d880 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2d890 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
2d8a0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
2d8b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2d8c0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
2d8d0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
2d8e0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
2d8f0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
2d900 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
2d910 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
2d920 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
2d930 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
2d940 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
2d950 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
2d960 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
2d970 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
2d980 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
2d990 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
2d9a0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
2d9b0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
2d9c0 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
2d9d0 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
2d9e0 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
2d9f0 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
2da00 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
2da10 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
2da20 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
2da30 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
2da40 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
2da50 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
2da60 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
2da70 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
2da80 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
2da90 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
2daa0 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
2dab0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
2dac0 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
2dad0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
2dae0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2daf0 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
2db00 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
2db10 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
2db20 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
2db30 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
2db40 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
2db50 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
2db60 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
2db70 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
2db80 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
2db90 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
2dba0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
2dbb0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
2dbc0 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
2dbd0 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
2dbe0 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
2dbf0 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
2dc00 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
2dc10 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
2dc20 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
2dc30 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
2dc40 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
2dc50 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
2dc60 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
2dc70 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
2dc80 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
2dc90 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
2dca0 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
2dcb0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
2dcc0 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
2dcd0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2dce0 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
2dcf0 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
2dd00 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
2dd10 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
2dd20 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
2dd30 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2dd40 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
2dd50 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2dd60 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
2dd70 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2dd80 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2dd90 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
2dda0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
2ddb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2ddc0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
2ddd0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
2dde0 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
2ddf0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2de00 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
2de10 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
2de20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
2de30 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
2de40 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
2de50 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
2de60 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
2de70 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
2de80 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
2de90 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
2dea0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
2deb0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
2dec0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2ded0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2dee0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
2def0 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
2df00 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
2df10 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
2df20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
2df30 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
2df40 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
2df50 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
2df60 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
2df70 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
2df80 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
2df90 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
2dfa0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
2dfb0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
2dfc0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
2dfd0 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
2dfe0 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
2dff0 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
2e000 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
2e010 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
2e020 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
2e030 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
2e040 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
2e050 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
2e060 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
2e070 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
2e080 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
2e090 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
2e0a0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
2e0b0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
2e0c0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
2e0d0 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
2e0e0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
2e0f0 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
2e100 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
2e110 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
2e120 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
2e130 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
2e140 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
2e150 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
2e160 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
2e170 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
2e180 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
2e190 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
2e1a0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
2e1b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2e1c0 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20  TE_TEST).  {.   
2e1d0 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20   int pid, fd;.  
2e1e0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
2e1f0 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
2e200 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b  ", O_RDONLY, 0);
2e210 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
2e220 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
2e230 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
2e240 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
2e250 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
2e260 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
2e270 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
2e280 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
2e290 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
2e2a0 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
2e2b0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
2e2c0 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29  f(t)+sizeof(pid)
2e2d0 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  <=(size_t)nBuf )
2e2e0 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73  ;.      nBuf = s
2e2f0 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f  izeof(t) + sizeo
2e300 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pid);.    }els
2e310 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42 75  e{.      do{ nBu
2e320 66 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a  f = osRead(fd, z
2e330 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69  Buf, nBuf); }whi
2e340 6c 65 28 20 6e 42 75 66 3c 30 20 26 26 20 65 72  le( nBuf<0 && er
2e350 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
2e360 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2e370 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
2e380 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
2e390 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  dif.  return nBu
2e3a0 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  f;.}.../*.** Sle
2e3b0 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
2e3c0 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
2e3d0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
2e3e0 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
2e3f0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2e400 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
2e410 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
2e420 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
2e430 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
2e440 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
2e450 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
2e460 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
2e470 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
2e480 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
2e490 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
2e4a0 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
2e4b0 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
2e4c0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
2e4d0 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
2e4e0 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
2e4f0 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
2e500 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
2e510 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
2e520 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2e530 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  d, int microseco
2e540 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  nds){.#if OS_VXW
2e550 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
2e560 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70  mespec sp;..  sp
2e570 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73  .tv_sec = micros
2e580 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30  econds / 1000000
2e590 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d  ;.  sp.tv_nsec =
2e5a0 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25   (microseconds %
2e5b0 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30   1000000) * 1000
2e5c0 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73  ;.  nanosleep(&s
2e5d0 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53  p, NULL);.  UNUS
2e5e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2e5f0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2e600 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
2e610 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  lif defined(HAVE
2e620 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
2e630 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
2e640 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
2e650 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2e660 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
2e670 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
2e680 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
2e690 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
2e6a0 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
2e6b0 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
2e6c0 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  (seconds);.  UNU
2e6d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2e6e0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
2e6f0 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
2e700 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
2e710 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2e720 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
2e730 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
2e740 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
2e750 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
2e760 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
2e770 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
2e780 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
2e790 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2e7a0 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
2e7b0 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
2e7c0 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
2e7d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
2e7e0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
2e7f0 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
2e800 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
2e810 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
2e820 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
2e830 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2e840 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
2e850 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
2e860 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
2e870 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
2e880 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
2e890 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
2e8a0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
2e8b0 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
2e8c0 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
2e8d0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
2e8e0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
2e8f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
2e900 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
2e910 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
2e920 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
2e930 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
2e940 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
2e950 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
2e960 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
2e970 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
2e980 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
2e990 65 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20  ess, return 0.  
2e9a0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2e9b0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
2e9c0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
2e9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2e9e0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
2e9f0 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  4(sqlite3_vfs *N
2ea00 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f  otUsed, sqlite3_
2ea10 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
2ea20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2ea30 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
2ea40 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
2ea50 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2ea60 38 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65 66  8640000;.#if def
2ea70 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
2ea80 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
2ea90 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
2eaa0 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
2eab0 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
2eac0 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
2ead0 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
2eae0 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
2eaf0 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
2eb00 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
2eb10 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
2eb20 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
2eb30 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2eb40 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
2eb50 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
2eb60 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
2eb70 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
2eb80 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66  Now;.  gettimeof
2eb90 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20  day(&sNow, 0);. 
2eba0 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
2ebb0 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
2ebc0 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
2ebd0 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
2ebe0 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69  usec/1000;.#endi
2ebf0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
2ec00 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
2ec10 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
2ec20 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
2ec30 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
2ec40 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
2ec50 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
2ec60 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
2ec70 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
2ec80 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
2ec90 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2eca0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2ecb0 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2ecc0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2ecd0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2ece0 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
2ecf0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
2ed00 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
2ed10 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
2ed20 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
2ed30 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
2ed40 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
2ed50 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
2ed60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2ed70 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
2ed80 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2ed90 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
2eda0 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33  rNow){.  sqlite3
2edb0 5f 69 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55 53  _int64 i;.  UNUS
2edc0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2edd0 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 43 75 72  Used);.  unixCur
2ede0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
2edf0 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
2ee00 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
2ee10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2ee20 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
2ee30 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
2ee40 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
2ee50 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
2ee60 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
2ee70 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
2ee80 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
2ee90 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
2eea0 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
2eeb0 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
2eec0 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
2eed0 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
2eee0 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
2eef0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
2ef00 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
2ef10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2ef20 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
2ef30 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
2ef40 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
2ef50 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
2ef60 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
2ef70 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
2ef80 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
2ef90 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
2efa0 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
2efb0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2efc0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
2efd0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2efe0 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
2eff0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2f000 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
2f010 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*.*******
2f020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f030 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
2f040 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
2f050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f060 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2f070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f0b0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
2f0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f100 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2f110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f120 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
2f130 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
2f140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f150 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
2f160 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
2f170 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67   a "uber-locking
2f180 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73  -method" in this
2f190 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73   sense:  It uses
2f1a0 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f   the.** other lo
2f1b0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
2f1c0 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20   secondary lock 
2f1d0 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f  files.  Proxy lo
2f1e0 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65  cking is a.** me
2f1f0 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f  ta-layer over to
2f200 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69  p of the primiti
2f210 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ve locking imple
2f220 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46  mented above.  F
2f230 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f  or.** this reaso
2f240 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
2f250 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2f260 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
2f270 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20   is deferred.** 
2f280 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68  until late in th
2f290 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66  e file (here) af
2f2a0 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ter all of the o
2f2b0 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73  ther I/O methods
2f2c0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65   have.** been de
2f2d0 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20  fined - so that 
2f2e0 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
2f2f0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72  cking methods ar
2f300 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61  e available.** a
2f310 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65  s services to he
2f320 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c  lp with the impl
2f330 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72  ementation of pr
2f340 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  oxy locking..**.
2f350 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
2f360 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73  efault locking s
2f370 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65  chemes in SQLite
2f380 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20   use byte-range 
2f390 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  locks on the.** 
2f3a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2f3b0 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65   coordinate safe
2f3c0 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63  , concurrent acc
2f3d0 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ess by multiple 
2f3e0 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77  readers.** and w
2f3f0 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73  riters [http://s
2f400 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e  qlite.org/lockin
2f410 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20  gv3.html].  The 
2f420 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  five file lockin
2f430 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c  g.** states (UNL
2f440 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20  OCKED, PENDING, 
2f450 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
2f460 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65  , EXCLUSIVE) are
2f470 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
2f480 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20  as POSIX read & 
2f490 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72  write locks over
2f4a0 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f   fixed set of lo
2f4b0 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63  cations (via fsc
2f4c0 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61  tl),.** on AFP a
2f4d0 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c  nd SMB only excl
2f4e0 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
2f4f0 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c   locks are avail
2f500 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a  able via fsctl.*
2f510 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27  * with _IOWR('z'
2f520 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
2f530 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74  eRangeLockPB2) t
2f540 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65  o track the same
2f550 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f   5 states..** To
2f560 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44   simulate a F_RD
2f570 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65  LCK on the share
2f580 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20  d range, on AFP 
2f590 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  a randomly selec
2f5a0 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69  ted.** address i
2f5b0 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
2f5c0 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
2f5d0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
2f5e0 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61  he entire.** sha
2f5f0 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
2f600 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53  en for an EXCLUS
2f610 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a  IVE lock):.**.**
2f620 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
2f630 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  TE        0x4000
2f640 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20  0000..   ..**   
2f650 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
2f660 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
2f670 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
2f680 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
2f690 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
2f6a0 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
2f6b0 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
2f6c0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
2f6d0 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
2f6e0 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
2f6f0 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
2f700 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
2f710 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
2f720 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
2f730 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
2f740 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
2f750 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
2f760 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
2f770 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
2f780 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
2f790 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
2f7a0 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
2f7b0 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
2f7c0 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
2f7d0 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
2f7e0 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
2f7f0 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
2f800 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
2f810 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
2f820 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
2f830 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
2f840 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
2f850 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
2f860 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
2f870 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
2f880 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
2f890 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
2f8a0 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
2f8b0 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
2f8c0 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
2f8d0 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
2f8e0 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
2f8f0 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
2f900 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
2f910 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
2f920 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
2f930 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
2f940 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
2f950 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
2f960 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
2f970 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
2f980 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
2f990 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
2f9a0 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
2f9b0 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
2f9c0 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
2f9d0 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
2f9e0 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
2f9f0 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
2fa00 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
2fa10 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
2fa20 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
2fa30 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
2fa40 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
2fa50 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
2fa60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2fa70 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
2fa80 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
2fa90 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
2faa0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ame, SQLITE_SET_
2fab0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
2fac0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2fad0 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70          <proxy_p
2fae0 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29  ath> | ":auto:")
2faf0 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.**  sqlite3_fi
2fb00 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
2fb10 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45  bname, SQLITE_GE
2fb20 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
2fb30 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b   &<proxy_path>);
2fb40 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72  .**.**.** SQL pr
2fb50 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41  agmas.**.**  PRA
2fb60 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
2fb70 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c  ock_proxy_file=<
2fb80 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61  proxy_path> | :a
2fb90 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  uto:.**  PRAGMA 
2fba0 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
2fbb0 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a  proxy_file.**.**
2fbc0 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75   Specifying ":au
2fbd0 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20  to:" means that 
2fbe0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  if there is a co
2fbf0 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20  nch file with a 
2fc00 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74  matching.** host
2fc10 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70   ID in it, the p
2fc20 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65  roxy path in the
2fc30 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
2fc40 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77   be used, otherw
2fc50 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70  ise.** a proxy p
2fc60 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ath based on the
2fc70 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72   user's temp dir
2fc80 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72  .** (via confstr
2fc90 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
2fca0 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20  _TEMP_DIR,...)) 
2fcb0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64  will be used and
2fcc0 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70   the.** actual p
2fcd0 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  roxy file name i
2fce0 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
2fcf0 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61   the name and pa
2fd00 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  th of the.** dat
2fd10 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72  abase file.  For
2fd20 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
2fd30 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61        For databa
2fd40 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f  se path "/Users/
2fd50 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20  me/foo.db" .**  
2fd60 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61       The lock pa
2fd70 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70  th will be "<tmp
2fd80 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b  dir>/sqliteplock
2fd90 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e  s/_Users_me_foo.
2fda0 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a  db:auto:").**.**
2fdb0 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f   Once a lock pro
2fdc0 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  xy is configured
2fdd0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
2fde0 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63  connection, it c
2fdf0 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d  an not.** be rem
2fe00 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74  oved, however it
2fe10 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64   may be switched
2fe20 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2fe30 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a  proxy path via.*
2fe40 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73  * the above APIs
2fe50 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63   (assuming the c
2fe60 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74  onch file is not
2fe70 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61   being held by a
2fe80 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63  nother.** connec
2fe90 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29  tion or process)
2fea0 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20  . .**.**.** How 
2feb0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f  proxy locking wo
2fec0 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  rks.** ---------
2fed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
2fee0 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20  *.** Proxy file 
2fef0 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70  locking relies p
2ff00 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20  rimarily on two 
2ff10 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66  new supporting f
2ff20 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  iles: .**.**   *
2ff30 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20    conch file to 
2ff40 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20  limit access to 
2ff50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ff60 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f  e to a single ho
2ff70 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20  st.**      at a 
2ff80 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  time.**.**   *  
2ff90 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63  proxy file to ac
2ffa0 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72  t as a proxy for
2ffb0 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f   the advisory lo
2ffc0 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  cks normally.** 
2ffd0 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68       taken on th
2ffe0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  e database.**.**
2fff0 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
30000 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79  - to use a proxy
30010 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75   file, sqlite mu
30020 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74  st first "hold t
30030 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20  he conch".** by 
30040 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  taking an sqlite
30050 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f  -style shared lo
30060 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
30070 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68  file, reading th
30080 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e  e.** contents an
30090 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  d comparing the 
300a0 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f  host's unique ho
300b0 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77  st ID (see below
300c0 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72  ) and lock.** pr
300d0 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74  oxy path against
300e0 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
300f0 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e  ed in the conch.
30100 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65    The conch file
30110 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e   is.** stored in
30120 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
30130 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62  ory as the datab
30140 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
30150 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73   file name.** is
30160 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72   patterned after
30170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30180 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61  le name as ".<da
30190 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63  tabasename>-conc
301a0 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  h"..** If the co
301b0 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nch file does no
301c0 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73  t exist, or it's
301d0 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
301e0 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
301f0 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
30200 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
30210 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
30220 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
30230 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
30240 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
30250 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
30260 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
30270 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
30280 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
30290 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
302a0 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
302b0 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
302c0 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
302d0 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
302e0 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
302f0 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
30300 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
30310 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
30320 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
30330 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
30340 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
30350 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
30360 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
30370 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
30380 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
30390 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
303a0 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
303b0 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
303c0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
303d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
303e0 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
303f0 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
30400 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
30410 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
30420 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
30430 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
30440 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
30450 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
30460 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
30470 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
30480 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
30490 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
304a0 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
304b0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
304c0 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
304d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
304e0 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
304f0 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
30500 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
30510 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
30520 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
30530 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
30540 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
30550 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
30560 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
30570 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
30580 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
30590 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
305a0 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
305b0 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
305c0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
305d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
305e0 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
305f0 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
30600 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
30610 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
30620 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
30630 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
30640 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
30650 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
30660 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
30670 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
30680 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
30690 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
306a0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
306b0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
306c0 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
306d0 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
306e0 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
306f0 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
30700 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
30710 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
30720 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
30730 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
30740 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
30750 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
30760 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
30770 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
30780 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
30790 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
307a0 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
307b0 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
307c0 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
307d0 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
307e0 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
307f0 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
30800 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
30810 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
30820 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
30830 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
30840 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
30850 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
30860 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
30870 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
30880 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
30890 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
308a0 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
308b0 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
308c0 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
308d0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
308e0 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
308f0 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
30900 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
30910 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
30920 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
30930 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
30940 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
30950 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
30960 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
30970 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
30980 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
30990 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
309a0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
309b0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
309c0 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
309d0 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
309e0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
309f0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
30a00 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
30a10 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
30a20 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
30a30 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
30a40 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
30a50 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
30a60 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
30a70 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
30a80 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
30a90 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
30aa0 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
30ab0 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  city calling the
30ac0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
30ad0 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61  PROXYFILE pragma
30ae0 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69   or.** sqlite_fi
30af0 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69  le_control API i
30b00 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62  s not affected b
30b10 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  y SQLITE_FORCE_P
30b20 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a  ROXY_LOCKING)..*
30b30 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  /../*.** Proxy l
30b40 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
30b50 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
30b60 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  SX .*/.#if defin
30b70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
30b80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
30b90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
30ba0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63  .** The proxyLoc
30bb0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20  kingContext has 
30bc0 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c  the path and fil
30bd0 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
30be0 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20   the remote .** 
30bf0 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20  and local proxy 
30c00 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74  files in it.*/.t
30c10 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72  ypedef struct pr
30c20 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
30c30 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
30c40 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72  ntext;.struct pr
30c50 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
30c60 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t {.  unixFile *
30c70 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20  conchFile;      
30c80 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68     /* Open conch
30c90 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
30ca0 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20  *conchFilePath; 
30cb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
30cc0 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
30cd0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
30ce0 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20  *lockProxy;     
30cf0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78      /* Open prox
30d00 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
30d10 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79   char *lockProxy
30d20 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
30d30 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
30d40 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
30d50 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20    char *dbPath; 
30d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d70 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
30d80 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  en file */.  int
30d90 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20   conchHeld;     
30da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69            /* 1 i
30db0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68  f the conch is h
30dc0 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c  eld, -1 if lockl
30dd0 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  ess */.  void *o
30de0 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
30df0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
30e00 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
30e10 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
30e20 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
30e30 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
30e40 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
30e50 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
30e60 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
30e70 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
30e80 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
30e90 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
30ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
30eb0 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
30ec0 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
30ed0 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
30ee0 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
30ef0 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
30f00 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
30f10 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
30f20 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
30f30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
30f40 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
30f50 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
30f60 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
30f70 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
30f80 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
30f90 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
30fa0 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
30fb0 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
30fc0 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
30fd0 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
30fe0 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
30ff0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
31000 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
31010 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
31020 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
31030 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
31040 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
31050 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
31060 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
31070 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
31080 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31090 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
310a0 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
310b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
310c0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
310d0 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
310e0 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
310f0 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
31100 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
31110 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
31120 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
31130 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
31140 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
31150 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
31160 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
31170 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
31180 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
31190 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
311a0 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
311b0 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
311c0 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
311d0 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
311e0 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
311f0 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
31200 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74  & (i+len+7)<(int
31210 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  )maxLen; i++){. 
31220 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61     char c = dbPa
31230 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68  th[i];.    lPath
31240 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f  [i+len] = (c=='/
31250 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20  ')?'_':c;.  }.  
31260 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30  lPath[i+len]='\0
31270 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61  ';.  strlcat(lPa
31280 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61  th, ":auto:", ma
31290 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45  xLen);.  OSTRACE
312a0 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
312b0 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
312c0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50  %s pid=%d\n", lP
312d0 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ath, getpid()));
312e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
312f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20  _OK;.}../* . ** 
31300 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b  Creates the lock
31310 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69   file and any mi
31320 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  ssing directorie
31330 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a  s in lockPath. *
31340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
31350 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
31360 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63  (const char *loc
31370 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c  kPath){.  int i,
31380 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66   len;.  char buf
31390 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
313a0 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20  int start = 0;. 
313b0 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50   .  assert(lockP
313c0 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a  ath!=NULL);.  /*
313d0 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
313e0 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  ll the intermedi
313f0 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  ate directories 
31400 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29  */.  len = (int)
31410 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29  strlen(lockPath)
31420 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63  ;.  buf[0] = loc
31430 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28  kPath[0];.  for(
31440 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b   i=1; i<len; i++
31450 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
31460 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26  Path[i] == '/' &
31470 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30  & (i - start > 0
31480 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e  ) ){.      /* on
31490 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66  ly mkdir if leaf
314a0 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22   dir != "." or "
314b0 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20  /" or ".." */.  
314c0 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e      if( i-start>
314d0 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31  2 || (i-start==1
314e0 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
314f0 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
31500 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20  rt] != '/') .   
31510 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72        || (i-star
31520 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72  t==2 && buf[star
31530 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
31540 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27  [start+1] != '.'
31550 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66  ) ){.        buf
31560 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20  [i]='\0';.      
31570 20 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c    if( mkdir(buf,
31580 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
31590 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
315a0 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20  IONS) ){.       
315b0 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
315c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
315d0 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a  err!=EEXIST ) {.
315e0 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
315f0 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
31600 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65  PATH  FAILED cre
31610 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20  ating %s, ".    
31620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31630 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63   "'%s' proxy loc
31640 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
31650 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31660 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73            buf, s
31670 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f  trerror(err), lo
31680 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
31690 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
316a0 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
316b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
316c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
316d0 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
316e0 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
316f0 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
31700 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
31710 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
31720 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
31730 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
31740 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
31750 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
31760 61 74 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79  atic int isProxy
31770 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78  LockingMode(unix
31780 46 69 6c 65 20 2a 70 46 69 6c 65 29 20 7b 0a 20  File *pFile) {. 
31790 20 72 65 74 75 72 6e 20 28 70 46 69 6c 65 2d 3e   return (pFile->
317a0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
317b0 79 49 6f 4d 65 74 68 6f 64 73 29 20 3f 20 31 20  yIoMethods) ? 1 
317c0 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  : 0;.}../*.** Re
317d0 74 75 72 6e 20 74 68 65 20 73 68 61 72 65 64 20  turn the shared 
317e0 6d 65 6d 6f 72 79 20 62 61 73 65 20 70 61 74 68  memory base path
317f0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6c 6f   based on the lo
31800 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 69 66  ck proxy file if
31810 20 74 68 65 20 0a 2a 2a 20 6c 6f 63 6b 20 70 72   the .** lock pr
31820 6f 78 79 20 66 69 6c 65 20 69 73 20 68 6f 73 74  oxy file is host
31830 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 20 6d  ed on a shared m
31840 65 6d 6f 72 79 20 63 6f 6d 70 61 74 69 62 6c 65  emory compatible
31850 20 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f   FS.*/.static co
31860 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53  nst char *proxyS
31870 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50  haredMemoryBaseP
31880 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ath(unixFile *pF
31890 69 6c 65 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ile) {.  proxyLo
318a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
318b0 74 78 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  tx;.  unixFile *
318c0 70 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 0a 20 20  pLockFile;.  .  
318d0 61 73 73 65 72 74 28 70 46 69 6c 65 21 3d 4e 55  assert(pFile!=NU
318e0 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  LL && pFile->loc
318f0 6b 69 6e 67 43 6f 6e 74 65 78 74 21 3d 4e 55 4c  kingContext!=NUL
31900 4c 29 3b 0a 20 20 61 73 73 65 72 74 28 70 46 69  L);.  assert(pFi
31910 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
31920 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b  proxyIoMethods);
31930 0a 20 20 70 43 74 78 20 3d 20 28 28 70 72 6f 78  .  pCtx = ((prox
31940 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
31950 2a 29 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *)(pFile->lockin
31960 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 4c  gContext));.  pL
31970 6f 63 6b 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  ockFile = pCtx->
31980 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 69 66 28  lockProxy;.  if(
31990 20 70 4c 6f 63 6b 46 69 6c 65 2d 3e 70 4d 65 74   pLockFile->pMet
319a0 68 6f 64 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32  hod->iVersion>=2
319b0 20 26 26 20 70 4c 6f 63 6b 46 69 6c 65 2d 3e 70   && pLockFile->p
319c0 4d 65 74 68 6f 64 2d 3e 78 53 68 6d 4d 61 70 21  Method->xShmMap!
319d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
319e0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
319f0 50 61 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Path;.  }.  retu
31a00 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn NULL;.}../*.*
31a10 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
31a20 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
31a30 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
31a40 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
31a50 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
31a60 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
31a70 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
31a80 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
31a90 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
31aa0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
31ab0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
31ac0 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
31ad0 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
31ae0 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
31af0 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
31b00 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
31b10 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
31b20 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
31b30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
31b40 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
31b50 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
31b60 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
31b70 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
31b80 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
31b90 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
31ba0 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
31bb0 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
31bc0 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
31bd0 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
31be0 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
31bf0 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
31c00 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
31c10 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
31c20 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
31c30 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66 64   -1;.  int dirfd
31c40 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
31c50 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
31c60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31c70 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
31c80 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
31c90 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  T;.  sqlite3_vfs
31ca0 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74   dummyVfs;.  int
31cb0 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55   terrno = 0;.  U
31cc0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
31cd0 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  used = NULL;..  
31ce0 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20  /* 1. first try 
31cf0 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
31d00 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20  he file.  ** 2. 
31d10 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61  if that fails, a
31d20 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63  nd this is a loc
31d30 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63  k file (not-conc
31d40 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67  h), try creating
31d50 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74  .  ** the parent
31d60 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64   directories and
31d70 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e   then try again.
31d80 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74  .  ** 3. if that
31d90 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f   fails, try to o
31da0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61  pen the file rea
31db0 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  d-only.  ** othe
31dc0 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53  rwise return BUS
31dd0 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29  Y (if lock file)
31de0 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72   or CANTOPEN for
31df0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a   the conch file.
31e00 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d    */.  pUnused =
31e10 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
31e20 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29  path, openFlags)
31e30 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20  ;.  if( pUnused 
31e40 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75  ){.    fd = pUnu
31e50 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65  sed->fd;.  }else
31e60 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  {.    pUnused = 
31e70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
31e80 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
31e90 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
31ea0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
31eb0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
31ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
31ed0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
31ee0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
31ef0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
31f00 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
31f10 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
31f20 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
31f30 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  rno;.    if( fd<
31f40 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  0 && errno==ENOE
31f50 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65  NT && islockfile
31f60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
31f70 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
31f80 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54  h(path) == SQLIT
31f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31fa0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
31fb0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
31fc0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
31fd0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
31fe0 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  S);.      }.    
31ff0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
32000 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67   ){.    openFlag
32010 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
32020 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
32030 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
32040 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  gs, SQLITE_DEFAU
32050 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
32060 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  ONS);.    terrno
32070 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
32080 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
32090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
320a0 75 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69  used);.    if( i
320b0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
320c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
320d0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
320e0 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
320f0 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
32100 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
32110 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
32120 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
32130 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
32140 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
32150 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
32160 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
32170 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
32180 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
32190 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
321a0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
321b0 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
321c0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
321d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
321e0 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
321f0 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
32200 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32210 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
32220 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
32230 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
32240 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  New, 0, sizeof(u
32250 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65  nixFile));.  pNe
32260 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  w->openFlags = o
32270 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73  penFlags;.  mems
32280 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c  et(&dummyVfs, 0,
32290 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73   sizeof(dummyVfs
322a0 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70  ));.  dummyVfs.p
322b0 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  AppData = (void*
322c0 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
322d0 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a  er;.  dummyVfs.z
322e0 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a  Name = "dummy";.
322f0 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
32300 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
32310 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
32320 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
32330 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
32340 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
32350 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
32360 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c   fd, dirfd, (sql
32370 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
32380 20 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b   path, 0, 0, 0);
32390 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
323a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
323b0 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
323c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
323d0 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
323e0 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f  _proxy:    .  ro
323f0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
32400 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
32410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
32420 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
32430 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
32440 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
32450 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
32460 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
32470 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
32480 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
32490 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
324a0 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
324b0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
324c0 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
324d0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
324e0 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
324f0 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
32500 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20  ngth */../* Not 
32510 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
32520 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
32530 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
32540 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
32550 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
32560 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
32570 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
32580 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  );../* get the h
32590 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f  ost ID via getho
325a0 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49  stuuid(), pHostI
325b0 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  D must point to 
325c0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
325d0 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69  .** bytes of wri
325e0 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  table memory..*/
325f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32600 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67  yGetHostID(unsig
32610 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49  ned char *pHostI
32620 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
32630 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f  .  assert(PROXY_
32640 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a  HOSTIDLEN == siz
32650 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20  eof(uuid_t));.  
32660 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20  memset(pHostID, 
32670 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  0, PROXY_HOSTIDL
32680 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  EN);.#if defined
32690 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53  (__MAX_OS_X_VERS
326a0 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
326b0 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
326c0 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f    && __MAC_OS_X_
326d0 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
326e0 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20  IRED<1050.  {.  
326f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
32700 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74  truct timespec t
32710 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b  imeout = {1, 0};
32720 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75   /* 1 sec timeou
32730 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74  t */.    if( get
32740 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
32750 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
32760 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
32770 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
32780 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
32790 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b    *pError = err;
327a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
327b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
327c0 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
327d0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
327e0 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d  TE_TEST.  /* sim
327f0 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
32800 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
32810 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
32820 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69  ile paths */.  i
32830 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  f( sqlite3_hosti
32840 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20  d_num != 0){.   
32850 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63   pHostID[0] = (c
32860 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20  har)(pHostID[0] 
32870 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33  + (char)(sqlite3
32880 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78  _hostid_num & 0x
32890 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  FF));.  }.#endif
328a0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .  .  return SQL
328b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
328c0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
328d0 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72  tains the header
328e0 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f  , host id and lo
328f0 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f  ck file path. */
32900 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43  .#define PROXY_C
32910 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20  ONCHVERSION 2   
32920 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72  /* 1-byte header
32930 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69  , 16-byte host i
32940 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69  d, path */.#defi
32950 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  ne PROXY_HEADERL
32960 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e  EN    1   /* con
32970 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c  ch file header l
32980 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65  ength */.#define
32990 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
329a0 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45      (PROXY_HEADE
329b0 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
329c0 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52  DLEN).#define PR
329d0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20  OXY_MAXCONCHLEN 
329e0 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
329f0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
32a00 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f  N+MAXPATHLEN)../
32a10 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f  * .** Takes an o
32a20 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  pen conch file, 
32a30 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65  copies the conte
32a40 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74  nts to a new pat
32a50 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73  h and then moves
32a60 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54   .** it back.  T
32a70 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64  he newly created
32a80 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73   file's file des
32a90 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67  criptor is assig
32aa0 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ned to the.** co
32ab0 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75  nch file structu
32ac0 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74  re and finally t
32ad0 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63  he original conc
32ae0 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
32af0 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e  r is .** closed.
32b00 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69    Returns zero i
32b10 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
32b20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32b30 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
32b40 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
32b50 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
32b60 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
32b70 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
32b80 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
32b90 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
32ba0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
32bb0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
32bc0 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
32bd0 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20  nchFile;.  char 
32be0 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  tPath[MAXPATHLEN
32bf0 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52  ];.  char buf[PR
32c00 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
32c10 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20  ;.  char *cPath 
32c20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
32c30 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20  ePath;.  size_t 
32c40 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73  readLen = 0;.  s
32c50 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
32c60 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67  0;.  char errmsg
32c70 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74  [64] = "";.  int
32c80 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20   fd = -1;.  int 
32c90 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45  rc = -1;.  UNUSE
32ca0 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f  D_PARAMETER(myHo
32cb0 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65  stID);..  /* cre
32cc0 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62  ate a new path b
32cd0 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72  y replace the tr
32ce0 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20  ailing '-conch' 
32cf0 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f  with '-break' */
32d00 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72  .  pathLen = str
32d10 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74  lcpy(tPath, cPat
32d20 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
32d30 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41    if( pathLen>MA
32d40 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68  XPATHLEN || path
32d50 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28  Len<6 || .     (
32d60 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70  strlcpy(&tPath[p
32d70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61  athLen-5], "brea
32d80 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a  k", 6) != 5) ){.
32d90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
32da0 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
32db0 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68  sg),errmsg,"path
32dc0 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
32dd0 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a  ,(int)pathLen);.
32de0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
32df0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
32e00 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20   read the conch 
32e10 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61  content */.  rea
32e20 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63  dLen = osPread(c
32e30 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
32e40 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
32e50 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
32e60 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
32e70 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71  HINDEX ){.    sq
32e80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
32e90 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
32ea0 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72  rmsg,"read error
32eb0 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
32ec0 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  readLen);.    go
32ed0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
32ee0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65  ;.  }.  /* write
32ef0 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74   it out to the t
32f00 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66  emporary break f
32f10 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f  ile */.  fd = ro
32f20 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c  bust_open(tPath,
32f30 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54   (O_RDWR|O_CREAT
32f40 7c 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20 20  |O_EXCL),.      
32f50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
32f60 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
32f70 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
32f80 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
32f90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32fa0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
32fb0 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74  , errmsg, "creat
32fc0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
32fd0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
32fe0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
32ff0 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69    }.  if( osPwri
33000 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64  te(fd, buf, read
33010 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a  Len, 0) != (ssiz
33020 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20  e_t)readLen ){. 
33030 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
33040 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
33050 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69  g), errmsg, "wri
33060 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
33070 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
33080 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
33090 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d  .  }.  if( renam
330a0 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20  e(tPath, cPath) 
330b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
330c0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
330d0 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
330e0 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28  "rename failed (
330f0 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
33100 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
33110 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  lock;.  }.  rc =
33120 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74   0;.  fprintf(st
33130 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61  derr, "broke sta
33140 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22  le lock on %s\n"
33150 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75  , cPath);.  robu
33160 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
33170 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f  conchFile->h, __
33180 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68  LINE__);.  conch
33190 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
331a0 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
331b0 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
331c0 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
331d0 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
331e0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
331f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69  =0 ){.      unli
33200 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
33210 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
33220 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
33230 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
33240 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
33250 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
33260 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
33270 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
33280 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
33290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
332a0 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
332b0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
332c0 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
332d0 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
332e0 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
332f0 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
33300 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
33310 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
33320 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
33330 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
33340 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
33350 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
33360 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
33370 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
33380 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
33390 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
333a0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
333b0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
333c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
333d0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
333e0 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
333f0 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
33400 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20  odTime;.  .  do 
33410 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
33420 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
33430 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
33440 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
33450 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54  ockType);.    nT
33460 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28  ries ++;.    if(
33470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
33480 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
33490 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20  the lock failed 
334a0 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a  (busy):.       *
334b0 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68   1st try: get th
334c0 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68  e mod time of th
334d0 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e  e conch, wait 0.
334e0 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  5s and try again
334f0 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20  . .       * 2nd 
33500 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65  try: fail if the
33510 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65   mod time change
33520 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20  d or host id is 
33530 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20  different, wait 
33540 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20  .       *       
33550 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74      10 sec and t
33560 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20  ry again.       
33570 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b  * 3rd try: break
33580 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73   the lock unless
33590 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61   the mod time ha
335a0 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  s changed..     
335b0 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63    */.      struc
335c0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
335d0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f    if( osFstat(co
335e0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  nchFile->h, &buf
335f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
33600 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
33610 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
33620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
33630 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  RR_LOCK;.      }
33640 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
33650 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20  ( nTries==1 ){. 
33660 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54         conchModT
33670 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ime = buf.st_mti
33680 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20  mespec;.        
33690 75 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20  usleep(500000); 
336a0 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20  /* wait 0.5 sec 
336b0 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b  and try the lock
336c0 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20   again*/.       
336d0 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
336e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
336f0 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a  rt( nTries>1 );.
33700 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d        if( conchM
33710 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d  odTime.tv_sec !=
33720 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
33730 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20  c.tv_sec || .   
33740 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
33750 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75  me.tv_nsec != bu
33760 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
33770 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20  v_nsec ){.      
33780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33790 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BUSY;.      }.  
337a0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
337b0 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20  Tries==2 ){  .  
337c0 20 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b        char tBuf[
337d0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
337e0 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  N];.        int 
337f0 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  len = osPread(co
33800 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66  nchFile->h, tBuf
33810 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
33820 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LEN, 0);.       
33830 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20   if( len<0 ){.  
33840 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
33850 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
33860 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
33870 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
33880 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LOCK;.        }.
33890 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
338a0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
338b0 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61  && tBuf[0]==(cha
338c0 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
338d0 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20  SION){.         
338e0 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
338f0 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  the lock if the 
33900 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20  host id doesn't 
33910 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
33920 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70     if( 0!=memcmp
33930 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41  (&tBuf[PROXY_HEA
33940 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
33950 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  D, PROXY_HOSTIDL
33960 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
33970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33980 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
33990 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
339a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
339b0 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
339c0 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61  ock on short rea
339d0 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d  d or a version m
339e0 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  ismatch */.     
339f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33a00 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
33a10 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65   }.        uslee
33a20 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20  p(10000000); /* 
33a30 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20  wait 10 sec and 
33a40 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
33a50 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  in */.        co
33a60 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d  ntinue; .      }
33a70 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73  .      .      as
33a80 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20  sert( nTries==3 
33a90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
33aa0 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
33ab0 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
33ac0 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tID) ){.        
33ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33ae0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b          if( lock
33af0 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Type==EXCLUSIVE_
33b00 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
33b10 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
33b20 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
33b30 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
33b40 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45  conchFile, SHARE
33b50 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20  D_LOCK);        
33b60 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20    .        }.   
33b70 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
33b80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
33b90 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
33ba0 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
33bb0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
33bc0 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
33bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33be0 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28      }.  } while(
33bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
33c00 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a   && nTries<3 );.
33c10 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
33c20 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20  }../* Takes the 
33c30 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20  conch by taking 
33c40 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
33c50 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  d read the conte
33c60 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a  nts conch, if .*
33c70 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f  * lockPath is no
33c80 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74  n-NULL, the host
33c90 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   ID and lock fil
33ca0 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63  e path must matc
33cb0 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c  h.  A NULL .** l
33cc0 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68  ockPath means th
33cd0 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20  at the lockPath 
33ce0 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
33cf0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69  e will be used i
33d00 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49  f the .** host I
33d10 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e  Ds match, or a n
33d20 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  ew lock path wil
33d30 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61  l be generated a
33d40 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
33d50 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20   and written to 
33d60 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a  the conch file..
33d70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
33d80 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69  oxyTakeConch(uni
33d90 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
33da0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
33db0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
33dc0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
33dd0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
33de0 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20  ngContext; .  . 
33df0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
33e00 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72  Held!=0 ){.    r
33e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
33e30 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
33e40 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
33e50 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20  ile;.    uuid_t 
33e60 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e  myHostID;.    in
33e70 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  t pError = 0;.  
33e80 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50    char readBuf[P
33e90 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
33ea0 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b  ];.    char lock
33eb0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
33ec0 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70  ;.    char *temp
33ed0 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b  LockPath = NULL;
33ee0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
33ef0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74  LITE_OK;.    int
33f00 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30   createConch = 0
33f10 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64  ;.    int hostId
33f20 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Match = 0;.    i
33f30 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  nt readLen = 0;.
33f40 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f      int tryOldLo
33f50 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
33f60 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b  int forceNewLock
33f70 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20  Path = 0;.    . 
33f80 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b     OSTRACE(("TAK
33f90 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25  ECONCH  %d for %
33fa0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e  s pid=%d\n", con
33fb0 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
33fc0 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
33fd0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
33fe0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
33ff0 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
34000 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20  getpid()));..   
34010 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f   rc = proxyGetHo
34020 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26  stID(myHostID, &
34030 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28  pError);.    if(
34040 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
34050 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
34060 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
34070 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  no = pError;.   
34080 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
34090 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  conch;.    }.   
340a0 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68   rc = proxyConch
340b0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
340c0 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43  stID, SHARED_LOC
340d0 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
340e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
340f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
34100 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  conch;.    }.   
34110 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69   /* read the exi
34120 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65  sting conch file
34130 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20   */.    readLen 
34140 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75  = seekAndRead((u
34150 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69  nixFile*)conchFi
34160 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20  le, 0, readBuf, 
34170 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
34180 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64  N);.    if( read
34190 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  Len<0 ){.      /
341a0 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73  * I/O error: las
341b0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
341c0 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
341d0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
341e0 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d  rno = conchFile-
341f0 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
34200 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
34210 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20  ERR_READ;.      
34220 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
34230 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ch;.    }else if
34240 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58  ( readLen<=(PROX
34250 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
34260 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20  Y_HOSTIDLEN) || 
34270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65  .             re
34280 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29  adBuf[0]!=(char)
34290 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
342a0 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61  ON ){.      /* a
342b0 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76   short read or v
342c0 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69  ersion format mi
342d0 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20  smatch means we 
342e0 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
342f0 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63   new .      ** c
34300 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20  onch file. .    
34310 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74    */.      creat
34320 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20  eConch = 1;.    
34330 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20  }.    /* if the 
34340 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20  host id matches 
34350 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74  and the lock pat
34360 68 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  h already exists
34370 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20   in the conch.  
34380 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74    ** we'll try t
34390 6f 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74  o use the path t
343a0 68 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27  here, if we can'
343b0 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68  t open that path
343c0 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20  , we'll .    ** 
343d0 72 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77  retry with a new
343e0 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20   auto-generated 
343f0 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20  path .    */.   
34400 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65   do { /* in case
34410 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20   we need to try 
34420 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75  again for an :au
34430 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66  to: named lock f
34440 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ile */..      if
34450 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26  ( !createConch &
34460 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  & !forceNewLockP
34470 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68  ath ){.        h
34480 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65  ostIdMatch = !me
34490 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52  mcmp(&readBuf[PR
344a0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20  OXY_HEADERLEN], 
344b0 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20  myHostID, .     
344c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
344d0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f               PRO
344e0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20  XY_HOSTIDLEN);. 
344f0 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65         /* if the
34500 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20   conch has data 
34510 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74  compare the cont
34520 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
34530 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
34540 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
34550 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74        /* for aut
34560 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f  o-named local lo
34570 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68  ck file, just ch
34580 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20  eck the host ID 
34590 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20  and we'll.      
345a0 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20       ** use the 
345b0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
345c0 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65  path that's alre
345d0 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20  ady in there.   
345e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
345f0 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d       if( hostIdM
34600 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
34610 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c      size_t pathL
34620 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20  en = (readLen - 
34630 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
34640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
34650 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
34660 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c  athLen>=MAXPATHL
34670 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
34680 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50      pathLen=MAXP
34690 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20  ATHLEN-1;.      
346a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
346b0 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50      memcpy(lockP
346c0 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52  ath, &readBuf[PR
346d0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
346e0 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20  pathLen);.      
346f0 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70        lockPath[p
34700 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20  athLen] = 0;.   
34710 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63           tempLoc
34720 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
34730 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ;.            tr
34740 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31  yOldLockPath = 1
34750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
34760 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f   create a copy o
34770 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  f the lock path 
34780 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
34790 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  taken */.       
347a0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
347b0 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20  keconch;.       
347c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
347d0 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74  se if( hostIdMat
347e0 63 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ch.             
347f0 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43    && !strncmp(pC
34800 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
34810 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58  h, &readBuf[PROX
34820 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20  Y_PATHINDEX],.  
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34840 20 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e           readLen
34850 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  -PROXY_PATHINDEX
34860 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
34870 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20         /* conch 
34880 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61  host and lock pa
34890 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  th match */.    
348a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
348b0 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20  akeconch; .     
348c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
348d0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20     .      /* if 
348e0 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20  the conch isn't 
348f0 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65  writable and doe
34900 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63  sn't match, we c
34910 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a  an't take it */.
34920 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68        if( (conch
34930 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26  File->openFlags&
34940 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a  O_RDWR) == 0 ){.
34950 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
34960 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
34970 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
34980 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20  onch;.      }.  
34990 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69      .      /* ei
349a0 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64  ther the conch d
349b0 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77  idn't match or w
349c0 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
349d0 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20   a new one */.  
349e0 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
349f0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
34a00 20 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74          proxyGet
34a10 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64  LockPath(pCtx->d
34a20 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c  bPath, lockPath,
34a30 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
34a40 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61        tempLockPa
34a50 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20  th = lockPath;. 
34a60 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65         /* create
34a70 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c   a copy of the l
34a80 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20  ock path _only_ 
34a90 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
34aa0 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  taken */.      }
34ab0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
34ac0 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69   update conch wi
34ad0 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68  th host and path
34ae0 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c   (this will fail
34af0 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73   if other proces
34b00 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61  s.      ** has a
34b10 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72   shared lock alr
34b20 65 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f  eady), if the ho
34b30 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75  st id matches, u
34b40 73 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20  se the big.     
34b50 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20   ** stick..     
34b60 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65   */.      futime
34b70 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  s(conchFile->h, 
34b80 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28  NULL);.      if(
34b90 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20   hostIdMatch && 
34ba0 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a  !createConch ){.
34bb0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63          if( conc
34bc0 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  hFile->pInode &&
34bd0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f   conchFile->pIno
34be0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
34bf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
34c00 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
34c10 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
34c20 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
34c30 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
34c40 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20          ** same 
34c50 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
34c60 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
34c70 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  d lock. */.     
34c80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34c90 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
34ca0 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20   else {         
34cb0 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
34cc0 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
34cd0 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c  pFile, myHostID,
34ce0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
34cf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34d10 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
34d20 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
34d30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
34d40 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53  onchFile, EXCLUS
34d50 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
34d60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
34d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34d80 20 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65        char write
34d90 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58  Buffer[PROXY_MAX
34da0 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20  CONCHLEN];.     
34db0 20 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65     int writeSize
34dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20   = 0;.        . 
34dd0 20 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66         writeBuff
34de0 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52  er[0] = (char)PR
34df0 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
34e00 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
34e10 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
34e20 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20  OXY_HEADERLEN], 
34e30 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f  myHostID, PROXY_
34e40 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20  HOSTIDLEN);.    
34e50 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
34e60 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c  ckProxyPath!=NUL
34e70 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  L ){.          s
34e80 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66  trlcpy(&writeBuf
34e90 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
34ea0 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b  DEX], pCtx->lock
34eb0 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41  ProxyPath, MAXPA
34ec0 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
34ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34ee0 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42   strlcpy(&writeB
34ef0 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
34f00 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b  INDEX], tempLock
34f10 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
34f20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34f30 20 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d       writeSize =
34f40 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
34f50 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65   + strlen(&write
34f60 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
34f70 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20  HINDEX]);.      
34f80 20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61    robust_ftrunca
34f90 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  te(conchFile->h,
34fa0 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20   writeSize);.   
34fb0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72       rc = unixWr
34fc0 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ite((sqlite3_fil
34fd0 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77  e *)conchFile, w
34fe0 72 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74  riteBuffer, writ
34ff0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
35000 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69     fsync(conchFi
35010 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20  le->h);.        
35020 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64  /* If we created
35030 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c   a new conch fil
35040 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61  e (not just upda
35050 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ted the contents
35060 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20   of a .         
35070 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66  ** valid conch f
35080 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74  ile), try to mat
35090 63 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ch the permissio
350a0 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ns of the databa
350b0 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  se .         */.
350c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
350d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65  SQLITE_OK && cre
350e0 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20  ateConch ){.    
350f0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
35100 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20  t buf;.         
35110 20 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74   int err = osFst
35120 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
35130 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  f);.          if
35140 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  ( err==0 ){.    
35150 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63          mode_t c
35160 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f  mode = buf.st_mo
35170 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57  de&(S_IRUSR|S_IW
35180 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f  USR | S_IRGRP|S_
35190 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20  IWGRP |.        
351a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351c0 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29  S_IROTH|S_IWOTH)
351d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
351e0 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68   try to match th
351f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35200 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c  R/W permissions,
35210 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20   ignore failure 
35220 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
35230 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20  E_PROXY_DEBUG.  
35240 20 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d            osFchm
35250 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  od(conchFile->h,
35260 20 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20   cmode);.#else. 
35270 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20             do{. 
35280 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
35290 3d 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68  = osFchmod(conch
352a0 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b  File->h, cmode);
352b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 77 68  .            }wh
352c0 69 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26  ile( rc==(-1) &&
352d0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
352e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
352f0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
35300 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65          int code
35310 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
35320 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
35330 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
35340 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25  %o FAILED with %
35350 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
35360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
35370 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65  mode, code, stre
35380 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20  rror(code));.   
35390 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
353a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
353b0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
353c0 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45  "fchmod %o SUCCE
353d0 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20  DED\n",cmode);. 
353e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
353f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35400 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
35410 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
35420 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
35430 73 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41  stderr, "STAT FA
35440 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64  ILED[%d] with %d
35450 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20   %s\n", .       
35460 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
35470 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72  , code, strerror
35480 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a  (code));.#endif.
35490 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
354a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
354b0 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
354c0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
354d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
354e0 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
354f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20  _LOCK);.      . 
35500 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68     end_takeconch
35510 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  :.      OSTRACE(
35520 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c  ("TRANSPROXY: CL
35530 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c  OSE  %d\n", pFil
35540 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66  e->h));.      if
35550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35560 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  && pFile->openFl
35570 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ags ){.        i
35580 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
35590 7b 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62 75  {.          robu
355a0 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
355b0 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
355c0 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  __);.        }. 
355d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
355e0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e  = -1;.        in
355f0 74 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70  t fd = robust_op
35600 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  en(pCtx->dbPath,
35610 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67   pFile->openFlag
35620 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
35630 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35640 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
35650 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20  MISSIONS);.     
35660 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41     OSTRACE(("TRA
35670 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25  NSPROXY: OPEN  %
35680 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20  d\n", fd));.    
35690 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
356a0 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
356b0 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  ->h = fd;.      
356c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
356d0 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e     rc=SQLITE_CAN
356e0 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53  TOPEN_BKPT; /* S
356f0 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78  QLITE_BUSY? prox
35700 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65  yTakeConch calle
35710 64 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72  d.           dur
35720 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ing locking */. 
35730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35740 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
35750 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74  QLITE_OK && !pCt
35760 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a  x->lockProxy ){.
35770 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61          char *pa
35780 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74  th = tempLockPat
35790 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h ? tempLockPath
357a0 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   : pCtx->lockPro
357b0 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
357c0 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
357d0 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26  UnixFile(path, &
357e0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c  pCtx->lockProxy,
357f0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
35800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
35810 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
35820 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b  EM && tryOldLock
35830 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
35840 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74    /* we couldn't
35850 20 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78   create the prox
35860 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68  y lock file with
35870 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69   the old lock fi
35880 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20  le path.        
35890 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61     ** so try aga
358a0 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69  in via auto-nami
358b0 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ng .           *
358c0 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63  /.          forc
358d0 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31  eNewLockPath = 1
358e0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f  ;.          tryO
358f0 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
35900 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
35910 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74  ue; /* go back t
35920 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c  o the do {} whil
35930 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74  e start point, t
35940 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ry again */.    
35950 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35960 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35980 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
35990 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20   a copy of path 
359a0 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20  if we extracted 
359b0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
359c0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63     ** from the c
359d0 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65  onch file or the
359e0 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61   path was alloca
359f0 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ted on the stack
35a00 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
35a10 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63       if( tempLoc
35a20 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
35a30 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
35a40 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
35a50 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70  DbStrDup(0, temp
35a60 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20  LockPath);.     
35a70 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
35a80 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
35a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
35aa0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
35ab0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35ad0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35ae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35af0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
35b00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   = 1;.        . 
35b10 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
35b20 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74  >lockProxy->pMet
35b30 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  hod == &afpIoMet
35b40 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20  hods ){.        
35b50 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
35b60 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20  ext *afpCtx;.   
35b70 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20         afpCtx = 
35b80 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
35b90 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50  xt *)pCtx->lockP
35ba0 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  roxy->lockingCon
35bb0 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
35bc0 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d  afpCtx->dbPath =
35bd0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
35be0 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Path;.        }.
35bf0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
35c00 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65         conchFile
35c10 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
35c20 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
35c30 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
35c40 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
35c50 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
35c60 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  AKECONCH  %d %s\
35c70 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
35c80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22   rc==SQLITE_OK?"
35ca0 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a  ok":"failed"));.
35cb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35cc0 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29  .    } while (1)
35cd0 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20  ; /* in case we 
35ce0 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68  need to retry th
35cf0 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69  e :auto: lock fi
35d00 6c 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20  le - .          
35d10 20 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f         ** we sho
35d20 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65  uld never get he
35d30 72 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68  re except via th
35d40 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c  e 'continue' cal
35d50 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  l. */.  }.}../*.
35d60 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64  ** If pFile hold
35d70 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f  s a lock on a co
35d80 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72  nch file, then r
35d90 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b  elease that lock
35da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35db0 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
35dc0 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
35dd0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
35de0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
35df0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
35e00 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
35e10 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
35e20 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20  text *pCtx;  /* 
35e30 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  The locking cont
35e40 65 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78  ext for the prox
35e50 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78  y lock */.  unix
35e60 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
35e70 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
35e80 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
35e90 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28  e */..  pCtx = (
35ea0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35eb0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
35ec0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63  kingContext;.  c
35ed0 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
35ee0 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53  >conchFile;.  OS
35ef0 54 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43  TRACE(("RELEASEC
35f00 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20  ONCH  %d for %s 
35f10 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68  pid=%d\n", conch
35f20 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
35f30 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50      (pCtx->lockP
35f40 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d  roxyPath ? pCtx-
35f50 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a  >lockProxyPath :
35f60 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20   ":auto:"), .   
35f70 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29          getpid()
35f80 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  ));.  if( pCtx->
35f90 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
35fa0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
35fb0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
35fc0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
35fd0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
35fe0 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43  _LOCK);.  }.  pC
35ff0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
36000 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  0;.  OSTRACE(("R
36010 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20  ELEASECONCH  %d 
36020 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %s\n", conchFile
36030 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
36040 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
36050 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
36060 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
36070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
36080 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
36090 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f  atabase file, co
360a0 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  mpute the name o
360b0 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65  f its conch file
360c0 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63  ..** Store the c
360d0 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e  onch filename in
360e0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
360f0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
36100 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20  lloc()..** Make 
36110 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e  *pConchPath poin
36120 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d  t to the new nam
36130 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
36140 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
36150 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
36160 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  EM if unable to 
36170 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  obtain memory..*
36180 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
36190 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
361a0 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  or ensuring that
361b0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
361c0 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69  emory.** space i
361d0 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  s eventually fre
361e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63  ed..**.** *pConc
361f0 68 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20  hPath is set to 
36200 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79  NULL if a memory
36210 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
36220 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
36230 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
36240 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65  ateConchPathname
36250 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63  (char *dbPath, c
36260 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68  har **pConchPath
36270 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
36280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36290 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
362a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20  er */.  int len 
362b0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
362c0 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68  Path); /* Length
362d0 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
362e0 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a  ename - dbPath *
362f0 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50  /.  char *conchP
36300 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
36310 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77    /* buffer in w
36320 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63  hich to construc
36330 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a  t conch name */.
36340 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
36350 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  pace for the con
36360 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  ch filename and 
36370 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e  initialize the n
36380 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ame to.  ** the 
36390 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67  name of the orig
363a0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
363b0 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e  le. */  .  *pCon
363c0 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61  chPath = conchPa
363d0 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  th = (char *)sql
363e0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20  ite3_malloc(len 
363f0 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63  + 8);.  if( conc
36400 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  hPath==0 ){.    
36410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
36420 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  MEM;.  }.  memcp
36430 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50  y(conchPath, dbP
36440 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a  ath, len+1);.  .
36450 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20    /* now insert 
36460 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65  a "." before the
36470 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65   last / characte
36480 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c  r */.  for( i=(l
36490 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d  en-1); i>=0; i--
364a0 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63   ){.    if( conc
364b0 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b  hPath[i]=='/' ){
364c0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
364d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
364e0 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69   }.  conchPath[i
364f0 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28  ]='.';.  while (
36500 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f   i<len ){.    co
36510 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50  nchPath[i+1]=dbP
36520 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b  ath[i];.    i++;
36530 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e  .  }..  /* appen
36540 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73  d the "-conch" s
36550 75 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c  uffix to the fil
36560 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63  e */.  memcpy(&c
36570 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22  onchPath[i+1], "
36580 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61  -conch", 7);.  a
36590 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c  ssert( (int)strl
365a0 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d  en(conchPath) ==
365b0 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74   len+7 );..  ret
365c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
365d0 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75  .../* Takes a fu
365e0 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70  lly configured p
365f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79  roxy locking-sty
36600 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64  le unix file and
36610 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65   switches.** the
36620 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
36630 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63   path .*/.static
36640 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50   int switchLockP
36650 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c  roxyPath(unixFil
36660 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20  e *pFile, const 
36670 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20  char *path) {.  
36680 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36690 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
366a0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
366b0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
366c0 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20  Context;.  char 
366d0 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d  *oldPath = pCtx-
366e0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
366f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36700 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69  E_OK;..  if( pFi
36710 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
36720 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  O_LOCK ){.    re
36730 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
36740 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f  ;.  }  ..  /* no
36750 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74  thing to do if t
36760 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c  he path is NULL,
36770 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68   :auto: or match
36780 65 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  es the existing 
36790 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70  path */.  if( !p
367a0 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
367b0 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
367c0 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
367d0 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20  ||.    (oldPath 
367e0 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50  && !strncmp(oldP
367f0 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41  ath, path, MAXPA
36800 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72  THLEN)) ){.    r
36810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
36830 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
36840 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
36850 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  oxy;.    pCtx->l
36860 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20  ockProxy=NULL;. 
36870 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65     pCtx->conchHe
36880 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ld = 0;.    if( 
36890 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20  lockProxy!=NULL 
368a0 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b  ){.      rc=lock
368b0 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
368c0 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
368d0 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79  file *)lockProxy
368e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
368f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
36900 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
36910 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
36920 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
36930 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20  ee(oldPath);.   
36940 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
36950 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
36960 53 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b  StrDup(0, path);
36970 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e  .  }.  .  return
36980 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46   rc;.}../*.** pF
36990 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68  ile is a file th
369a0 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e  at has been open
369b0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f  ed by a prior xO
369c0 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74  pen call.  dbPat
369d0 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67  h.** is a string
369e0 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74   buffer at least
369f0 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68   MAXPATHLEN+1 ch
36a00 61 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65  aracters in size
36a10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
36a20 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69  tine find the fi
36a30 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65  lename associate
36a40 64 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64  d with pFile and
36a50 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e   writes it.** in
36a60 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61  t dbPath..*/.sta
36a70 74 69 63 20 69 6e 74 20 67 65 74 44 62 50 61 74  tic int getDbPat
36a80 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69  hForUnixFile(uni
36a90 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68  xFile *pFile, ch
36aa0 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66  ar *dbPath){.#if
36ab0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
36ac0 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  __).  if( pFile-
36ad0 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70  >pMethod == &afp
36ae0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
36af0 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65   /* afp style ke
36b00 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  eps a reference 
36b10 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20 69  to the db path i
36b20 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20 66  n the filePath f
36b30 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20  ield .    ** of 
36b40 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  the struct */.  
36b50 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
36b60 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69  trlen((char*)pFi
36b70 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36b80 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20  xt)<=MAXPATHLEN 
36b90 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64  );.    strlcpy(d
36ba0 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b  bPath, ((afpLock
36bb0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36bc0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36bd0 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58  xt)->dbPath, MAX
36be0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c  PATHLEN);.  } el
36bf0 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  se.#endif.  if( 
36c00 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
36c10 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
36c20 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f  ods ){.    /* do
36c30 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65  t lock style use
36c40 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
36c50 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74  ntext to store t
36c60 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20  he dot lock.    
36c70 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  ** file path */.
36c80 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
36c90 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69  rlen((char *)pFi
36ca0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36cb0 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54  xt) - strlen(DOT
36cc0 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20  LOCK_SUFFIX);.  
36cd0 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c    memcpy(dbPath,
36ce0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
36cf0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20  lockingContext, 
36d00 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73  len + 1);.  }els
36d10 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74  e{.    /* all ot
36d20 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20 74  her styles use t
36d30 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
36d40 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  xt to store the 
36d50 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  db file path */.
36d60 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
36d70 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d  en((char*)pFile-
36d80 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
36d90 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a  <=MAXPATHLEN );.
36da0 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61      strlcpy(dbPa
36db0 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
36dc0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
36dd0 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  t, MAXPATHLEN);.
36de0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
36df0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
36e00 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61 64   Takes an alread
36e10 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78  y filled in unix
36e20 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72 73   file and alters
36e30 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20   it so all file 
36e40 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c  locking .** will
36e50 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
36e60 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79   the local proxy
36e70 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68 65   lock file.  The
36e80 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
36e90 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72 76  s.** are preserv
36ea0 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  ed in the lockin
36eb0 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68 61  g context so tha
36ec0 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65  t they can be re
36ed0 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74  stored and .** t
36ee0 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75 72  he unix structur
36ef0 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e  e properly clean
36f00 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20 74  ed up at close t
36f10 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69  ime:.**  ->locki
36f20 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e  ngContext.**  ->
36f30 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69  pMethod.*/.stati
36f40 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
36f50 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
36f60 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
36f70 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
36f80 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
36f90 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
36fa0 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58   char dbPath[MAX
36fb0 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20  PATHLEN+1];     
36fc0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
36fd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
36fe0 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  /.  char *lockPa
36ff0 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72  th=NULL;.  int r
37000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37010 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65   .  if( pFile->e
37020 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
37030 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
37040 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
37050 0a 20 20 67 65 74 44 62 50 61 74 68 46 6f 72 55  .  getDbPathForU
37060 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64  nixFile(pFile, d
37070 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70  bPath);.  if( !p
37080 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
37090 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
370a0 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
370b0 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d  ){.    lockPath=
370c0 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
370d0 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61     lockPath=(cha
370e0 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20  r *)path;.  }.  
370f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41  .  OSTRACE(("TRA
37100 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20  NSPROXY  %d for 
37110 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %s pid=%d\n", pF
37120 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
37130 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c     (lockPath ? l
37140 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  ockPath : ":auto
37150 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b  :"), getpid()));
37160 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74  ..  pCtx = sqlit
37170 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
37180 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66  f(*pCtx) );.  if
37190 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
371a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
371b0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
371c0 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65  et(pCtx, 0, size
371d0 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72  of(*pCtx));..  r
371e0 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43  c = proxyCreateC
371f0 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50  onchPathname(dbP
37200 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
37210 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66  hFilePath);.  if
37220 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37230 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ){.    rc = prox
37240 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
37250 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
37260 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
37270 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69  hFile, 0);.    i
37280 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
37290 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69 6c  NTOPEN && ((pFil
372a0 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52  e->openFlags&O_R
372b0 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20  DWR) == 0) ){.  
372c0 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74 68      /* if (a) th
372d0 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72 65  e open flags are
372e0 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62 29   not O_RDWR, (b)
372f0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74   the conch isn't
37300 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20 20   there, and.    
37310 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69 6c    ** (c) the fil
37320 65 20 73 79 73 74 65 6d 20 69 73 20 72 65 61 64  e system is read
37330 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62  -only, then enab
37340 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63  le no-locking ac
37350 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  cess..      ** U
37360 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e  gh, since O_RDON
37370 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74 65  LY==0x0000 we te
37380 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20 73  st for !O_RDWR s
37390 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61 73  ince unixOpen as
373a0 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 74  serts.      ** t
373b0 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77 69  hat openFlags wi
373c0 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65  ll have only one
373d0 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20   of O_RDONLY or 
373e0 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f  O_RDWR..      */
373f0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
37400 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
37410 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 63     struct stat c
37420 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20  onchInfo;.      
37430 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d  int goLockless =
37440 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f   0;..      if( o
37450 73 53 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63  sStat(pCtx->conc
37460 68 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63  hFilePath, &conc
37470 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b  hInfo) == -1 ) {
37480 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72  .        int err
37490 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
374a0 20 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45    if( (err==ENOE
374b0 4e 54 29 20 26 26 20 28 73 74 61 74 66 73 28 64  NT) && (statfs(d
374c0 62 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  bPath, &fsInfo) 
374d0 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  != -1) ){.      
374e0 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d      goLockless =
374f0 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73   (fsInfo.f_flags
37500 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20  &MNT_RDONLY) == 
37510 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  MNT_RDONLY;.    
37520 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37530 20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65      if( goLockle
37540 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ss ){.        pC
37550 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
37560 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79  -1; /* read only
37570 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f   FS/ lockless */
37580 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
37590 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
375a0 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69  .    }.  }  .  i
375b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
375c0 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a   && lockPath ){.
375d0 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
375e0 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
375f0 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63  3DbStrDup(0, loc
37600 6b 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  kPath);.    if( 
37610 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
37620 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ath==NULL ){.   
37630 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
37640 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
37650 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
37660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 74 78  E_OK ){.    pCtx
37670 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69 74  ->dbPath = sqlit
37680 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 64 62  e3DbStrDup(0, db
37690 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70  Path);.    if( p
376a0 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d 4e 55 4c  Ctx->dbPath==NUL
376b0 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  L ){.      rc = 
376c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
376d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
376e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
376f0 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79     /* all memory
37700 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70   is allocated, p
37710 72 6f 78 79 73 20 61 72 65 20 63 72 65 61 74 65  roxys are create
37720 64 20 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20  d and assigned, 
37730 0a 20 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74  .    ** switch t
37740 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
37750 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74  xt and pMethod t
37760 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20  hen return..    
37770 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64  */.    pCtx->old
37780 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  LockingContext =
37790 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
377a0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c  ontext;.    pFil
377b0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
377c0 74 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43  t = pCtx;.    pC
377d0 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d  tx->pOldMethod =
377e0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b   pFile->pMethod;
377f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  .    pFile->pMet
37800 68 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65  hod = &proxyIoMe
37810 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
37820 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
37830 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20 20 20 20  nchFile ){ .    
37840 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c    pCtx->conchFil
37850 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
37860 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
37870 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   *)pCtx->conchFi
37880 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
37890 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f  e3_free(pCtx->co
378a0 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
378b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
378c0 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  e(0, pCtx->lockP
378d0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
378e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
378f0 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
37900 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ; .    sqlite3_f
37910 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20  ree(pCtx);.  }. 
37920 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53   OSTRACE(("TRANS
37930 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c  PROXY  %d %s\n",
37940 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
37950 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54        (rc==SQLIT
37960 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
37970 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74  ailed")));.  ret
37980 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
37990 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
379a0 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66  andles sqlite3_f
379b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61  ile_control() ca
379c0 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73 70 65  lls that are spe
379d0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78  cific.** to prox
379e0 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  y locking..*/.st
379f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
37a00 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
37a10 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
37a20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
37a30 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
37a40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
37a50 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
37a60 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  LE: {.      unix
37a70 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
37a80 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
37a90 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f     if( isProxyLo
37aa0 63 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29  ckingMode(pFile)
37ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
37ac0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37ad0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
37ae0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
37af0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
37b00 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f  ext;.        pro
37b10 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
37b20 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
37b30 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
37b40 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
37b50 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
37b60 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f  )pArg = pCtx->lo
37b70 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
37b80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37b90 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
37ba0 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61  ar **)pArg = ":a
37bb0 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22  uto: (not held)"
37bc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37bd0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
37be0 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
37bf0 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a  **)pArg = NULL;.
37c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
37c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37c20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
37c30 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
37c40 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
37c50 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
37c60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
37c70 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
37c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
37c90 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79    int isProxySty
37ca0 6c 65 20 3d 20 69 73 50 72 6f 78 79 4c 6f 63 6b  le = isProxyLock
37cb0 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29 3b 0a  ingMode(pFile);.
37cc0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d        if( pArg==
37cd0 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63  NULL || (const c
37ce0 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b  har *)pArg==0 ){
37cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
37d00 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20  roxyStyle ){.   
37d10 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
37d20 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
37d30 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64   - not supported
37d40 2e 20 20 49 66 20 73 75 70 70 6f 72 74 20 69 73  .  If support is
37d50 20 61 64 64 65 64 20 66 6f 72 0a 20 20 20 20 20   added for.     
37d60 20 20 20 20 20 2a 2a 20 73 77 69 74 63 68 69 6e       ** switchin
37d70 67 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  g proxy locking 
37d80 6d 6f 64 65 20 6f 66 66 20 74 68 65 6e 20 69 74  mode off then it
37d90 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 66 61   will need to fa
37da0 69 6c 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  il if.          
37db0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  ** the journal m
37dc0 6f 64 65 20 69 73 20 57 41 4c 20 6d 6f 64 65 2e  ode is WAL mode.
37dd0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20   .          */. 
37de0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
37df0 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c  LITE_ERROR /*SQL
37e00 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51  ITE_PROTOCOL? SQ
37e10 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a  LITE_MISUSE?*/;.
37e20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
37e30 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e           /* turn
37e40 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69   off proxy locki
37e50 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66  ng - already off
37e60 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20   - NOOP */.     
37e70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
37e80 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
37e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37ea0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
37eb0 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e  proxyPath = (con
37ec0 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a  st char *)pArg;.
37ed0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72          if( isPr
37ee0 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20  oxyStyle ){.    
37ef0 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
37f00 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
37f10 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  = .            (
37f20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37f30 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
37f40 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
37f50 20 20 20 20 20 20 69 66 28 20 21 73 74 72 63 6d        if( !strcm
37f60 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22  p(pArg, ":auto:"
37f70 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
37f80 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
37f90 79 50 61 74 68 20 26 26 0a 20 20 20 20 20 20 20  yPath &&.       
37fa0 20 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70          !strncmp
37fb0 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
37fc0 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c  Path, proxyPath,
37fd0 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20   MAXPATHLEN)).  
37fe0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
37ff0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
38000 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
38010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
38020 20 20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c      rc = switchL
38030 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69  ockProxyPath(pFi
38040 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  le, proxyPath);.
38050 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
38060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38070 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20       /* turn on 
38080 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
38090 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
380a0 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
380b0 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c  ormUnixFile(pFil
380c0 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
380d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
380e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
380f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
38100 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
38110 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68  ert( 0 );  /* Th
38120 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74  e call assures t
38130 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f  hat only valid o
38140 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20  pcodes are sent 
38150 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  */.    }.  }.  /
38160 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
38170 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
38180 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69  ROR;.}../*.** Wi
38190 74 68 69 6e 20 74 68 69 73 20 64 69 76 69 73 69  thin this divisi
381a0 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67  on (the proxying
381b0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
381c0 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f  ntation) the pro
381d0 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65  cedures.** above
381e0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20   this point are 
381f0 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20  all utilities.  
38200 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64  The lock-related
38210 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a   methods of the.
38220 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  ** proxy-locking
38230 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
38240 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77  od object follow
38250 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ..*/.../*.** Thi
38260 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
38270 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
38280 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
38290 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
382a0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
382b0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
382c0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
382d0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
382e0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
382f0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
38300 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
38310 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
38320 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
38330 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
38340 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
38350 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
38360 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
38370 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
38380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
38390 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
383a0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
383b0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
383c0 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46  esOut) {.  unixF
383d0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
383e0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
383f0 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
38400 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
38410 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
38420 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
38430 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
38440 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
38450 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
38460 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
38470 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
38480 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
38490 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
384a0 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
384b0 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
384c0 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65  eturn proxy->pMe
384d0 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65  thod->xCheckRese
384e0 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65  rvedLock((sqlite
384f0 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70  3_file*)proxy, p
38500 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ResOut);.    }el
38510 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64  se{ /* conchHeld
38520 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
38530 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75   */.      pResOu
38540 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t=0;.    }.  }. 
38550 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
38560 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20