/ Hex Artifact Content
Login

Artifact 75eff7b41cdc9f319eb0c610c19fd9bb37093e5d:


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 0a 23 69 66  .h>.#endif...#if
1170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1180: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1190: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
11a0: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
11b0: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11c0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11d0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11e0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11f0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
1200: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
1210: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1220: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1230: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1240: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1250: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1260: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1270: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1280: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1290: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
12a0: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
12b0: 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45  dif..#ifdef HAVE
12c0: 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65  _UTIME.# include
12d0: 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69   <utime.h>.#endi
12e0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  f../*.** Allowed
12f0: 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46   values of unixF
1300: 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23  ile.fsFlags.*/.#
1310: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53  define SQLITE_FS
1320: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20  FLAGS_IS_MSDOS  
1330: 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66     0x1../*.** If
1340: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
1350: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
1360: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
1370: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
1380: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
1390: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
13a0: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
13b0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
13c0: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
13d0: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
13e0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
13f0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
1400: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1410: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1420: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
1430: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1440: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1450: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
1460: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1470: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1480: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
1490: 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72  . ** Default per
14a0: 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72  missions when cr
14b0: 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78  eating auto prox
14c0: 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65  y dir. */.#ifnde
14d0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
14e0: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
14f0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
1500: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
1510: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
1520: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
1530: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
1540: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1550: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1560: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1570: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1580: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1590: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
15a0: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
15b0: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
15c0: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
15d0: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
15e0: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
15f0: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1600: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1610: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
1620: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
1630: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
1640: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1650: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
1660: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
1670: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1680: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1690: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
16a0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
16b0: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
16c0: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
16d0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
16e0: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
16f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1700: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1710: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
1720: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
1730: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
1740: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
1750: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
1760: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1770: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1780: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1790: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
17a0: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
17b0: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
17c0: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
17d0: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
17e0: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
17f0: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1800: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1810: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
1820: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
1830: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
1840: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
1850: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
1860: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
1870: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1880: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1890: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
18a0: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
18d0: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
18e0: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
18f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1900: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1910: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
1920: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
1930: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
1940: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
1950: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1960: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
1970: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1980: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1990: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
19a0: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
19b0: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
19c0: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
19d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
19e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19f0: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1a00: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1a10: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
1a20: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
1a30: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
1a40: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
1a50: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
1a60: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1a90: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1aa0: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1ab0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ad0: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1ae0: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1af0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b20: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1b30: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b40: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b60: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b70: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  .  unsigned shor
1b90: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int ctrlFlags;
1ba0: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1bb0: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1bc0: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1bd0: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1c00: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1c10: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1c20: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1c30: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1c40: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c50: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c60: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c70: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c90: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1ca0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1cb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1cc0: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1cd0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ce0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cf0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1d20: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1d30: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d40: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d70: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d80: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d90: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1da0: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1db0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dd0: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1de0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1df0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1e00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1e10: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1e20: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1e30: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e60: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e70: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e80: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
1e90: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
1ea0: 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20  d *pId;         
1eb0: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
1ec0: 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ID */.#endif.#if
1ed0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
1ee0: 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
1ef0: 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  of variables are
1f00: 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77   used to track w
1f10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1f20: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
1f30: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79  on counter in by
1f40: 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74  tes 24-27 of dat
1f50: 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20  abase files are 
1f60: 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65  updated.  ** whe
1f70: 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f  never any part o
1f80: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
1f90: 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65  hanges.  An asse
1fa0: 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c  rtion fault will
1fb0: 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61  .  ** occur if a
1fc0: 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
1fd0: 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70   without also up
1fe0: 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  dating the trans
1ff0: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e  action.  ** coun
2000: 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74 20  ter.  This test 
2010: 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64  is made to avoid
2020: 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69   new problems si
2030: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
2040: 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20  * one described 
2050: 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e  by ticket #3584.
2060: 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   .  */.  unsigne
2070: 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72  d char transCntr
2080: 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20  Chng;   /* True 
2090: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
20a0: 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on counter chang
20b0: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
20c0: 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b 20   char dbUpdate; 
20d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20e0: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61  f any part of da
20f0: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2100: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
2110: 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57  d char inNormalW
2120: 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20  rite;   /* True 
2130: 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77  if in a normal w
2140: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a  rite operation *
2150: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
2160: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
2170: 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69   In test mode, i
2180: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
2190: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
21a0: 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74  re a bit so that
21b0: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72   .  ** it is lar
21c0: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72  ger than the str
21d0: 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65  uct CrashFile de
21e0: 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63  fined in test6.c
21f0: 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50  ..  */.  char aP
2200: 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64  adding[32];.#end
2210: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
2220: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2230: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72  the unixFile.ctr
2240: 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a  lFlags bitmask:.
2250: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2260: 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20  ILE_EXCL        
2270: 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x01     /* Conn
2280: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65  ections from one
2290: 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f   process only */
22a0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
22b0: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78  E_RDONLY      0x
22c0: 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  02     /* Connec
22d0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
22e0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22f0: 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
2300: 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65  L 0x04     /* Pe
2310: 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64  rsistent WAL mod
2320: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
2330: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2340: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  YNC.# define UNI
2350: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2360: 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72   0x08     /* Dir
2370: 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64  ectory sync need
2380: 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65  ed */.#else.# de
2390: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
23a0: 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65  RSYNC    0x00.#e
23b0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49  ndif.#define UNI
23c0: 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  XFILE_PSOW      
23d0: 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51    0x10     /* SQ
23e0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
23f0: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
2400: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2410: 4c 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30  LE_DELETE      0
2420: 78 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74  x20     /* Delet
2430: 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64  e on close */.#d
2440: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55  efine UNIXFILE_U
2450: 52 49 20 20 20 20 20 20 20 20 20 30 78 34 30 20  RI         0x40 
2460: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
2470: 6d 69 67 68 74 20 68 61 76 65 20 71 75 65 72 79  might have query
2480: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23   parameters */.#
2490: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
24a0: 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30  NOLOCK      0x80
24b0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69       /* Do no fi
24c0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 23 64  le locking */.#d
24d0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 43  efine UNIXFILE_C
24e0: 48 4f 57 4e 20 20 20 20 20 20 30 78 31 30 30 20  HOWN      0x100 
24f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 77 6e 65      /* File owne
2500: 72 73 68 69 70 20 77 61 73 20 63 68 61 6e 67 65  rship was change
2510: 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  d */../*.** Incl
2520: 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73  ude code that is
2530: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f   common to all o
2540: 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23  s_*.c files.*/.#
2550: 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d  include "os_comm
2560: 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  on.h"../*.** Def
2570: 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72  ine various macr
2580: 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73  os that are miss
2590: 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79  ing from some sy
25a0: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
25b0: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
25c0: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
25d0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  LE 0.#endif.#ifd
25e0: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
25f0: 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f  E_LFS.# undef O_
2600: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
2610: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
2620: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2630: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66  O_NOFOLLOW.# def
2640: 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30  ine O_NOFOLLOW 0
2650: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2660: 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e  O_BINARY.# defin
2670: 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e  e O_BINARY 0.#en
2680: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
2690: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
26a0: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
26b0: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
26c0: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
26d0: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
26e0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
26f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
2700: 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  FE.#define threa
2710: 64 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66  did pthread_self
2720: 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  ().#else.#define
2730: 20 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64   threadid 0.#end
2740: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72  if../*.** Differ
2750: 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73  ent Unix systems
2760: 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20   declare open() 
2770: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  in different way
2780: 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20  s.  Same use.** 
2790: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
27a0: 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f  ,int,mode_t).  O
27b0: 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63  thers use open(c
27c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e  onst char*,int,.
27d0: 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..)..** The diff
27e0: 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74  erence is import
27f0: 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61  ant when using a
2800: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2810: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2820: 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74  The safest way t
2830: 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  o deal with the 
2840: 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c  problem is to al
2850: 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72  ways use this wr
2860: 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61  apper.** which a
2870: 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61  lways has the sa
2880: 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20  me well-defined 
2890: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
28a0: 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70  atic int posixOp
28b0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
28c0: 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c  File, int flags,
28d0: 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65   int mode){.  re
28e0: 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c  turn open(zFile,
28f0: 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d   flags, mode);.}
2900: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2910: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2920: 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f   int openDirecto
2930: 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  ry(const char*, 
2940: 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  int*);../*.** Ma
2950: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
2960: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
2970: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
2980: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
2990: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
29a0: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
29b0: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
29c0: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
29d0: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
29e0: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
29f0: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
2a00: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
2a10: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
2a20: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
2a30: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
2a40: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
2a50: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75  .static struct u
2a60: 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  nix_syscall {.  
2a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2a80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2a90: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74   Name of the syt
2aa0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
2ab0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2ac0: 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75   pCurrent; /* Cu
2ad0: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
2ae0: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
2af0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
2b00: 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74  all_ptr pDefault
2b10: 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  ; /* Default val
2b20: 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c  ue */.} aSyscall
2b30: 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e  [] = {.  { "open
2b40: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
2b50: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2b60: 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d  posixOpen,  0  }
2b70: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
2b80: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
2b90: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69  onst char*,int,i
2ba0: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e  nt))aSyscall[0].
2bb0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2bc0: 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28  close",        (
2bd0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2be0: 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20  ptr)close,      
2bf0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2c00: 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28  Close     ((int(
2c10: 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  *)(int))aSyscall
2c20: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [1].pCurrent).. 
2c30: 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20   { "access",    
2c40: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2c50: 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20  all_ptr)access, 
2c60: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2c70: 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28  e osAccess    ((
2c80: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
2c90: 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  r*,int))aSyscall
2ca0: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
2cb0: 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20   { "getcwd",    
2cc0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2cd0: 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20  all_ptr)getcwd, 
2ce0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2cf0: 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28  e osGetcwd    ((
2d00: 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73  char*(*)(char*,s
2d10: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
2d20: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
2d30: 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20  { "stat",       
2d40: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2d50: 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20  ll_ptr)stat,    
2d60: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
2d70: 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69   osStat      ((i
2d80: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
2d90: 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  *,struct stat*))
2da0: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
2db0: 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rent)../*.** The
2dc0: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
2dd0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
2de0: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
2df0: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
2e00: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
2e10: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
2e20: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
2e30: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
2e40: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
2e50: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
2e60: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
2e70: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
2e80: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
2e90: 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f  P.  But it is DO
2ea0: 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75  S - what did you
2eb0: 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64   expect?.*/.#ifd
2ec0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b  ef __DJGPP__.  {
2ed0: 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20   "fstat",       
2ee0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ef0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2f00: 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29  e osFstat(a,b,c)
2f10: 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20      0.#else     
2f20: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2f30: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2f40: 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c  scall_ptr)fstat,
2f50: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2f60: 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20  ine osFstat     
2f70: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72  ((int(*)(int,str
2f80: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
2f90: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
2fa0: 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74  .#endif..  { "ft
2fb0: 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71  runcate",    (sq
2fc0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2fd0: 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20  r)ftruncate,  0 
2fe0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74   },.#define osFt
2ff0: 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29  runcate ((int(*)
3000: 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  (int,off_t))aSys
3010: 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74  call[6].pCurrent
3020: 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20  )..  { "fcntl", 
3030: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3040: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74  syscall_ptr)fcnt
3050: 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  l,      0  },.#d
3060: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20  efine osFcntl   
3070: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69    ((int(*)(int,i
3080: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
3090: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [7].pCurrent).. 
30a0: 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20   { "read",      
30b0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
30c0: 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20  all_ptr)read,   
30d0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
30e0: 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28  e osRead      ((
30f0: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
3100: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3110: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
3120: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3130: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51  USE_PREAD) || SQ
3140: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
3150: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70  ING_STYLE.  { "p
3160: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3170: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3180: 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30  tr)pread,      0
3190: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
31a0: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
31b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
31c0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
31d0: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
31e0: 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20  fine osPread    
31f0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3200: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3210: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39  ff_t))aSyscall[9
3220: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3230: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3240: 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64  AD64).  { "pread
3250: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3260: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3270: 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c  read64,    0  },
3280: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
3290: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
32a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
32b0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
32c0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
32d0: 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73   osPread64   ((s
32e0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
32f0: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3300: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
3310: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77  Current)..  { "w
3320: 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73  rite",        (s
3330: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3340: 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30  tr)write,      0
3350: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57    },.#define osW
3360: 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65  rite     ((ssize
3370: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
3380: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
3390: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
33a0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
33b0: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
33c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
33d0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
33e0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
33f0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3400: 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20  _ptr)pwrite,    
3410: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
3420: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
3430: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3440: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3450: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
3460: 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20  define osPwrite 
3470: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3480: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3490: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a  size_t,off_t))\.
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d      aSyscall[12]
34c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
34d0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
34e0: 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65  D64).  { "pwrite
34f0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3500: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77  3_syscall_ptr)pw
3510: 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a  rite64,   0  },.
3520: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
3530: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
3540: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3550: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3560: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3570: 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73  osPwrite64  ((ss
3580: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
3590: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  st void*,size_t,
35a0: 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20  off_t))\.       
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79               aSy
35c0: 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65  scall[13].pCurre
35d0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
35e0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
35f0: 54 59 4c 45 0a 20 20 7b 20 22 66 63 68 6d 6f 64  TYLE.  { "fchmod
3600: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3610: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
3620: 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  hmod,     0  },.
3630: 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6d 6f  #else.  { "fchmo
3640: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3650: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3660: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3670: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3680: 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e  osFchmod    ((in
3690: 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29  t(*)(int,mode_t)
36a0: 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43  )aSyscall[14].pC
36b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
36c0: 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
36d0: 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
36e0: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
36f0: 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74  TE.  { "fallocat
3700: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
3710: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69  syscall_ptr)posi
3720: 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20  x_fallocate,  0 
3730: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61  },.#else.  { "fa
3740: 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71  llocate",    (sq
3750: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3760: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
3770: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3780: 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63  #define osFalloc
3790: 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74  ate ((int(*)(int
37a0: 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53  ,off_t,off_t))aS
37b0: 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72  yscall[15].pCurr
37c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e  ent)..  { "unlin
37d0: 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  k",       (sqlit
37e0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75  e3_syscall_ptr)u
37f0: 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20  nlink,          
3800: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3810: 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28  Unlink    ((int(
3820: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  *)(const char*))
3830: 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75  aSyscall[16].pCu
3840: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65  rrent)..  { "ope
3850: 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20  nDirectory",    
3860: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3870: 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f  _ptr)openDirecto
3880: 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64  ry,      0 },.#d
3890: 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65  efine osOpenDire
38a0: 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63  ctory ((int(*)(c
38b0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29  onst char*,int*)
38c0: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
38d0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b  urrent)..  { "mk
38e0: 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71  dir",        (sq
38f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3900: 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20  r)mkdir,        
3910: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3920: 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e  osMkdir     ((in
3930: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3940: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3950: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
3960: 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20  .  { "rmdir",   
3970: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3980: 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c  scall_ptr)rmdir,
3990: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
39a0: 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20  #define osRmdir 
39b0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
39c0: 73 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61  st char*))aSysca
39d0: 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[19].pCurrent)
39e0: 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20  ..  { "fchown", 
39f0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3a00: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f 77  yscall_ptr)fchow
3a10: 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  n,          0 },
3a20: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6f 77  .#define osFchow
3a30: 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  n    ((int(*)(in
3a40: 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29 29 61  t,uid_t,gid_t))a
3a50: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
3a60: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6d 61 73  rent)..  { "umas
3a70: 6b 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  k",        (sqli
3a80: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3a90: 75 6d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  umask,          
3aa0: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3ab0: 55 6d 61 73 6b 20 20 20 20 20 28 28 6d 6f 64 65  Umask     ((mode
3ac0: 5f 74 28 2a 29 28 6d 6f 64 65 5f 74 29 29 61 53  _t(*)(mode_t))aS
3ad0: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
3ae0: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
3af0: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
3b00: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
3b10: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
3b20: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
3b30: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
3b40: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
3b50: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
3b60: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
3b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3b80: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
3b90: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
3ba0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
3bb0: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
3bc0: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
3bd0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
3be0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
3bf0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
3c00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c10: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
3c20: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
3c30: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
3c40: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
3c50: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
3c60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3c70: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
3c80: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
3c90: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
3ca0: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
3cb0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3cc0: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
3cd0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
3ce0: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
3cf0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
3d00: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
3d10: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3d20: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3d30: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
3d40: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
3d50: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
3d60: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
3d70: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
3d80: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
3d90: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
3da0: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
3db0: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
3dc0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
3dd0: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
3de0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
3df0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
3e00: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
3e10: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
3e20: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
3e30: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
3e40: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
3e50: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3e60: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
3e70: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3e80: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
3e90: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
3ea0: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
3eb0: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
3ec0: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
3ed0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
3ee0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3ef0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3f00: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3f10: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
3f20: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
3f30: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
3f40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
3f50: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3f60: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
3f70: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
3f80: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
3f90: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
3fa0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
3fb0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3fc0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
3fd0: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
3fe0: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
3ff0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4000: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
4010: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
4020: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
4030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4040: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4050: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4060: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4070: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
4080: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
4090: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
40a0: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
40b0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
40c0: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
40d0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
40e0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
40f0: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
4100: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
4110: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
4120: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
4130: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
4140: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
4150: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4160: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
4170: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
4180: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4190: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
41a0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
41b0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
41c0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
41d0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
41e0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
41f0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
4200: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
4210: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
4220: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4230: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4240: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
4250: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
4260: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
4270: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
4280: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
4290: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
42a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
42b0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
42c0: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
42d0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
42e0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
42f0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
4300: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
4310: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
4320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
4330: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
4340: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
4350: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4360: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
4370: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4380: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
4390: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
43a0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
43b0: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
43c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
43d0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
43e0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
43f0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
4400: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
4410: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
4420: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
4430: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4440: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
4450: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
4460: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
4470: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4480: 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e  * Invoke open().
4490: 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65    Do so multiple
44a0: 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74   times, until it
44b0: 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64 73   either succeeds
44c0: 20 6f 72 0a 2a 2a 20 66 69 6c 65 73 20 66 6f 72   or.** files for
44d0: 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68   some reason oth
44e0: 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a  er than EINTR..*
44f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
4500: 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22   creation mode "
4510: 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65 74  m" is 0 then set
4520: 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75   it to the defau
4530: 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65  lt for.** SQLite
4540: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
4550: 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  s SQLITE_DEFAULT
4560: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
4570: 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30  S (normally.** 0
4580: 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64  644) as modified
4590: 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20 75   by the system u
45a0: 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e  mask.  If m is n
45b0: 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61  ot 0, then.** ma
45c0: 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65 61  ke the file crea
45d0: 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61  tion mode be exa
45e0: 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20  ctly m ignoring 
45f0: 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  the umask..**.**
4600: 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72   The m parameter
4610: 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72   will be non-zer
4620: 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61  o only when crea
4630: 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72  ting -wal, -jour
4640: 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d  nal,.** and -shm
4650: 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74   files.  We want
4660: 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20   those files to 
4670: 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74  have *exactly* t
4680: 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69  he same.** permi
4690: 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20  ssions as their 
46a0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
46b0: 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64  e, unadulterated
46c0: 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
46d0: 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69  * In that way, i
46e0: 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
46f0: 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f  e is -rw-rw-rw o
4700: 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64  r -rw-rw-r-, and
4710: 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f   a.** transactio
4720: 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65  n crashes and le
4730: 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20  aves behind hot 
4740: 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61  journals, then a
4750: 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68  ny.** process th
4760: 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72  at is able to wr
4770: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
4780: 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65  ase will also be
4790: 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f   able to.** reco
47a0: 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ver the hot jour
47b0: 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nals..*/.static 
47c0: 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  int robust_open(
47d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
47e0: 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b  nt f, mode_t m){
47f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 6f 64  .  int rc;.  mod
4800: 65 5f 74 20 6d 32 3b 0a 20 20 6d 6f 64 65 5f 74  e_t m2;.  mode_t
4810: 20 6f 72 69 67 4d 20 3d 20 30 3b 0a 20 20 69 66   origM = 0;.  if
4820: 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 32  ( m==0 ){.    m2
4830: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
4840: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
4850: 4e 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NS;.  }else{.   
4860: 20 6d 32 20 3d 20 6d 3b 0a 20 20 20 20 6f 72 69   m2 = m;.    ori
4870: 67 4d 20 3d 20 6f 73 55 6d 61 73 6b 28 30 29 3b  gM = osUmask(0);
4880: 0a 20 20 7d 0a 20 20 64 6f 7b 20 72 63 20 3d 20  .  }.  do{ rc = 
4890: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 20  osOpen(z,f,m2); 
48a0: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
48b0: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
48c0: 20 20 69 66 28 20 6d 20 29 7b 0a 20 20 20 20 6f    if( m ){.    o
48d0: 73 55 6d 61 73 6b 28 6f 72 69 67 4d 29 3b 0a 20  sUmask(origM);. 
48e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
48f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
4900: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
4910: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
4920: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
4930: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
4940: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
4950: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
4960: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
4970: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
4980: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
4990: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
49a0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
49b0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
49c0: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
49d0: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
49e0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
49f0: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
4a00: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
4a10: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
4a20: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
4a30: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
4a40: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
4a50: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
4a60: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
4a70: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
4a80: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
4a90: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
4aa0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
4ab0: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
4ac0: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
4ad0: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
4ae0: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
4af0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4b00: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
4b10: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
4b20: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
4b30: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
4b40: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
4b50: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
4b60: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
4b70: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
4b80: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
4b90: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
4ba0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
4bb0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
4bc0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76   unixMutexHeld(v
4bd0: 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
4be0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4bf0: 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
4c00: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
4c10: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
4c20: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
4c30: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4c40: 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
4c50: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
4c60: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
4c70: 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69  ction for printi
4c80: 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66  ng out trace inf
4c90: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65  ormation from de
4ca0: 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72  bugging.** binar
4cb0: 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e  ies. This return
4cc0: 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  s the string rep
4cd0: 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  resetation of th
4ce0: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
4cf0: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
4d00: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4d10: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
4d20: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
4d30: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
4d40: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
4d50: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
4d60: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
4d70: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
4d80: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
4d90: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
4da0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
4db0: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
4dc0: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
4dd0: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
4de0: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
4df0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
4e00: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
4e10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
4e20: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
4e30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4e40: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
4e50: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
4e60: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
4e70: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
4e80: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
4e90: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4ea0: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
4eb0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
4ec0: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
4ed0: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
4ee0: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
4ef0: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
4f00: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
4f10: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
4f20: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
4f30: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
4f40: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
4f50: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
4f60: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
4f70: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
4f80: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
4f90: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
4fa0: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
4fb0: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
4fc0: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
4fd0: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
4fe0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
4ff0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
5000: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
5010: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
5020: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
5030: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
5040: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
5050: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5060: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
5070: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
5080: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
5090: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
50a0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
50b0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
50c0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
50d0: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
50e0: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
50f0: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5100: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5110: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
5120: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5130: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
5140: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
5150: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
5160: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
5170: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
5180: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
5190: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
51a0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
51b0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
51c0: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
51d0: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
51e0: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
51f0: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
5200: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
5210: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
5220: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
5230: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
5240: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
5250: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
5260: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
5270: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
5280: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
5290: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
52a0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
52b0: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
52c0: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
52d0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
52e0: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
52f0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
5300: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5310: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
5320: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5330: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
5340: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
5350: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5360: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5370: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
5380: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5390: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
53a0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
53b0: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
53c0: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
53d0: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
53e0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
53f0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
5400: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
5410: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
5420: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
5430: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
5440: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
5450: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
5460: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
5470: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
5480: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
5490: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
54a0: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
54b0: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
54c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
54d0: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
54e0: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
54f0: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
5500: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
5510: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
5520: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
5530: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
5540: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5550: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5560: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
5570: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
5580: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
5590: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
55a0: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
55b0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
55c0: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
55d0: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
55e0: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
55f0: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
5600: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
5610: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
5620: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
5630: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
5640: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
5650: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
5660: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
5670: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
5680: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
5690: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
56a0: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
56b0: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
56c0: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
56d0: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
56e0: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
56f0: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
5700: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
5710: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
5720: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
5730: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
5740: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
5750: 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28  rr) {.  switch (
5760: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69  posixError) {.#i
5770: 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  f 0.  /* At one 
5780: 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20  point this code 
5790: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65  was not commente
57a0: 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79  d out. In theory
57b0: 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  , this branch.  
57c0: 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ** should never 
57d0: 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20  be hit, as this 
57e0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
57f0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
5800: 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  fter.  ** a lock
5810: 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63  ing-related func
5820: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c  tion (i.e. fcntl
5830: 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64  ()) has returned
5840: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20   non-zero with. 
5850: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
5860: 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69   errno as the fi
5870: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69  rst argument. Si
5880: 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c  nce a system cal
5890: 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20  l has failed,.  
58a0: 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20  ** errno should 
58b0: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a  be non-zero..  *
58c0: 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74  *.  ** Despite t
58d0: 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65  his, if errno re
58e0: 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65  ally is zero, we
58f0: 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e   still don't wan
5900: 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  t to return.  **
5910: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
5920: 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c  system call fail
5930: 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53  ed, and *some* S
5940: 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75  QLite error shou
5950: 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61  ld be.  ** propa
5960: 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68  gated back to th
5970: 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e  e caller. Commen
5980: 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68  ting this branch
5990: 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f   out means errno
59a0: 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ==0.  ** will be
59b0: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
59c0: 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20  "default:" case 
59d0: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  below..  */.  ca
59e0: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
59f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
5a00: 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41  dif..  case EAGA
5a10: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
5a20: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
5a30: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
5a40: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
5a50: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
5a60: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
5a70: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
5a80: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
5a90: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
5aa0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
5ab0: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
5ac0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
5ad0: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
5ae0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
5af0: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
5b00: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
5b10: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
5b20: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
5b30: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
5b40: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
5b50: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
5b60: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
5b70: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
5b80: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
5b90: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
5ba0: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  _UNLOCK) || ..(s
5bb0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
5bc0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
5bd0: 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f  K) ||..(sqliteIO
5be0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
5bf0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
5c00: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
5c10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5c20: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
5c30: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
5c40: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
5c50: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
5c60: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
5c70: 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69   .  /* EDEADLK i
5c80: 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
5c90: 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e  if a call to fcn
5ca0: 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20  tl(F_SETLKW) is 
5cb0: 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74  made. And.  ** t
5cc0: 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72  his module never
5cd0: 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61   makes such a ca
5ce0: 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65  ll. And the code
5cf0: 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c   in SQLite itsel
5d00: 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20  f .  ** asserts 
5d10: 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52  that SQLITE_IOER
5d20: 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76  R_BLOCKED is nev
5d30: 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72  er returned. For
5d40: 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20   these reasons. 
5d50: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73   ** this case is
5d60: 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
5d70: 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74  out. If the syst
5d80: 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e  em does set errn
5d90: 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20  o to EDEADLK,.  
5da0: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53  ** the default S
5db0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
5dc0: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74  code will be ret
5dd0: 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a  urned. */.#if 0.
5de0: 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a    case EDEADLK:.
5df0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5e00: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b  E_IOERR_BLOCKED;
5e10: 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
5e20: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
5e30: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
5e40: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
5e50: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
5e60: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
5e70: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
5e80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
5e90: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
5ea0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
5eb0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
5ec0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
5ed0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
5ee0: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
5ef0: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
5f00: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
5f10: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
5f20: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
5f30: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
5f40: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
5f50: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
5f60: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
5f70: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
5f80: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
5f90: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
5fa0: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
5fb0: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
5fc0: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
5fd0: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66  case ENOENT:.#if
5fe0: 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20  def ESTALE      
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6000: 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20  * ESTALE is not 
6010: 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72  defined on Inter
6020: 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ix systems */.  
6030: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e  case ESTALE:.#en
6040: 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  dif.  case ENOSY
6050: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
6060: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
6070: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
6080: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
6090: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
60a0: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
60b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
60c0: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a  rr;.  }.}..../**
60d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
6120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
6130: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
6140: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
6150: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
6160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
6170: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
6180: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
6190: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
61a0: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
61b0: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
61c0: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
61d0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
61e0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
61f0: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
6200: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
6210: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
6220: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
6230: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
6240: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
6250: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
6260: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
6270: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
6280: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6290: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
62a0: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
62b0: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
62c0: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
62d0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
62e0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
62f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
6300: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
6310: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
6320: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6330: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
6340: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
6350: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
6360: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
6370: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
6380: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
6390: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
63a0: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
63b0: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
63c0: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
63d0: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
63e0: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
63f0: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
6400: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
6410: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
6420: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6430: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
6440: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
6450: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6460: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
6470: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
6480: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
6490: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
64b0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
64c0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
64d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6500: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
6510: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
6520: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
6530: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
6540: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
6550: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
6560: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
6570: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
6580: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
6590: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
65a0: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
65b0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
65c0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
65d0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
65e0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
65f0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
6600: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
6610: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
6620: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
6630: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
6640: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
6650: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
6660: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
6670: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
6680: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
6690: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
66a0: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
66b0: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
66c0: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
66d0: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
66e0: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
66f0: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
6700: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
6710: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
6720: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
6730: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
6740: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
6750: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
6760: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
6770: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
6780: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
6790: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
67a0: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
67b0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
67c0: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
67d0: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
67e0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
67f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
6800: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
6810: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
6820: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
6830: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6840: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
6850: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
6860: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
6870: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6890: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
68a0: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
68b0: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
68c0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
68d0: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
68e0: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
68f0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
6900: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
6910: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
6920: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6940: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
6950: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
6960: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
6970: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
6980: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
6990: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
69a0: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
69b0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
69c0: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
69d0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
69e0: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
69f0: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
6a00: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
6a10: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
6a20: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
6a30: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
6a40: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
6a50: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
6a60: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
6a70: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
6a80: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
6a90: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
6aa0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
6ab0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6ac0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
6ad0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6ae0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
6af0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6b00: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
6b10: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
6b20: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
6b30: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
6b40: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
6b50: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
6b60: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
6b70: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
6b80: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
6b90: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6ba0: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
6bb0: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
6bc0: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
6bd0: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
6be0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
6c10: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
6c20: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
6c30: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
6c40: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
6c50: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
6c60: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
6c70: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
6c80: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
6c90: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
6ca0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
6cb0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
6cc0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
6cd0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
6ce0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
6cf0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
6d00: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
6d10: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
6d20: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
6d30: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
6d40: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
6d50: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
6d60: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
6d70: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
6d80: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
6d90: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
6da0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
6db0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
6dc0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6dd0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
6de0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
6df0: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
6e00: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
6e10: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
6e20: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
6e30: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
6e40: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
6e50: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
6e60: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
6e70: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
6e80: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
6e90: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
6ea0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6eb0: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
6ec0: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
6ed0: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
6ee0: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
6ef0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
6f00: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
6f10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
6f20: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
6f30: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
6f40: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
6f50: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
6f60: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
6f70: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
6f80: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
6f90: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
6fa0: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
6fb0: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
6fc0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
6fd0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
6fe0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
7000: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7010: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
7020: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
7030: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
7040: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
7050: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
7060: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
7070: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
7080: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
7090: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
70a0: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
70b0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
70c0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
70d0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
70e0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
70f0: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
7100: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
7110: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
7120: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
7130: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
7140: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
7150: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
7160: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
7170: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
7180: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
7190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
71a0: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
71b0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
71c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
71d0: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
71e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
71f0: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
7200: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
7210: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
7220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
7230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
7280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
72f0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
7320: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
7330: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
7340: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
7350: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
7360: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
7370: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
7380: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
7390: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
73a0: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
73b0: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
73c0: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
73d0: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
73e0: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
73f0: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
7400: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
7410: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
7420: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
7430: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
7440: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
7450: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
7460: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
7470: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
7480: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
7490: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
74a0: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
74b0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
74c0: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
74d0: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
74e0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
74f0: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
7500: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
7510: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
7520: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
7530: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
7540: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
7550: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
7560: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
7570: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
7580: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
7590: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
75a0: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
75b0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
75c0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
75d0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
75e0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
75f0: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
7600: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
7610: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
7620: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
7630: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
7640: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
7650: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
7660: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
7670: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
7680: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
7690: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
76a0: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
76b0: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
76c0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
76d0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
76e0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
76f0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
7700: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
7710: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
7720: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
7730: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
7740: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
7750: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
7760: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
7770: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
7780: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
7790: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
77a0: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
77b0: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
77c0: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
77d0: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
77e0: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
77f0: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
7800: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
7810: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
7820: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
7830: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
7840: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
7850: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
7860: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
7870: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
7880: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
7890: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
78a0: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
78b0: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
78c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
78d0: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
78e0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
78f0: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
7900: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
7910: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
7920: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
7930: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
7940: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
7950: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
7960: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
7970: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
7980: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
7990: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
79a0: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
79b0: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
79c0: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
79d0: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
79e0: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
79f0: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
7a00: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
7a10: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
7a20: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
7a30: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
7a40: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
7a50: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
7a60: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
7a70: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
7a80: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
7a90: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
7aa0: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
7ab0: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
7ac0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
7ad0: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
7ae0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
7af0: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
7b00: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
7b10: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
7b20: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
7b30: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
7b40: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
7b50: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
7b60: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
7b70: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
7b80: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
7b90: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
7ba0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
7bb0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
7bc0: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
7bd0: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
7be0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7bf0: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
7c00: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
7c10: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
7c20: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
7c30: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
7c40: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
7c50: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
7c60: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
7c70: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
7c80: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
7c90: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
7ca0: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
7cb0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
7cc0: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
7cd0: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
7ce0: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
7cf0: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
7d00: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
7d10: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
7d20: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
7d30: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
7d40: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
7d50: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
7d60: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
7d70: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
7d80: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
7d90: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
7da0: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
7db0: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
7dc0: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
7dd0: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
7de0: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
7df0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
7e00: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
7e10: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
7e20: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
7e30: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
7e40: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
7e50: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
7e60: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
7e70: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
7e80: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
7e90: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
7ea0: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
7eb0: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
7ec0: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
7ed0: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
7ee0: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
7ef0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
7f00: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
7f10: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
7f20: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
7f30: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
7f40: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
7f50: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
7f60: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
7f70: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
7f80: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
7f90: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
7fa0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
7fb0: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
7fc0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
7fd0: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
7fe0: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
7ff0: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
8000: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
8010: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
8020: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
8030: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
8040: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
8050: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
8060: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
8070: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
8080: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
8090: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
80a0: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
80b0: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
80c0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
80d0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
80e0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
80f0: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
8100: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
8110: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
8120: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
8130: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
8140: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
8150: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
8160: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
8170: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
8180: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
8190: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
81a0: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
81b0: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
81c0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
81d0: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
81e0: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
81f0: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
8200: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
8210: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
8220: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
8230: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
8240: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
8250: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
8260: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
8270: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
8280: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
8290: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
82a0: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
82b0: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
82c0: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
82d0: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
82e0: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
82f0: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
8300: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
8310: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
8320: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
8330: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
8340: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
8350: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
8360: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
8370: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
8380: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
8390: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
83a0: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
83b0: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
83c0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
83d0: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
83e0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
83f0: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
8400: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
8410: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
8420: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
8430: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
8440: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
8450: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
8460: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
8470: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
8480: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
8490: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
84a0: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
84b0: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
84c0: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
84d0: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
84e0: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
84f0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
8500: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
8510: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
8520: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
8530: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
8540: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
8550: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
8560: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
8570: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
8580: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8590: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
85a0: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
85b0: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
85c0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
85d0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
85e0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
85f0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
8600: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
8610: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
8620: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
8630: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8640: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
8670: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
8680: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
8690: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
86a0: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
86b0: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
86c0: 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74  */.#else.  ino_t
86d0: 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20   ino;           
86e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20         /* Inode 
86f0: 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66  number */.#endif
8700: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
8710: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
8720: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
8730: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  e is allocated f
8740: 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20  or each open.** 
8750: 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c  inode.  Or, on L
8760: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65  inuxThreads, the
8770: 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  re is one of the
8780: 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  se structures fo
8790: 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20  r.** each inode 
87a0: 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74  opened by each t
87b0: 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  hread..**.** A s
87c0: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
87d0: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
87e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
87f0: 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65  so each unixFile
8800: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f  .** structure co
8810: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
8820: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
8830: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61  of this object a
8840: 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63  nd this.** objec
8850: 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20  t keeps a count 
8860: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
8870: 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69   unixFile pointi
8880: 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72  ng to it..*/.str
8890: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
88a0: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
88b0: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
88c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
88d0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
88e0: 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   nShared;       
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8900: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
8910: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
8920: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65   unsigned char e
8930: 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  FileLock;       
8940: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
8950: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
8960: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
8970: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50  unsigned char bP
8980: 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20  rocessLock;     
8990: 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20  /* An exclusive 
89a0: 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20  process lock is 
89b0: 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  held */.  int nR
89c0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
89d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
89e0: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
89f0: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
8a00: 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  e */.  unixShmNo
8a10: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
8a20: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
8a30: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
8a40: 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f  ed with this ino
8a50: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63  de */.  int nLoc
8a60: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
8a70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8a80: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
8a90: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20   file locks */. 
8aa0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
8ab0: 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20  Unused;         
8ac0: 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20   /* Unused file 
8ad0: 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63  descriptors to c
8ae0: 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  lose */.  unixIn
8af0: 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20  odeInfo *pNext; 
8b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
8b10: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  t of all unixIno
8b20: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  deInfo objects *
8b30: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
8b40: 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20  o *pPrev;       
8b50: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
8b60: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
8b70: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
8b80: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
8b90: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
8ba0: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
8bb0: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
8bc0: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
8bd0: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ck */.#endif.#if
8be0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
8bf0: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c10: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
8c20: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
8c30: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
8c40: 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e  THNAME+2];  /* N
8c50: 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61  ame of that sema
8c60: 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  phore */.#endif.
8c70: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  };../*.** A list
8c80: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  s of all unixIno
8c90: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a  deInfo objects..
8ca0: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e  */.static unixIn
8cb0: 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69  odeInfo *inodeLi
8cc0: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a  st = 0;../*.**.*
8cd0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8ce0: 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78  - unixLogError_x
8cf0: 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  (), is only ever
8d00: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
8d10: 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67  macro.** unixLog
8d20: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Error()..**.** I
8d30: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  t is invoked aft
8d40: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
8d50: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
8d60: 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68  tion and errno h
8d70: 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20  as been.** set. 
8d80: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
8d90: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
8da0: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
8db0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
8dc0: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61  ue of.** errno a
8dd0: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
8de0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
8df0: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
8e00: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
8e10: 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  r.** strerror_r(
8e20: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  )..**.** The fir
8e30: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
8e40: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
8e50: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
8e60: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
8e70: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
8e80: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
8e90: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
8ea0: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
8eb0: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
8ec0: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
8ed0: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
8ee0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
8ef0: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
8f00: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28  that.** failed (
8f10: 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22  e.g. "unlink", "
8f20: 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74  open") and the t
8f30: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
8f40: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
8f50: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
8f60: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
8f70: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
8f80: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
8f90: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
8fa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8fb0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
8fc0: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
8ff0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
9000: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
9010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9020: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
9030: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
9040: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9050: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
9060: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
9070: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9080: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
9090: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
90b0: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
90c0: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
90d0: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
90e0: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9100: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
9110: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
9120: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
9130: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9150: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
9160: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
9170: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
9180: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
9190: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
91a0: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
91b0: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
91c0: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
91d0: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
91e0: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
91f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
9200: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
9210: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
9220: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
9230: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
9240: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
9250: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
9260: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
9270: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
9280: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
9290: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
92a0: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
92b0: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
92c0: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
92d0: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
92e0: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
92f0: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
9300: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
9310: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
9320: 73 20 74 68 65 20 74 68 65 20 47 4e 55 20 76 65  s the the GNU ve
9330: 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f  rsion of strerro
9340: 72 5f 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a  r_r() that .  **
9350: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
9360: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
9370: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
9380: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
9390: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
93a0: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
93b0: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
93c0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
93d0: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
93e0: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
93f0: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
9400: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
9410: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
9420: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
9430: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
9440: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
9450: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
9460: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
9470: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
9480: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
9490: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
94a0: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
94b0: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
94c0: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
94d0: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
94e0: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
94f0: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
9500: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
9510: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
9520: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
9530: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
9540: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
9550: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
9560: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
9570: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
9580: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
9590: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
95a0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
95b0: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
95c0: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
95d0: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
95e0: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
95f0: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
9600: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
9610: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
9620: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
9630: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
9640: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
9650: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
9660: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
9670: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
9680: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
9690: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
96a0: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
96b0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
96c0: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
96d0: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
96e0: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
96f0: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
9700: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
9710: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
9720: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
9730: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
9740: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
9750: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
9760: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
9770: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
9780: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
9790: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
97a0: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
97b0: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
97c0: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
97d0: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
97e0: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
97f0: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
9800: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
9810: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
9820: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
9830: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
9840: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
9850: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
9860: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
9870: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
9880: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
9890: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
98a0: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
98b0: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
98c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
98d0: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
98e0: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
98f0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
9900: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
9910: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
9920: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
9930: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
9940: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
9950: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
9960: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
9970: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9980: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
9990: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
99a0: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
99b0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
99c0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
99d0: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
9a00: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
9a10: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
9a20: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
9a30: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
9a40: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
9a50: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
9a60: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
9a70: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
9a80: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
9a90: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
9aa0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9ab0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
9ac0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
9ad0: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
9ae0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
9af0: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
9b00: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
9b10: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
9b20: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
9b30: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
9b40: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
9b50: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
9b60: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
9b70: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
9b80: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
9b90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
9ba0: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
9bb0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
9bc0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
9bd0: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
9be0: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
9bf0: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
9c00: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
9c10: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
9c20: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
9c30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9c40: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
9c50: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
9c60: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
9c70: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
9c80: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
9c90: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9ca0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
9cb0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
9cc0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
9cd0: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
9ce0: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
9cf0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
9d00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
9d10: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
9d20: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
9d30: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
9d40: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
9d50: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
9d60: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
9d70: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
9d80: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
9d90: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
9da0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
9db0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
9dc0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
9dd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9de0: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
9df0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
9e00: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
9e10: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
9e20: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
9e30: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
9e40: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
9e50: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
9e60: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
9e70: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
9e80: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
9e90: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
9ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
9eb0: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
9ec0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9ed0: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
9ee0: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
9ef0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9f00: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
9f10: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
9f20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
9f30: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
9f40: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
9f50: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
9f60: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75  value might be u
9f70: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
9f80: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
9f90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
9fa0: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
9fb0: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
9fc0: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
9fd0: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
9fe0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
9ff0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
a000: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
a010: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
a020: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a030: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
a040: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
a050: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
a060: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
a070: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
a080: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
a090: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a0a0: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
a0b0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
a0c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a0d0: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
a0e0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
a110: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
a120: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a140: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
a150: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
a160: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
a170: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
a180: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
a190: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
a1a0: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
a1b0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
a1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
a1d0: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
a1e0: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
a1f0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
a200: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
a210: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
a220: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
a230: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
a240: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
a250: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
a260: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
a270: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
a280: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
a290: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
a2a0: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
a2b0: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
a2c0: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
a2d0: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
a2e0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
a2f0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
a300: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a310: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
a320: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
a330: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
a340: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
a350: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
a360: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
a370: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a380: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
a390: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
a3a0: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
a3b0: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
a3c0: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
a3d0: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
a3e0: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
a3f0: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
a400: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
a410: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
a420: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
a430: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
a440: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
a450: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
a460: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
a470: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
a480: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
a490: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
a4a0: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
a4b0: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
a4c0: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
a4d0: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
a4e0: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
a4f0: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
a500: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
a510: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
a520: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
a530: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
a540: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
a550: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
a560: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
a570: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
a580: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
a590: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
a5a0: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
a5b0: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
a5c0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
a5d0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
a5e0: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
a5f0: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
a600: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
a610: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
a620: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
a630: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
a640: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
a650: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
a660: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
a670: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
a680: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
a690: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
a6a0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a6b0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
a6c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a6d0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OERR;.    }.    
a6e0: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
a6f0: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
a700: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
a710: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a720: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
a730: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a740: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
a750: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
a760: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
a770: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
a780: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
a790: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
a7a0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
a7b0: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
a7c0: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
a7d0: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74   fileId.ino = st
a7e0: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
a7f0: 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ndif.  pInode = 
a800: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  inodeList;.  whi
a810: 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65  le( pInode && me
a820: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
a830: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73  Inode->fileId, s
a840: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29  izeof(fileId)) )
a850: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70  {.    pInode = p
a860: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a870: 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d  }.  if( pInode==
a880: 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  0 ){.    pInode 
a890: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
a8a0: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
a8b0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
a8c0: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
a8d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a8e0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
a8f0: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
a900: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
a910: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
a920: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
a930: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
a940: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
a950: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
a960: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
a970: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
a980: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
a990: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
a9a0: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
a9b0: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
a9c0: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
a9d0: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
a9e0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
a9f0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
aa00: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
aa10: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
aa20: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
aa30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
aa40: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
aa50: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
aa60: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
aa70: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
aa80: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
aa90: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
aaa0: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
aab0: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
aac0: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
aad0: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
aae0: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
aaf0: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
ab00: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
ab10: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
ab20: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
ab30: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
ab40: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
ab50: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
ab60: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
ab70: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
ab80: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
ab90: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
aba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
abb0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
abc0: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
abd0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
abe0: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
abf0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
ac00: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
ac10: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
ac20: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
ac30: 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45  pFile );.  unixE
ac40: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
ac50: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
ac60: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
ac70: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
ac80: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  /..  /* Check if
ac90: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
aca0: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
acb0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
acc0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
acd0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
ace0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
acf0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
ad00: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
ad10: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
ad20: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
ad30: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ds it..  */.#ifn
ad40: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
ad50: 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26  if( !reserved &&
ad60: 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d   !pFile->pInode-
ad70: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b  >bProcessLock ){
ad80: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
ad90: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b  k lock;.    lock
ada0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
adb0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
adc0: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
add0: 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  D_BYTE;.    lock
ade0: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20  .l_len = 1;.    
adf0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ae00: 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f  WRLCK;.    if( o
ae10: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
ae20: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
ae30: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
ae40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
ae50: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
ae60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
ae70: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ae80: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
ae90: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
aea0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
aeb0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
aec0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
aed0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
aee0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
aef0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
af00: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
af10: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
af20: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
af30: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
af40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
af50: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
af60: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
af70: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
af80: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
af90: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
afa0: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
afb0: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
afc0: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
afd0: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
afe0: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
aff0: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
b000: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
b010: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
b020: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
b030: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
b040: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
b050: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
b060: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
b070: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
b080: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
b090: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
b0a0: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
b0b0: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
b0c0: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
b0d0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
b0e0: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
b0f0: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
b100: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
b110: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
b120: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
b130: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
b140: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
b150: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
b160: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
b170: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
b180: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
b190: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
b1a0: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
b1b0: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
b1c0: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
b1d0: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
b1e0: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
b1f0: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
b200: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
b210: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
b220: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
b230: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
b240: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
b250: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
b260: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
b270: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
b280: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
b290: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
b2a0: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
b2b0: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
b2c0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
b2d0: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
b2e0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
b2f0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
b300: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
b310: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
b320: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
b330: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
b340: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
b350: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
b360: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
b370: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
b380: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
b390: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
b3a0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
b3b0: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
b3c0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
b3d0: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
b3e0: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
b3f0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
b400: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
b410: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
b420: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
b430: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
b440: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
b450: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b460: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
b470: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
b480: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
b490: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
b4a0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
b4b0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
b4c0: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
b4d0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
b4e0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
b4f0: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
b500: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
b510: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
b520: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
b530: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
b540: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
b550: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
b560: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
b570: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
b580: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
b590: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
b5a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b5b0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
b5c0: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
b5d0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
b5e0: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
b5f0: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
b600: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
b610: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
b620: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
b630: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
b640: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
b650: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
b660: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
b670: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
b680: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
b690: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
b6a0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
b6b0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
b6c0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
b6d0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
b6e0: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
b6f0: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
b700: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
b710: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
b720: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
b730: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
b740: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
b750: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
b760: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
b770: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
b780: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
b790: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
b7a0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
b7b0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
b7c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
b7d0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
b7e0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
b7f0: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
b800: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
b810: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
b820: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
b830: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
b840: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
b850: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
b860: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
b870: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
b880: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
b890: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
b8a0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
b8b0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
b8c0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
b8d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b8e0: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
b8f0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
b900: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
b910: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
b920: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
b930: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b940: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
b950: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
b960: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
b970: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
b980: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
b990: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
b9a0: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
b9b0: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
b9c0: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
b9d0: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
b9e0: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
b9f0: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
ba00: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
ba10: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
ba20: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
ba30: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
ba40: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
ba50: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
ba60: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
ba70: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
ba80: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
ba90: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
baa0: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
bab0: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
bac0: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
bad0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
bae0: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
baf0: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
bb00: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
bb10: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
bb20: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
bb30: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
bb40: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
bb50: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
bb60: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
bb70: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
bb80: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
bb90: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
bba0: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
bbb0: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
bbc0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
bbd0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
bbe0: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
bbf0: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
bc00: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
bc10: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
bc20: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
bc30: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
bc40: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
bc50: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
bc60: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
bc70: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
bc80: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
bc90: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
bca0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
bcb0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
bcc0: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
bcd0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
bce0: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
bcf0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
bd00: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
bd10: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
bd20: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
bd30: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
bd40: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
bd50: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
bd60: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
bd70: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
bd80: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
bd90: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
bda0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
bdb0: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
bdc0: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
bdd0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
bde0: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
bdf0: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
be00: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
be10: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
be20: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
be30: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
be40: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
be50: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
be60: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
be70: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
be80: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
be90: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
bea0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
beb0: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
bec0: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
bed0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
bee0: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
bef0: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
bf00: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
bf10: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
bf20: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
bf30: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
bf40: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
bf50: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
bf60: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
bf70: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
bf80: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
bf90: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
bfa0: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
bfb0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
bfc0: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
bfd0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
bfe0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
bff0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
c000: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
c010: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
c020: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
c030: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
c040: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
c050: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
c060: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
c070: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
c080: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
c090: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
c0a0: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
c0b0: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
c0c0: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
c0d0: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
c0e0: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
c0f0: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
c100: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
c110: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
c120: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
c130: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
c140: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
c150: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
c160: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
c170: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
c180: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
c190: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
c1a0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
c1b0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
c1c0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
c1d0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
c1e0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
c1f0: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
c200: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
c210: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
c220: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
c230: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
c240: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
c250: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
c260: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
c270: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
c280: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
c290: 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
c2a0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
c2b0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
c2c0: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
c2d0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
c2e0: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
c2f0: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
c300: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
c310: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
c320: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
c330: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
c340: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
c350: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
c360: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
c370: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
c380: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
c390: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
c3a0: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
c3b0: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
c3c0: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
c3d0: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
c3e0: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
c3f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c400: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
c410: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
c420: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
c430: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
c440: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
c450: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
c460: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
c470: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
c480: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
c490: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
c4a0: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
c4b0: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
c4c0: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
c4d0: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
c4e0: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
c4f0: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
c500: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
c510: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
c520: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
c530: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
c540: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
c550: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
c560: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
c570: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
c580: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
c590: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
c5a0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
c5b0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
c5c0: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
c5d0: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
c5e0: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
c5f0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
c600: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
c610: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
c620: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
c630: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
c640: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
c650: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
c660: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
c670: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
c680: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
c690: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
c6a0: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
c6b0: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
c6c0: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
c6d0: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
c6e0: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
c6f0: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
c700: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
c710: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
c720: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
c730: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
c740: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
c750: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c760: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
c770: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
c780: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
c790: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
c7a0: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
c7b0: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
c7c0: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
c7d0: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
c7e0: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
c7f0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
c800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
c810: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
c820: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c830: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
c840: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
c850: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c860: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c870: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
c880: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
c890: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c8a0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
c8b0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c8c0: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
c8d0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c8e0: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
c8f0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c900: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c910: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
c920: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
c930: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
c940: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c950: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
c960: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
c970: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
c980: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
c990: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
c9a0: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
c9b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
c9c0: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
c9d0: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
c9e0: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
c9f0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
ca00: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
ca10: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
ca20: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
ca30: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ca40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
ca50: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
ca60: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
ca70: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
ca80: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
ca90: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
caa0: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
cab0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
cac0: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
cad0: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
cae0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
caf0: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
cb00: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
cb10: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
cb20: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
cb30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
cb40: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
cb50: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
cb60: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
cb70: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
cb80: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
cb90: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
cba0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
cbb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cbc0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
cbd0: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
cbe0: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
cbf0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
cc00: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
cc10: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
cc20: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
cc30: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
cc40: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
cc50: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
cc60: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
cc70: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
cc80: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
cc90: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
cca0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
ccb0: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
ccc0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
ccd0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
cce0: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
ccf0: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
cd00: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
cd10: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
cd20: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
cd30: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69  ARED_SIZE;.    i
cd40: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
cd50: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
cd60: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
cd70: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
cd80: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
cd90: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
cda0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
cdb0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  _LOCK);.    }.. 
cdc0: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
cdd0: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
cde0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
cdf0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
ce00: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
ce10: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
ce20: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ce30: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
ce40: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
ce50: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20  File, &lock) && 
ce60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ce70: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
ce80: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
ce90: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
cea0: 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   */.      tErrno
ceb0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
cec0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
ced0: 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d  R_UNLOCK; .    }
cee0: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
cef0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cf00: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
cf10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cf20: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
cf30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
cf40: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
cf50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
cf60: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
cf70: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
cf80: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
cf90: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
cfa0: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
cfb0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
cfc0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
cfd0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
cfe0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
cff0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
d000: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
d010: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
d020: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
d030: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
d040: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
d050: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
d060: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
d070: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d080: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
d090: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
d0a0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
d0b0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
d0c0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
d0d0: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
d0e0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
d0f0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
d100: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
d110: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
d120: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
d130: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
d140: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
d150: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
d160: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
d170: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
d180: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
d190: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
d1a0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
d1b0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
d1c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
d1d0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
d1e0: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
d1f0: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
d200: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
d210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
d220: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
d230: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
d240: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
d250: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
d260: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
d270: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
d280: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
d290: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d2a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d2b0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d2c0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d2d0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
d2e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d2f0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
d300: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d310: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
d320: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d330: 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    ..#ifndef NDEB
d340: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
d350: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
d360: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
d370: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
d380: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
d390: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
d3a0: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
d3b0: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
d3c0: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
d3d0: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
d3e0: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
d3f0: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
d400: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
d410: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
d420: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
d430: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
d440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
d450: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
d460: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  ck<=SHARED_LOCK.
d470: 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d     && eFileLock=
d480: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20  =RESERVED_LOCK. 
d490: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74   ){.    pFile->t
d4a0: 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30  ransCntrChng = 0
d4b0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  ;.    pFile->dbU
d4c0: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  pdate = 0;.    p
d4d0: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
d4e0: 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e  ite = 1;.  }.#en
d4f0: 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d  dif...  if( rc==
d500: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d510: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d520: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
d530: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
d540: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
d550: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
d560: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
d570: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
d580: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
d590: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
d5a0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
d5b0: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
d5c0: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
d5d0: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
d5e0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
d5f0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
d600: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
d610: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
d620: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
d630: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
d640: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
d650: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
d660: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d670: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
d680: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
d690: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
d6a0: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
d6b0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
d6c0: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
d6d0: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
d6e0: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
d6f0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
d700: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
d710: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
d720: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
d730: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
d740: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
d750: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
d760: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
d770: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
d780: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
d790: 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  le->pUnused = 0;
d7a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
d7b0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
d7c0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
d7d0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
d7e0: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
d7f0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
d800: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
d810: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
d820: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
d830: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
d840: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d850: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
d860: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
d870: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
d880: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
d890: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
d8a0: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
d8b0: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
d8c0: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
d8d0: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
d8e0: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
d8f0: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
d900: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
d910: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
d920: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
d930: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
d940: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
d950: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
d960: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
d970: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
d980: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
d990: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
d9a0: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
d9b0: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
d9c0: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
d9d0: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
d9e0: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
d9f0: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
da00: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
da10: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
da20: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
da30: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
da40: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
da50: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
da60: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
da70: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
da80: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
da90: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
daa0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
dab0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
dac0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
dad0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
dae0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
daf0: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
db00: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
db10: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
db20: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
db30: 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ,.      pFile->e
db40: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
db50: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
db60: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
db70: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
db80: 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
db90: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
dba0: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
dbb0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
dbc0: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
dbd0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
dbe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
dbf0: 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
dc00: 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
dc10: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
dc20: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
dc30: 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
dc40: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
dc50: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
dc60: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
dc70: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
dc80: 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
dc90: 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 6e 64 65  eLock );..#ifnde
dca0: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
dcb0: 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
dcc0: 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
dcd0: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
dce0: 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
dcf0: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
dd00: 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
dd10: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
dd20: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
dd30: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
dd40: 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
dd50: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
dd60: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
dd70: 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
dd80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
dd90: 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
dda0: 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
ddb0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
ddc0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
ddd0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
dde0: 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
ddf0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
de00: 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
de10: 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
de20: 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
de30: 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
de40: 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
de50: 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
de60: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
de70: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
de80: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
de90: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
dea0: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
deb0: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
dec0: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
ded0: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
dee0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
def0: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
df00: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
df10: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
df20: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
df30: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
df40: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
df50: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
df60: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
df70: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
df80: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
df90: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
dfa0: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
dfb0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
dfc0: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
dfd0: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
dfe0: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
dff0: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
e000: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
e010: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
e020: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
e030: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
e040: 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69  CK ){..#if !defi
e050: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
e060: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
e070: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
e080: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
e090: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
e0a0: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
e0b0: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
e0c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
e0d0: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
e0e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
e0f0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
e100: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
e110: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
e120: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
e130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e140: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
e150: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
e160: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
e170: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
e180: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
e190: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
e1a0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e1b0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
e1c0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e1d0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
e1e0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
e1f0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
e200: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
e210: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
e220: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e230: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e240: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
e250: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e260: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
e270: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
e280: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
e290: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e2a0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
e2b0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e2c0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
e2d0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
e2e0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
e2f0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
e300: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
e310: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
e320: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
e330: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
e340: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
e350: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e360: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
e370: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
e380: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
e390: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e3a0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
e3b0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
e3c0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
e3d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
e3e0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
e3f0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
e400: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
e410: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
e420: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e430: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
e440: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e450: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
e460: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
e470: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
e480: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
e490: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
e4a0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
e4b0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
e4c0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
e4d0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
e4e0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e4f0: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
e500: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
e510: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
e520: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
e530: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
e540: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
e550: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
e560: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
e570: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e580: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
e590: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
e5a0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
e5b0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
e5c0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
e5d0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
e5e0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
e5f0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
e600: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
e610: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e620: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
e630: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
e640: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
e650: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
e660: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
e670: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e680: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
e690: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
e6a0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
e6b0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e6c0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
e6d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e6e0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
e6f0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
e700: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
e710: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
e720: 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
e730: 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  , the call to un
e740: 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e  ixFileLock() can
e750: 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65  not fail because
e760: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20   another.       
e770: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73     ** process is
e780: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f   holding an inco
e790: 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49  mpatible lock. I
e7a0: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20  f it does, this 
e7b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
e7c0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
e7d0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
e7e0: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  s not following 
e7f0: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20  the locking.    
e800: 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f        ** protoco
e810: 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  l. If this happe
e820: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
e830: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20  E_IOERR_RDLOCK. 
e840: 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  Returning.      
e850: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
e860: 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65  SY would confuse
e870: 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
e880: 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74   (in practice it
e890: 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20   causes .       
e8a0: 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20     ** an assert 
e8b0: 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20  to fail). */ .  
e8c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e8d0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
e8e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  ;.          pFil
e8f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
e900: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e910: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
e920: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e930: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
e940: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
e950: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
e960: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
e970: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
e980: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
e990: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
e9a0: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
e9b0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
e9c0: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
e9d0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
e9e0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e9f0: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
ea00: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
ea10: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
ea20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ea30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
ea40: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
ea50: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ea60: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
ea70: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
ea80: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
ea90: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
eaa0: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
eab0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
eac0: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
ead0: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
eae0: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
eaf0: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
eb00: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
eb10: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
eb20: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
eb30: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
eb40: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
eb50: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
eb60: 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
eb70: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
eb80: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
eb90: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
eba0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
ebb0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ebc0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
ebd0: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
ebe0: 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
ebf0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
ec00: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
ec10: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
ec20: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
ec30: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
ec40: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
ec50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ec60: 4c 4f 43 4b 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61  LOCK;..pFile->la
ec70: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
ec80: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
ec90: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
eca0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
ecb0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
ecc0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
ecd0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ece0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
ecf0: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
ed00: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
ed10: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
ed20: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
ed30: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
ed40: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
ed50: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
ed60: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
ed70: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
ed80: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
ed90: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
eda0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
edb0: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
edc0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
edd0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
ede0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
edf0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
ee00: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
ee10: 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75     }.  }...end_u
ee20: 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  nlock:.  unixLea
ee30: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
ee40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ee50: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ee60: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
ee70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ee80: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
ee90: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
eea0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
eeb0: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
eec0: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
eed0: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
eee0: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
eef0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
ef00: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
ef10: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
ef20: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
ef30: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
ef40: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
ef50: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
ef60: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
ef70: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
ef80: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
ef90: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
efa0: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
efb0: 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
efc0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
efd0: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
efe0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
eff0: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
f000: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
f010: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
f020: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
f030: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
f040: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
f050: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
f060: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
f070: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
f080: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
f090: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
f0a0: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
f0b0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
f0c0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
f0d0: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
f0e0: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
f0f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
f100: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
f110: 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
f120: 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
f130: 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
f140: 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
f150: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
f160: 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
f170: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
f180: 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
f190: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
f1a0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
f1b0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
f1c0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
f1d0: 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f  0 ){.    robust_
f1e0: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
f1f0: 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
f200: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ;.    pFile->h =
f210: 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f   -1;.  }.#if OS_
f220: 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46  VXWORKS.  if( pF
f230: 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20  ile->pId ){.    
f240: 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
f250: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
f260: 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20  DELETE ){.      
f270: 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
f280: 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
f290: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
f2a0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
f2b0: 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29  leId(pFile->pId)
f2c0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64  ;.    pFile->pId
f2d0: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
f2e0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
f2f0: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
f300: 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
f310: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
f320: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
f330: 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d  e->pUnused);.  m
f340: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
f350: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
f360: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
f370: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f380: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
f390: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
f3a0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
f3b0: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
f3c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f3d0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
f3e0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
f3f0: 64 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  d;.  unixUnlock(
f400: 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
f410: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
f420: 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65  ;..  /* unixFile
f430: 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  .pInode is alway
f440: 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74  s valid here. Ot
f450: 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65  herwise, a diffe
f460: 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20  rent close.  ** 
f470: 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f  routine (e.g. no
f480: 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75  lockClose()) wou
f490: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  ld be called ins
f4a0: 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tead..  */.  ass
f4b0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
f4c0: 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70  de->nLock>0 || p
f4d0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
f4e0: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
f4f0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46  .  if( ALWAYS(pF
f500: 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20  ile->pInode) && 
f510: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
f520: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Lock ){.    /* I
f530: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
f540: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
f550: 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
f560: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
f570: 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65  st.    ** yet be
f580: 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
f590: 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
f5a0: 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
f5b0: 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  d the file.    *
f5c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
f5d0: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
f5e0: 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62  list.  It will b
f5f0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
f600: 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77  closed .    ** w
f610: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
f620: 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
f630: 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
f640: 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
f650: 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
f660: 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
f670: 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
f680: 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
f690: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
f6a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
f6c0: 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
f6d0: 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
f6e0: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
f750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
f7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
f7c0: 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
f7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
f7f0: 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
f800: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
f810: 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
f820: 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
f830: 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
f840: 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
f850: 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
f860: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
f870: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
f880: 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
f890: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
f8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
f8b0: 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
f8c0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
f8d0: 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
f8e0: 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
f8f0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
f900: 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
f910: 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
f920: 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
f930: 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
f940: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
f950: 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
f960: 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
f970: 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
f980: 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
f990: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
f9a0: 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
f9b0: 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
f9c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
f9d0: 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
f9e0: 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
f9f0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
fa00: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
fa10: 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
fa20: 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
fa30: 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
fa40: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
fa50: 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
fa60: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
fa70: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
fa80: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
fa90: 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
faa0: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
fab0: 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
fac0: 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
fad0: 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
fae0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
faf0: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
fb00: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
fb10: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
fb20: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
fb30: 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
fb40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fb50: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
fb60: 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
fb70: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
fb80: 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
fb90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fba0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
fbb0: 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
fbc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
fbd0: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
fbe0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
fbf0: 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
fc00: 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
fc10: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
fc20: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
fc30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
fc40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fc50: 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
fc60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
fc70: 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
fc80: 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
fc90: 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
fca0: 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a  File(id);.}../**
fcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcc0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d  * End of the no-
fcd0: 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  op lock implemen
fce0: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
fcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
fd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
fd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
fda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fdb0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f  ******* Begin do
fdc0: 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a  t-file Locking *
fdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
fdf0: 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20  .** The dotfile 
fe00: 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
fe10: 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  tation uses the 
fe20: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70  existance of sep
fe30: 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69  arate lock.** fi
fe40: 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69  les (really a di
fe50: 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74  rectory) to cont
fe60: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
fe70: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
fe80: 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75  s works.** on ju
fe90: 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  st about every f
fea0: 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
feb0: 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
fec0: 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
fed0: 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
fee0: 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
fef0: 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
ff00: 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
ff10: 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
ff20: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
ff30: 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
ff40: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
ff50: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
ff60: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
ff70: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
ff80: 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
ff90: 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
ffa0: 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
ffb0: 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
ffc0: 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
ffd0: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
ffe0: 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
fff0: 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
10000 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
10010 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
10020 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
10030 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
10040 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
10050 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
10060 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
10070 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
10080 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72  ng a subdirector
10090 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  y in the same di
100a0 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
100b0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77  e database and w
100c0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
100d0 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c  e but with a ".l
100e0 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61  ock" extension a
100f0 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69  dded..** The exi
10100 73 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b  stance of a lock
10110 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69   directory impli
10120 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
10130 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
10140 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28  .** lock types (
10150 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
10160 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
10170 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
10180 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
10190 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
101a0 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
101b0 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
101c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
101d0 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64  te the.** lock d
101e0 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65  irectory..*/.#de
101f0 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
10200 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
10210 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10220 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
10230 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
10240 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
10250 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
10260 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
10270 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
10280 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
10290 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
102a0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
102b0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
102c0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
102d0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
102e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
102f0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
10300 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
10310 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
10320 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
10330 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
10340 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10350 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
10360 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
10370 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
10380 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
10390 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
103a0 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
103b0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
103c0 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
103d0 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
103e0 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
103f0 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
10400 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
10410 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
10420 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
10430 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10440 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
10450 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10460 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
10470 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
10480 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10490 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
104a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
104b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
104c0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
104d0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
104e0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
104f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
10500 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
10510 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
10520 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
10530 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
10540 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
10550 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
10560 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
10570 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
10580 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
10590 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
105a0 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
105b0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
105c0 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
105d0 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
105e0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
105f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
10600 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
10610 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
10620 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
10630 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
10640 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
10650 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
10660 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10670 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
10680 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c  ed = osAccess(zL
10690 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a  ockFile, 0)==0;.
106a0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
106b0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
106c0 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
106d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
106e0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
106f0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
10700 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
10710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
10720 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
10730 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
10740 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
10750 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
10760 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10770 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
10780 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
10790 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
107a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
107b0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
107c0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
107d0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
107e0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
107f0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
10800 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
10810 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
10820 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
10830 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
10840 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
10850 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
10860 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
10870 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
10880 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
10890 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
108a0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
108b0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
108c0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
108d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
108e0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
108f0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
10900 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
10910 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
10920 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
10930 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
10940 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
10950 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
10960 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
10970 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
10980 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
10990 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
109a0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
109b0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
109c0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
109d0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
109e0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
109f0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
10a00 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
10a10 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
10a20 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
10a30 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
10a40 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10a50 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
10a60 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
10a70 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
10a80 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
10a90 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
10aa0 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
10ab0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
10ac0 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
10ad0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10ae0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
10af0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10b00 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10b10 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
10b20 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
10b30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
10b40 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
10b50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
10b60 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
10b70 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
10b80 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
10b90 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
10ba0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
10bb0 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
10bc0 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
10bd0 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
10be0 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
10bf0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10c00 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
10c10 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10c20 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
10c30 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
10c40 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
10c50 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
10c60 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
10c70 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
10c80 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
10c90 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
10ca0 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
10cb0 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
10cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10cd0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
10ce0 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
10cf0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
10d00 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
10d10 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
10d20 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
10d30 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
10d40 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
10d50 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
10d60 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10d70 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
10d80 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
10d90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10da0 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
10db0 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
10dc0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10dd0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10de0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
10df0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
10e00 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10e10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
10e20 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
10e30 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
10e40 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
10e50 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f   rc;.  } .  .  /
10e60 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
10e70 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
10e80 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
10e90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
10ea0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
10eb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
10ec0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
10ed0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
10ee0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
10ef0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
10f00 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
10f10 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
10f20 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
10f30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
10f40 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
10f50 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
10f60 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
10f70 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
10f80 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
10f90 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
10fa0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10fb0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
10fc0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10fd0 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
10fe0 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
10ff0 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
11000 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
11010 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11020 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
11030 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
11040 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
11050 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
11060 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
11070 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
11080 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
11090 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
110a0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
110b0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
110c0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
110d0 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
110e0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
110f0 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
11100 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
11110 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
11120 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
11130 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
11140 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
11150 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
11160 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
11170 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
11180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11190 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
111a0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
111b0 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
111c0 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
111d0 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
111e0 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
111f0 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
11200 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
11210 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
11220 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
11230 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11240 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11250 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
11260 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11270 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
11280 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
11290 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
112a0 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
112b0 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
112c0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
112d0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
112e0 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
112f0 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26  e);.  if( rc<0 &
11300 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52  & errno==ENOTDIR
11310 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b   ) rc = osUnlink
11320 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
11330 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
11340 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
11350 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  o;.    rc = 0;. 
11360 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
11370 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
11380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
11390 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RR_UNLOCK;.    }
113a0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
113b0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
113c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
113d0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
113e0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
113f0 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
11400 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
11410 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
11420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11430 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
11440 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
11450 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
11460 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
11470 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
11480 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
11490 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
114a0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b  *id) {.  int rc;
114b0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
114c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
114d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
114e0 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
114f0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
11500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
11510 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
11520 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
11530 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
11540 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72  ile(id);.  retur
11550 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
11560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
11570 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
11580 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
11590 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
115a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
115b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115f0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11640 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11660 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
11670 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
11680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11690 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
116a0 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
116b0 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
116c0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
116d0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
116e0 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
116f0 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
11700 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
11710 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
11720 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
11730 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
11740 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
11750 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
11760 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
11770 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
11780 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
11790 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
117a0 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
117b0 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
117c0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
117d0 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
117e0 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
117f0 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
11800 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
11810 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
11820 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
11830 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
11840 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
11850 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
11860 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
11870 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
11880 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11890 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
118a0 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
118b0 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
118c0 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
118d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
118e0 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
118f0 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  RKS../*.** Retry
11900 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
11910 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
11920 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
11930 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
11940 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
11950 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
11960 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
11970 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
11980 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
11990 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
119a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
119b0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
119c0 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
119d0 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
119e0 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
119f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
11a00 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
11a10 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
11a20 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
11a30 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
11a40 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
11a50 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
11a60 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
11a70 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
11a80 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
11a90 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
11aa0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
11ab0 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
11ac0 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
11ad0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
11ae0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
11af0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
11b00 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
11b10 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
11b20 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
11b30 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
11b40 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
11b50 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
11b60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11b70 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
11b80 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
11b90 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11ba0 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
11bb0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
11bc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11bd0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
11be0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
11bf0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
11c00 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
11c10 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
11c20 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
11c30 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
11c40 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
11c50 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
11c60 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
11c70 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
11c80 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
11c90 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
11ca0 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
11cb0 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
11cc0 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
11cd0 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
11ce0 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
11cf0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
11d00 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11d10 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
11d20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
11d30 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
11d40 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
11d50 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
11d60 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
11d70 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
11d80 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
11d90 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
11da0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11db0 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
11dc0 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
11dd0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
11de0 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   lrc = SQLITE_IO
11df0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
11e00 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
11e10 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
11e20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
11e30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
11e40 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
11e50 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20   = lrc;.        
11e60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  }.      }.    } 
11e70 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74  else {.      int
11e80 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11e90 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
11ea0 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f  = 1;.      /* so
11eb0 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74  meone else might
11ec0 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65   have it reserve
11ed0 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  d */.      lrc =
11ee0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11ef0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11f00 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
11f10 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66  LOCK); .      if
11f20 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11f30 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
11f40 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11f50 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
11f60 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
11f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11f80 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
11f90 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
11fa0 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
11fb0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
11fc0 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53  ved));..#ifdef S
11fd0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
11fe0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
11ff0 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
12000 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
12010 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
12020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12030 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a      reserved=1;.
12040 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
12050 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12060 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
12070 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
12080 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
12090 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
120a0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
120b0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
120c0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
120d0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
120e0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
120f0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
12100 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
12110 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
12120 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
12130 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
12140 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
12150 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
12160 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
12170 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
12180 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
12190 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
121a0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
121b0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
121c0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
121d0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
121e0 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
121f0 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
12200 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
12210 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
12220 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
12230 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
12240 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
12250 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
12260 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
12270 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
12280 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
12290 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
122a0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
122b0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
122c0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
122d0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
122e0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
122f0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12300 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
12310 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
12320 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12330 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
12340 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
12350 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65   flock() only re
12360 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
12370 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
12380 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
12390 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
123a0 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
123b0 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
123c0 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
123d0 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
123e0 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
123f0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
12400 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
12410 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
12420 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
12430 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
12440 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
12450 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
12460 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
12470 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
12480 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
12490 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
124a0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
124b0 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71  int flockLock(sq
124c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
124d0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
124e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
124f0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
12500 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
12510 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
12520 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
12530 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
12540 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
12550 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
12560 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
12570 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
12580 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
12590 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
125a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
125b0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
125c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
125d0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
125e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
125f0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
12600 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
12610 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72  ck */.  .  if (r
12620 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
12630 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
12640 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
12650 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12660 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
12670 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
12680 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
12690 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
126a0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
126b0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
126c0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
126d0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
126e0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
126f0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
12700 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  no;.    }.  } el
12710 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20  se {.    /* got 
12720 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
12730 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
12740 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  /.    pFile->eFi
12750 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
12760 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  ck;.  }.  OSTRAC
12770 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
12780 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  s %s (flock)\n",
12790 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
127a0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
127b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63  , .           rc
127c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
127d0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
127e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
127f0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12800 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
12810 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
12820 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
12830 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
12840 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23  LITE_BUSY;.  }.#
12850 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12860 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
12870 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65  K_ERRORS */.  re
12880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
12890 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
128a0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
128b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
128c0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
128d0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
128e0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
128f0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
12900 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
12910 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
12920 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
12930 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
12940 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
12950 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
12960 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
12970 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12980 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12990 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f  ic int flockUnlo
129a0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
129b0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
129c0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
129d0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
129e0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
129f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
12a00 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
12a10 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
12a20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e  pid=%d (flock)\n
12a30 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
12a40 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
12a50 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
12a60 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
12a70 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
12a80 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
12a90 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
12aa0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
12ab0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
12ac0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
12ad0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
12ae0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12af0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
12b00 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
12b10 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
12b20 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
12b30 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
12b40 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
12b50 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
12b60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
12b70 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
12b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12b90 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
12ba0 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
12bb0 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
12bc0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
12bd0 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
12be0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
12bf0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12c00 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
12c10 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
12c20 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
12c30 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12c40 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
12c50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
12c60 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
12c70 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12c80 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
12c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12ca0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
12cb0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
12cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
12cd0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
12ce0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
12cf0 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
12d00 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
12d10 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OCK);.  }.  retu
12d20 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
12d30 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
12d40 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
12d50 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
12d60 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
12d70 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
12d80 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
12d90 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
12da0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
12db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12dc0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
12e10 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
12e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
12e80 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
12e90 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
12ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12eb0 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
12ec0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
12ed0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
12ee0 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
12ef0 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
12f00 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
12f10 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
12f20 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
12f30 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
12f40 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
12f50 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
12f60 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
12f70 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
12f80 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12f90 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
12fa0 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
12fb0 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
12fc0 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
12fd0 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
12fe0 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
12ff0 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
13000 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
13010 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
13020 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
13030 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13040 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
13050 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
13060 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
13070 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
13080 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
13090 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
130a0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
130b0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
130c0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
130d0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
130e0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
130f0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
13100 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
13110 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
13120 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
13130 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
13140 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  nt semCheckReser
13150 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
13160 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
13170 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
13180 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13190 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
131a0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
131b0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
131c0 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
131d0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
131e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
131f0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13200 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
13210 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
13220 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
13230 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
13240 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
13250 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
13260 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
13270 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
13280 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
13290 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
132a0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
132b0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
132c0 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
132d0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
132e0 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20      sem_t *pSem 
132f0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
13300 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63  >pSem;.    struc
13310 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a  t stat statBuf;.
13320 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79  .    if( sem_try
13330 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
13340 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
13350 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
13360 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20    if( EAGAIN != 
13370 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
13380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
13390 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
133a0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
133b0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
133c0 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
133d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
133e0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
133f0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
13400 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
13410 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
13420 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20   when we are in 
13430 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20  NO_LOCK */.     
13440 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70     reserved = (p
13450 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13460 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  < SHARED_LOCK);.
13470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13480 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63  e{.      /* we c
13490 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20  ould have it if 
134a0 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20  we want it */.  
134b0 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65      sem_post(pSe
134c0 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  m);.    }.  }.  
134d0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
134e0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
134f0 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
13500 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
13510 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
13520 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
13530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13540 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
13550 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
13560 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
13570 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
13580 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
13590 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
135a0 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
135b0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
135c0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
135d0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
135e0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
135f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
13600 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
13610 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
13620 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
13630 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
13640 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
13650 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
13660 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
13670 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
13680 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
13690 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
136a0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
136b0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
136c0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
136d0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
136e0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
136f0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
13700 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
13710 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
13720 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
13730 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
13740 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
13750 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
13760 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
13770 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
13780 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
13790 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
137a0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
137b0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
137c0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
137d0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
137e0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
137f0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
13800 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ocks only really
13810 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
13820 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
13830 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
13840 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
13850 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
13860 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
13870 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
13880 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
13890 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
138a0 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
138b0 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
138c0 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
138d0 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
138e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
138f0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
13900 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
13910 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
13920 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
13930 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
13940 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
13950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13960 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  semLock(sqlite3_
13970 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
13980 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
13990 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
139a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
139b0 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20  int fd;.  sem_t 
139c0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
139d0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69  Inode->pSem;.  i
139e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
139f0 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  K;..  /* if we a
13a00 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
13a10 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
13a20 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
13a30 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
13a40 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
13a50 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
13a60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13a70 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
13a80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13a90 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
13aa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
13ab0 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  K;.    goto sem_
13ac0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
13ad0 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70  .  /* lock semap
13ae0 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69  hore now but bai
13af0 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61  l out when alrea
13b00 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  dy locked. */.  
13b10 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
13b20 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
13b30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
13b40 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  Y;.    goto sem_
13b50 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
13b60 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
13b70 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
13b80 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
13b90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
13ba0 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f  FileLock;.. sem_
13bb0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75  end_lock:.  retu
13bc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13bd0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13be0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
13bf0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
13c00 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
13c10 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
13c20 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
13c30 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
13c40 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
13c50 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13c60 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
13c70 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
13c80 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
13c90 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
13ca0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
13cb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13cc0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
13cd0 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71  int semUnlock(sq
13ce0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13cf0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13d00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13d10 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13d20 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  id;.  sem_t *pSe
13d30 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
13d40 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65  e->pSem;..  asse
13d50 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
13d60 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20  ssert( pSem );. 
13d70 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
13d80 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
13d90 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c  pid=%d (sem)\n",
13da0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
13db0 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
13dc0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
13dd0 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
13de0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
13df0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
13e00 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
13e10 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
13e20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
13e30 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
13e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13e50 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13e60 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
13e70 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
13e80 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
13e90 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
13ea0 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
13eb0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
13ec0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13ed0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13ee0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13ef0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13f00 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
13f10 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
13f20 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
13f30 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
13f40 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
13f50 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13f60 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
13f70 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
13f80 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
13f90 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
13fa0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
13fb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
13fc0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
13fd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
13fe0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
13ff0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14000 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
14010 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14020 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
14030 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
14040 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c  int semClose(sql
14050 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
14060 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
14070 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14080 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14090 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28  ;.    semUnlock(
140a0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
140b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
140c0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
140d0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
140e0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
140f0 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
14100 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
14110 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
14120 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
14140 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
14150 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
14160 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
14170 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
14180 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
14190 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
141a0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
141b0 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
141c0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
141d0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
141e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
141f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14230 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
14240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14280 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142a0 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
142b0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
142c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142d0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
142e0 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
142f0 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
14300 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
14310 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
14320 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
14330 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
14340 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
14350 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
14360 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
14370 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
14380 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
14390 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
143a0 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
143b0 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
143c0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
143d0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
143e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
143f0 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
14400 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
14410 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
14420 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
14430 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
14440 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
14450 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14460 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14470 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
14480 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
14490 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
144a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
144b0 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
144c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
144d0 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
144e0 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
144f0 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
14500 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14510 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
14520 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
14530 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
14540 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
14550 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
14560 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
14570 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
14580 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
14590 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
145a0 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
145b0 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
145c0 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
145d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
145e0 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
145f0 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
14600 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
14610 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
14620 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
14630 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
14640 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
14650 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
14660 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14680 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
14690 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
146a0 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
146b0 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
146c0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
146d0 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
146e0 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
146f0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
14700 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
14710 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
14720 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
14730 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
14740 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
14750 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
14760 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
14770 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
14780 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
14790 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
147a0 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
147b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
147c0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
147d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
147e0 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
147f0 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
14800 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14810 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14820 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
14830 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
14840 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
14850 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
14860 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
14870 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
14880 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
14890 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
148a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
148b0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
148c0 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
148d0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
148e0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
148f0 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
14900 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
14910 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
14920 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
14930 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
14940 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
14950 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
14960 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
14970 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
14980 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
14990 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
149a0 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
149b0 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
149c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
149d0 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
149e0 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
149f0 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
14a00 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
14a10 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
14a20 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
14a30 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
14a40 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
14a50 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
14a60 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
14a70 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
14a80 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
14a90 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
14aa0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
14ab0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
14ac0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
14ad0 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
14ae0 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
14af0 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
14b00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
14b10 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
14b20 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
14b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
14b40 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
14b50 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
14b60 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
14b70 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
14b80 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
14b90 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
14bc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
14bd0 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
14be0 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
14bf0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
14c00 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
14c10 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
14c20 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
14c30 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
14c40 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
14c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14c60 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
14c70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14c80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
14c90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14ca0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
14cb0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
14cc0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
14cd0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
14ce0 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
14cf0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
14d00 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
14d10 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
14d20 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
14d30 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
14d40 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
14d50 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
14d60 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
14d70 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
14d80 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
14d90 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
14da0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
14db0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
14dc0 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
14dd0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
14de0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14df0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
14e00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14e10 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
14e20 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
14e30 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14e40 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
14e50 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
14e60 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69  context;.  .  Si
14e70 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
14e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14e90 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14ea0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
14eb0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14ec0 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c   context = (afpL
14ed0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
14ee0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
14ef0 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
14f00 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
14f10 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
14f20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
14f30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14f40 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
14f50 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
14f60 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
14f70 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
14f80 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
14f90 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
14fa0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
14fb0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
14fc0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
14fd0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
14fe0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
14ff0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
15000 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
15010 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
15020 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
15030 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
15040 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
15050 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
15060 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
15070 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
15080 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
15090 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
150a0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
150b0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
150c0 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
150d0 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
150e0 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
150f0 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
15100 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
15110 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
15120 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
15130 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
15140 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
15150 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
15160 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
15170 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
15180 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
15190 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
151a0 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
151b0 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
151c0 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
151d0 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
151e0 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
151f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
15200 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15210 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
15220 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
15230 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
15240 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
15250 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
15260 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
15270 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
15280 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
15290 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
152a0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
152b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
152c0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
152d0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
152e0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
152f0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
15300 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
15310 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
15320 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
15330 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
15340 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
15350 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
15360 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
15370 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
15380 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
15390 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
153a0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
153b0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
153c0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
153d0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
153e0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
153f0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
15400 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
15410 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
15420 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
15430 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
15440 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
15450 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
15460 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
15470 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
15480 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
15490 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
154a0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
154b0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
154c0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
154d0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
154e0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
154f0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
15500 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15510 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
15520 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
15530 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
15540 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
15550 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
15560 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
15570 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
15580 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
15590 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
155a0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
155b0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
155c0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
155d0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
155e0 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
155f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15600 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
15610 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15620 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
15630 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15640 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
15650 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
15660 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
15670 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
15680 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
15690 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
156a0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
156b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
156c0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
156d0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
156e0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
156f0 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
15700 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
15710 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
15720 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
15730 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
15740 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
15750 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
15760 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
15770 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
15780 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
15790 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
157a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
157b0 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
157c0 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
157d0 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
157e0 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
157f0 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
15800 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
15810 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
15820 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
15830 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
15840 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
15850 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
15860 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
15870 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
15880 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
15890 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
158a0 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
158b0 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
158c0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
158d0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
158e0 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
158f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15900 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
15910 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
15920 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
15930 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
15940 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
15950 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
15960 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
15970 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
15980 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
15990 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
159a0 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
159b0 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
159c0 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
159d0 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
159e0 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
159f0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
15a00 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
15a10 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
15a20 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
15a30 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15a40 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
15a50 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
15a60 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
15a70 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15a80 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
15a90 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
15aa0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
15ab0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
15ac0 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
15ad0 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
15ae0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
15af0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
15b00 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
15b10 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
15b20 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
15b30 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
15b40 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
15b50 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
15b60 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
15b70 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
15b80 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
15b90 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
15ba0 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
15bb0 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
15bc0 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
15bd0 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
15be0 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
15bf0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
15c00 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
15c10 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
15c20 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
15c30 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
15c40 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
15c50 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
15c60 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
15c70 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
15c80 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
15c90 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
15ca0 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
15cb0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
15cc0 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
15cd0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
15ce0 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
15cf0 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
15d00 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
15d10 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
15d20 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15d30 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
15d40 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
15d50 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15d60 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
15d70 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
15d80 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
15d90 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
15da0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
15db0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
15dc0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
15dd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15de0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
15df0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
15e00 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
15e10 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
15e20 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
15e30 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
15e40 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
15e50 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
15e60 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
15e70 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
15e80 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
15e90 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
15ea0 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
15eb0 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
15ec0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
15ed0 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
15ee0 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
15ef0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
15f00 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
15f10 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15f20 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
15f30 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
15f40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
15f50 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15f60 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
15f70 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
15f80 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
15f90 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
15fa0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
15fb0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
15fc0 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
15fd0 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
15fe0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
15ff0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16000 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
16010 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
16020 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
16030 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
16040 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
16050 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
16060 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
16070 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
16080 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
16090 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
160a0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
160b0 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
160c0 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
160d0 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
160e0 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
160f0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16100 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
16110 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16120 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16130 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
16140 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
16150 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
16160 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
16170 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
16180 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
16190 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
161a0 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
161b0 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
161c0 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
161d0 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
161e0 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
161f0 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
16200 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
16210 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
16220 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
16230 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
16240 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
16250 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16260 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
16270 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
16280 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16290 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
162a0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
162b0 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
162c0 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
162d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
162e0 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
162f0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
16300 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
16310 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
16320 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16330 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
16340 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
16350 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
16360 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
16370 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
16380 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
16390 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rc1Errno;.      
163a0 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
163b0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
163c0 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
163d0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
163e0 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
163f0 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
16400 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16410 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16420 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
16430 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
16440 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
16450 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
16460 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16470 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16480 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16490 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
164a0 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
164b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
164c0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
164d0 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
164e0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
164f0 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
16500 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
16510 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
16520 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
16530 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
16540 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
16550 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
16560 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
16570 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16580 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
16590 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
165a0 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
165b0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
165c0 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
165d0 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
165e0 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
165f0 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
16600 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
16610 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
16620 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
16630 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
16640 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
16650 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
16660 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
16670 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
16680 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
16690 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
166a0 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
166b0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
166c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
166d0 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
166e0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
166f0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16700 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
16710 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
16720 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
16730 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
16740 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
16750 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16760 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
16770 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
16780 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
16790 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
167a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
167b0 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
167c0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
167d0 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
167e0 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
167f0 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
16800 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
16810 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
16820 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
16830 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
16840 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
16850 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
16860 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
16870 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16880 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
16890 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168b0 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
168c0 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
168d0 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
168e0 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
168f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
16900 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
16910 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
16920 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
16930 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
16940 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16950 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16960 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
16990 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
169a0 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
169b0 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
169c0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
169d0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
169e0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
169f0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
16a00 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
16a10 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
16a20 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
16a30 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
16a40 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
16a50 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
16a60 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
16a70 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
16a80 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
16a90 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
16aa0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
16ab0 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
16ac0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
16ad0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
16ae0 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
16af0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
16b00 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
16b10 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16b20 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
16b30 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
16b40 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
16b50 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
16b60 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
16b70 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
16b80 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
16b90 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
16ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16bb0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16bc0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
16bd0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
16be0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
16bf0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
16c00 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
16c10 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
16c20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16c30 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
16c40 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
16c50 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
16c60 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
16c70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
16c80 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
16c90 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
16ca0 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
16cb0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
16cc0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16cd0 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
16ce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
16cf0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
16d00 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
16d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
16d20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16d30 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
16d40 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
16d50 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
16d60 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
16d70 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
16d80 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
16d90 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
16da0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
16db0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16dc0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
16dd0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
16de0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
16df0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
16e00 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
16e20 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
16e30 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
16e40 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
16e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16e60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
16e70 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
16e80 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
16e90 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
16ea0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16eb0 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
16ec0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
16ed0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
16ee0 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
16ef0 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
16f00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16f10 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
16f20 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
16f30 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
16f40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
16f50 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
16f60 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
16f70 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
16f80 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
16f90 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16fa0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
16fb0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
16fc0 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
16fd0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
16fe0 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
16ff0 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
17000 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
17010 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
17020 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17030 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
17040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17050 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
17060 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
17070 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
17080 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
17090 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
170a0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
170b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
170c0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
170d0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
170e0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
170f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
17100 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17110 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
17120 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17130 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
17140 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
17150 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
17160 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17170 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
17180 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
17190 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
171a0 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
171b0 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
171c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
171d0 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
171e0 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
171f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
17200 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
17210 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
17220 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
17230 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
17240 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
17250 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
17260 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
17270 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
17280 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
17290 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
172a0 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
172b0 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
172c0 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
172d0 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
172e0 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
172f0 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
17300 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
17310 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
17320 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
17330 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
17340 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  /.    assert( pF
17350 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
17360 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
17370 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64   || pFile->dbUpd
17380 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ate==0.         
17390 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e    || pFile->tran
173a0 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a  sCntrChng==1 );.
173b0 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
173c0 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
173d0 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66  ndif.    .    if
173e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
173f0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
17400 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
17410 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17420 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17430 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
17440 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
17450 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
17460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
17470 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17480 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
17490 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20  >nShared>1) ){. 
174a0 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72         /* only r
174b0 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  e-establish the 
174c0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e  shared lock if n
174d0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
174e0 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f      int sharedLo
174f0 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
17500 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
17510 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20  aredByte;.      
17520 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
17530 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17540 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
17550 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b  LockByte, 1, 1);
17560 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
17570 20 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72          skipShar
17580 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
17590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
175a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
175b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
175c0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
175d0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
175e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
175f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
17600 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
17610 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69  0);.    } .    i
17620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17630 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
17640 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
17650 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e  OCK && context->
17660 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
17670 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
17680 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17690 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
176a0 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
176b0 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
176c0 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78   .        contex
176d0 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b  t->reserved = 0;
176e0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
176f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17700 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c  TE_OK && (eFileL
17710 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
17720 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   || pInode->nSha
17730 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70  red>1)){.      p
17740 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17750 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
17760 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
17770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17780 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
17790 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44  OCK ){..    /* D
177a0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
177b0 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
177c0 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
177d0 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
177e0 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
177f0 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
17800 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
17810 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
17820 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
17830 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
17840 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
17850 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ong sharedLockBy
17860 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
17870 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
17880 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Byte;.    pInode
17890 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20  ->nShared--;.   
178a0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68   if( pInode->nSh
178b0 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ared==0 ){.     
178c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
178d0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
178e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
178f0 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20  ( h=(-1) ).     
17900 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17910 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
17920 20 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64   if( !skipShared
17930 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17940 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17950 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17960 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
17970 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
17980 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63   }.      if( !rc
17990 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
179a0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
179b0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  NO_LOCK;.       
179c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
179d0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
179e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
179f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17a00 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
17a10 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20  ->nLock--;.     
17a20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
17a30 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
17a40 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
17a50 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
17a60 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
17a70 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
17a80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
17a90 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
17aa0 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
17ab0 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
17ac0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17ad0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
17ae0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
17af0 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65  ose a file & cle
17b00 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69  anup AFP specifi
17b10 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  c locking contex
17b20 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t .*/.static int
17b30 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65   afpClose(sqlite
17b40 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
17b50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17b60 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
17b70 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
17b80 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
17b90 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f  )id;.    afpUnlo
17ba0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
17bb0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
17bc0 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70  tex();.    if( p
17bd0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
17be0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
17bf0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
17c00 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
17c10 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
17c20 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
17c30 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
17c40 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65  just.      ** ye
17c50 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
17c60 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
17c70 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
17c80 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
17c90 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
17ca0 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50  or to pInode->aP
17cb0 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c  ending.  It will
17cc0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
17cd0 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20  y closed when.  
17ce0 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
17cf0 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
17d00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17d10 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
17d20 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  le);.    }.    r
17d30 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
17d40 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69  pFile);.    sqli
17d50 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
17d60 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
17d70 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
17d80 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
17d90 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17da0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17db0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
17dc0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
17dd0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
17de0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
17df0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
17e00 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
17e10 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
17e20 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
17e30 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
17e40 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
17e50 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
17e60 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
17e70 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
17e80 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
17e90 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
17ea0 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
17eb0 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
17ec0 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
17ed0 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
17ee0 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
17ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f00 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
17f10 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
17f20 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
17f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
17f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
17fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ff0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
18000 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
18010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
18030 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
18040 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
18050 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18060 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
18070 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
18080 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
18090 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
180a0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
180b0 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20  ock. ** must be 
180c0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
180d0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20  r SHARED_LOCK.. 
180e0 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f  **. ** If the lo
180f0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
18100 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
18110 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
18120 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68   or below. ** th
18130 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
18140 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
18150 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
18160 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  op.. */.static i
18170 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c  nt nfsUnlock(sql
18180 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
18190 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
181a0 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
181b0 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
181c0 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  k, 1);.}..#endif
181d0 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
181e0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
181f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
18200 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
18210 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
18220 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
18230 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
18240 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
18250 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
18260 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
18270 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
18280 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
18290 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
182a0 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a  s available.  .*
182b0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
182c0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
182d0 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
182e0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
182f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18300 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
18310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18350 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
18360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183a0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
183b0 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20  *** Non-locking 
183c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
183d0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
183e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183f0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  **.**.** The nex
18400 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  t division conta
18410 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ins implementati
18420 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68  ons for all meth
18430 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ods of the .** s
18440 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
18450 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ct other than th
18460 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
18470 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  s.  The locking.
18480 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20  ** methods were 
18490 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73  defined in divis
184a0 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20  ions above (one 
184b0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70  locking method p
184c0 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e  er.** division).
184d0 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20    Those methods 
184e0 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20  that are common 
184f0 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d  to all locking m
18500 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68  odes.** are gath
18510 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  er together into
18520 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a   this division..
18530 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  */../*.** Seek t
18540 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
18550 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
18560 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
18570 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
18580 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
18590 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
185a0 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
185b0 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
185c0 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
185d0 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
185e0 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
185f0 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
18600 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
18610 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
18620 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
18630 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
18640 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
18650 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
18660 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
18670 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
18680 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79  PREAD.** any any
18690 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
186a0 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
186b0 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
186c0 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
186d0 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
186e0 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
186f0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
18700 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
18710 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
18720 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
18730 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
18740 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
18750 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
18760 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
18770 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
18780 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
18790 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
187a0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
187b0 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69  t got;.  int pri
187c0 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65  or = 0;.#if (!de
187d0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
187e0 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
187f0 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
18800 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
18810 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
18820 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69  ;.  do{.#if defi
18830 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
18840 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
18850 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18860 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
18870 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18880 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
18890 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
188a0 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20  READ64).    got 
188b0 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e  = osPread64(id->
188c0 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
188d0 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
188e0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
188f0 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
18900 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
18910 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
18920 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
18930 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18940 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
18950 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
18960 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
18970 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
18980 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
18990 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
189a0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
189b0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
189c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
189d0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
189e0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a  stErrno = 0;....
189f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18a00 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
18a10 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28     got = osRead(
18a20 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18a30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
18a40 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65  ( got==cnt ) bre
18a50 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c  ak;.    if( got<
18a60 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
18a70 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67  rrno==EINTR ){ g
18a80 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65  ot = 1; continue
18a90 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20  ; }.      prior 
18aa0 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75 6e 69  = 0;.      ((uni
18ab0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18ac0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18ad0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18ae0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20  }else if( got>0 
18af0 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20  ){.      cnt -= 
18b00 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  got;.      offse
18b10 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t += got;.      
18b20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20  prior += got;.  
18b30 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
18b40 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29  *)(got + (char*)
18b50 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBuf);.    }.  }
18b60 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a  while( got>0 );.
18b70 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
18b80 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20  STRACE(("READ   
18b90 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
18ba0 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %llu\n",.       
18bb0 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b       id->h, got+
18bc0 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72  prior, offset-pr
18bd0 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  ior, TIMER_ELAPS
18be0 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
18bf0 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  ot+prior;.}../*.
18c00 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
18c10 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
18c20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
18c30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
18c40 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
18c50 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
18c60 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
18c70 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
18c80 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
18c90 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
18ca0 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
18cb0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
18cc0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
18cd0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
18ce0 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
18cf0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
18d00 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
18d10 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
18d20 73 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20  ssert( id );..  
18d30 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
18d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
18d50 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
18d60 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
18d70 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
18d80 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
18d90 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
18da0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
18db0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
18dc0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
18dd0 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
18de0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
18df0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
18e00 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
18e10 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
18e20 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
18e30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20  ;.#endif..  got 
18e40 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
18e50 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
18e60 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
18e70 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
18e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18e90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
18ea0 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73  <0 ){.    /* las
18eb0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
18ec0 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
18ed0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18ee0 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  OERR_READ;.  }el
18ef0 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
18f00 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a  astErrno = 0; /*
18f10 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
18f20 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e  ror */.    /* Un
18f30 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
18f40 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
18f50 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
18f60 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
18f70 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
18f80 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
18f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18fa0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
18fb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
18fc0 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
18fd0 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
18fe0 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
18ff0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
19000 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19010 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
19020 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
19030 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
19040 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
19050 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
19060 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
19070 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73  ed write the las
19080 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
19090 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
190a0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
190b0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
190c0 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
190d0 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
190e0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
190f0 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
19100 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e  got;.#if (!defin
19110 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26  ed(USE_PREAD) &&
19120 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52   !defined(USE_PR
19130 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65  EAD64)).  i64 ne
19140 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a  wOffset;.#endif.
19150 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23    TIMER_START;.#
19160 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19170 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20  READ).  do{ got 
19180 3d 20 6f 73 50 77 72 69 74 65 28 69 64 2d 3e 68  = osPwrite(id->h
19190 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
191a0 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  set); }while( go
191b0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
191c0 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66  NTR );.#elif def
191d0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
191e0 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  ).  do{ got = os
191f0 50 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20  Pwrite64(id->h, 
19200 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19210 74 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  t);}while( got<0
19220 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
19230 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20  );.#else.  do{. 
19240 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c     newOffset = l
19250 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
19260 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
19270 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19280 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20  or( newOffset-- 
19290 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  );.    if( newOf
192a0 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
192b0 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66        if( newOff
192c0 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  set == -1 ){.   
192d0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
192e0 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
192f0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d  = errno;.      }
19300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28  else{.        ((
19310 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
19320 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09  astErrno = 0;...
19330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
19340 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
19350 20 20 20 20 67 6f 74 20 3d 20 6f 73 57 72 69 74      got = osWrit
19360 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
19370 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 67  nt);.  }while( g
19380 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
19390 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20  INTR );.#endif. 
193a0 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66   TIMER_END;.  if
193b0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28  ( got<0 ){.    (
193c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
193d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
193e0 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  o;.  }..  OSTRAC
193f0 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64  E(("WRITE   %-3d
19400 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
19410 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
19420 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
19430 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
19440 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n got;.}.../*.**
19450 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
19460 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
19470 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
19480 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
19490 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
194a0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
194b0 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
194c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72  tatic int unixWr
194d0 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
194e0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73  ile *id, .  cons
194f0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20  t void *pBuf, . 
19500 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
19510 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
19520 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20   .){.  unixFile 
19530 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
19540 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72  le*)id;.  int wr
19550 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
19560 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
19570 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
19580 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
19590 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
195a0 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
195b0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
195c0 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
195d0 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
195e0 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
195f0 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
19600 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
19610 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
19620 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
19630 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
19640 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
19650 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
19660 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
19670 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
19680 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
19690 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
196a0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
196b0 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
196c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
196d0 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
196e0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
196f0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
19700 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
19710 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
19720 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
19730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
19740 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
19750 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
19760 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
19770 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
19780 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19790 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
197a0 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
197b0 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
197c0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
197d0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
197e0 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
197f0 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
19800 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
19810 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
19820 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
19830 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
19840 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
19850 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
19860 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
19870 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19880 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
19890 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
198a0 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
198b0 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
198c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
198d0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
198e0 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
198f0 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
19900 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
19910 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
19920 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
19930 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
19940 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
19950 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
19960 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
19970 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19980 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
19990 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
199a0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
199b0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
199c0 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
199d0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
199e0 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
199f0 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
19a00 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
19a10 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
19a20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19a30 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
19a40 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
19a50 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
19a60 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
19a70 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
19a80 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
19a90 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
19aa0 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
19ab0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
19ac0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
19ad0 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
19ae0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19af0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
19b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19b10 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
19b20 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
19b30 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
19b40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19b50 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
19b60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
19b70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
19b80 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
19b90 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
19ba0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
19bb0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
19bc0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
19bd0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
19be0 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
19bf0 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
19c00 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
19c10 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
19c20 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
19c30 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
19c40 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
19c50 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
19c60 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
19c70 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
19c80 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
19c90 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
19ca0 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
19cb0 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
19cc0 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
19cd0 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
19ce0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
19cf0 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
19d00 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
19d10 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
19d20 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
19d30 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
19d40 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
19d50 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
19d60 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
19d70 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
19d80 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66 69  datasync).# defi
19d90 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
19da0 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
19db0 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
19dc0 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
19dd0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
19de0 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
19df0 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
19e00 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
19e10 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
19e20 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
19e30 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
19e40 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
19e50 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
19e60 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
19e70 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
19e80 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
19e90 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
19ea0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
19eb0 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
19ec0 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
19ed0 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
19ee0 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
19ef0 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
19f00 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
19f10 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
19f20 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
19f30 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
19f40 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
19f50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
19f60 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
19f70 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
19f80 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
19f90 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
19fa0 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
19fb0 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
19fc0 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
19fd0 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
19fe0 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
19ff0 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
1a000 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
1a010 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
1a020 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
1a030 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
1a040 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
1a050 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
1a060 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
1a070 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
1a080 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
1a090 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
1a0a0 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
1a0b0 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
1a0c0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a0d0 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
1a0e0 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
1a0f0 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
1a100 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
1a110 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
1a120 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
1a130 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
1a140 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
1a150 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
1a160 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1a170 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
1a180 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
1a190 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
1a1a0 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
1a1b0 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
1a1c0 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
1a1d0 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1a1e0 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
1a1f0 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
1a200 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
1a210 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
1a220 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
1a230 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
1a240 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
1a250 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
1a260 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
1a270 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
1a280 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
1a290 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
1a2a0 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
1a2b0 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
1a2c0 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
1a2d0 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
1a2e0 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
1a2f0 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
1a300 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
1a310 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
1a320 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
1a330 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
1a340 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
1a350 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
1a360 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
1a370 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
1a380 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
1a390 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
1a3a0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1a3b0 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1a3c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a3d0 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
1a3e0 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
1a3f0 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
1a400 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1a410 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
1a420 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
1a430 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
1a440 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
1a450 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
1a460 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
1a470 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
1a480 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
1a490 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
1a4a0 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
1a4b0 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
1a4c0 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
1a4d0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1a4e0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
1a4f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1a500 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1a510 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1a520 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a530 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1a540 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1a550 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1a560 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1a570 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
1a580 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1a590 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1a5a0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1a5b0 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
1a5c0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
1a5d0 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
1a5e0 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
1a5f0 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
1a600 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
1a610 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
1a620 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
1a630 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
1a640 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
1a650 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
1a660 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
1a670 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
1a680 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1a690 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
1a6a0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1a6b0 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
1a6c0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
1a6d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1a6e0 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
1a6f0 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
1a700 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
1a710 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
1a720 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
1a730 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1a740 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
1a750 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  OK;.#elif HAVE_F
1a760 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1a770 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1a780 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1a790 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1a7a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1a7b0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1a7c0 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1a7d0 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1a7e0 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1a7f0 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1a800 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1a810 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1a820 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1a830 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1a840 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1a850 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1a860 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1a870 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1a880 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1a890 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1a8a0 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1a8b0 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1a8c0 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1a8d0 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1a8e0 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1a8f0 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1a900 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1a910 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1a920 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1a930 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1a940 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1a950 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1a960 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1a970 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1a980 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1a990 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1a9a0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1a9b0 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1a9c0 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1a9d0 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1a9e0 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1a9f0 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1aa00 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1aa10 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1aa20 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1aa30 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1aa40 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1aa50 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1aa60 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1aa70 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1aa80 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1aa90 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1aaa0 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1aab0 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1aac0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1aad0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1aae0 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1aaf0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1ab00 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1ab10 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1ab20 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1ab30 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1ab40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ab50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1ab60 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1ab70 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1ab80 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1ab90 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1aba0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1abb0 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1abc0 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1abd0 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1abe0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1abf0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1ac00 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1ac10 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1ac20 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1ac30 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1ac40 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1ac50 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1ac60 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1ac70 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1ac80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1ac90 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1aca0 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1acb0 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1acc0 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1acd0 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1ace0 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1acf0 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1ad00 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1ad10 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1ad20 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1ad30 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1ad40 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1ad50 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1ad60 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1ad70 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1ad80 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1ad90 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1ada0 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1adb0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1adc0 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1add0 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1ade0 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1adf0 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1ae00 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1ae10 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1ae20 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1ae30 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1ae40 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1ae50 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1ae60 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1ae70 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1ae80 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1ae90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1aea0 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1aeb0 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1aec0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1aed0 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1aee0 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1aef0 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1af00 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1af10 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1af20 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1af30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1af40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1af50 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1af60 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1af70 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1af80 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1af90 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1afa0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1afb0 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1afc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1afd0 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1afe0 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1aff0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1b000 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1b010 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1b020 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1b030 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1b040 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1b050 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1b060 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1b070 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
1b080 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1b090 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1b0a0 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1b0b0 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1b0c0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
1b0d0 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
1b0e0 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1b0f0 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
1b100 66 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  fd>=0 ){.#ifdef 
1b110 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20  FD_CLOEXEC.     
1b120 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53   osFcntl(fd, F_S
1b130 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64  ETFD, osFcntl(fd
1b140 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
1b150 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
1b160 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
1b170 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E(("OPENDIR %-3d
1b180 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
1b190 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  name));.    }.  
1b1a0 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
1b1b0 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53   return (fd>=0?S
1b1c0 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67  QLITE_OK:unixLog
1b1d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1b1e0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1b1f0 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a  n", zDirname));.
1b200 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1b210 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
1b220 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
1b230 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
1b240 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1b250 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
1b260 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
1b270 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
1b280 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
1b290 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
1b2a0 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
1b2b0 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
1b2c0 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
1b2d0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
1b2e0 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
1b2f0 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
1b300 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
1b310 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
1b320 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
1b330 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
1b340 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
1b350 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
1b360 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
1b370 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
1b380 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
1b390 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
1b3a0 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
1b3b0 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
1b3c0 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
1b3d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1b3e0 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
1b3f0 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
1b400 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
1b410 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
1b420 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
1b430 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
1b440 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
1b450 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
1b460 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1b470 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
1b480 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
1b490 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b4a0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
1b4b0 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
1b4c0 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
1b4d0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1b4e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b4f0 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
1b500 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
1b510 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
1b520 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1b530 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1b540 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
1b550 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
1b560 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
1b570 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
1b580 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
1b590 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1b5a0 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
1b5b0 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
1b5c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1b5d0 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
1b5e0 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
1b5f0 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
1b600 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
1b610 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
1b620 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1b630 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
1b640 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
1b650 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
1b660 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
1b670 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
1b680 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
1b690 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
1b6a0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
1b6b0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1b6c0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
1b6d0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1b6e0 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
1b6f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
1b700 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1b710 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1b720 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
1b730 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
1b740 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
1b750 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
1b760 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
1b770 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1b780 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1b790 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1b7a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1b7b0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1b7c0 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1b7d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
1b7e0 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c  C, "full_fsync",
1b7f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1b800 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66    }..  /* Also f
1b810 73 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f  sync the directo
1b820 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
1b830 65 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49  e file if the DI
1b840 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20  RSYNC flag.  ** 
1b850 69 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73  is set.  This is
1b860 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75   a one-time occu
1b870 72 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79  rrance.  Many sy
1b880 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a  stems (examples:
1b890 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75   AIX).  ** are u
1b8a0 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61  nable to fsync a
1b8b0 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69   directory, so i
1b8c0 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20  gnore errors on 
1b8d0 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a  the fsync..  */.
1b8e0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
1b8f0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
1b900 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20  E_DIRSYNC ){.   
1b910 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20   int dirfd;.    
1b920 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e  OSTRACE(("DIRSYN
1b930 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66  C %s (have_fullf
1b940 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63  sync=%d fullsync
1b950 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  =%d)\n", pFile->
1b960 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20  zPath,.         
1b970 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e     HAVE_FULLFSYN
1b980 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b  C, isFullsync));
1b990 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e  .    rc = osOpen
1b9a0 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d  Directory(pFile-
1b9b0 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b  >zPath, &dirfd);
1b9c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b9d0 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e  ITE_OK && dirfd>
1b9e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  =0 ){.      full
1b9f0 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
1ba00 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73   0);.      robus
1ba10 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
1ba20 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1ba30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
1ba40 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
1ba50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EN ){.      rc =
1ba60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ba70 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  }.    pFile->ctr
1ba80 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46  lFlags &= ~UNIXF
1ba90 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d  ILE_DIRSYNC;.  }
1baa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bab0 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
1bac0 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
1bad0 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
1bae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1baf0 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69  nixTruncate(sqli
1bb00 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1bb10 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78  4 nByte){.  unix
1bb20 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1bb30 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
1bb40 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
1bb50 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
1bb60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1bb70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1bb80 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20  R_TRUNCATE );.. 
1bb90 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
1bba0 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61  has configured a
1bbb0 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20   chunk-size for 
1bbc0 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63  this file, trunc
1bbd0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  ate the.  ** fil
1bbe0 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
1bbf0 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65  sists of an inte
1bc00 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ger number of ch
1bc10 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20  unks (i.e. the. 
1bc20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20   ** actual file 
1bc30 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f  size after the o
1bc40 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  peration may be 
1bc50 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1bc60 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73  requested.  ** s
1bc70 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ize)..  */.  if(
1bc80 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
1bc90 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
1bca0 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
1bcb0 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
1bcc0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
1bcd0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
1bce0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62  .  }..  rc = rob
1bcf0 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1bd00 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e  ile->h, (off_t)n
1bd10 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Byte);.  if( rc 
1bd20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1bd30 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1bd40 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1bd50 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1bd60 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1bd70 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1bd80 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1bd90 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  lse{.#ifndef NDE
1bda0 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
1bdb0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1bdc0 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1bdd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1bde0 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
1bdf0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1be00 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1be10 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1be20 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1be30 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
1be40 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1be50 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
1be60 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1be70 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
1be80 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
1be90 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1bea0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
1beb0 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1bec0 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
1bed0 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
1bee0 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
1bef0 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
1bf00 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
1bf10 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
1bf20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1bf30 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
1bf40 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
1bf50 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1bf60 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
1bf70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1bf80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bf90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1bfa0 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1bfb0 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1bfc0 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1bfd0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1bfe0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1bff0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1c000 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1c010 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1c020 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1c030 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1c040 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1c050 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1c060 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1c070 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1c080 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1c090 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1c0a0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1c0b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c0c0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1c0d0 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1c0e0 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1c0f0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1c100 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1c110 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1c120 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1c130 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1c140 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1c150 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1c160 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1c170 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1c180 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1c190 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1c1a0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1c1b0 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1c1c0 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1c1d0 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1c1e0 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1c1f0 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1c200 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1c210 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1c220 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1c230 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1c240 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1c250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c260 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1c270 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c280 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1c290 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1c2a0 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1c2b0 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1c2c0 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1c2d0 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1c2e0 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1c2f0 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1c300 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1c310 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1c320 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1c330 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1c340 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1c350 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1c360 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1c370 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1c380 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1c390 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1c3a0 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65  on.  Enlarge the
1c3b0 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79   database to nBy
1c3c0 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28  tes in size.** (
1c3d0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68  rounded up to th
1c3e0 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a  e next chunk-siz
1c3f0 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  e).  If the data
1c400 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a  base is already.
1c410 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72  ** nBytes or lar
1c420 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ger, this routin
1c430 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1c440 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74  .static int fcnt
1c450 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69  lSizeHint(unixFi
1c460 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e  le *pFile, i64 n
1c470 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69  Byte){.  if( pFi
1c480 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1c490 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1c4c0 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1c4d0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c4f0 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65   Used to hold re
1c500 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66  turn values of f
1c510 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20  stat() */.   .  
1c520 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
1c530 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20  ile->h, &buf) ) 
1c540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c550 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20  ERR_FSTAT;..    
1c560 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1c570 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1c580 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1c590 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1c5a0 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1c5b0 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1c5c0 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1c5d0 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1c5e0 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1c5f0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1c600 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1c610 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1c620 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1c630 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1c640 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1c650 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1c660 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1c670 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1c680 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1c690 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1c6a0 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1c6b0 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1c6c0 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1c6d0 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1c6e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1c6f0 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1c700 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1c710 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1c720 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1c730 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1c740 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1c750 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1c760 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
1c770 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1c780 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
1c790 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
1c7a0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
1c7b0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1c7c0 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74  , fake it. First
1c7d0 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74   use.      ** ft
1c7e0 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74  runcate() to set
1c7f0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1c800 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e  then write a sin
1c810 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20  gle byte to.    
1c820 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79    ** the last by
1c830 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1c840 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1c850 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69  nded region. Thi
1c860 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  s.      ** is th
1c870 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65  e same technique
1c880 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74   used by glibc t
1c890 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69  o implement posi
1c8a0 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20  x_fallocate().  
1c8b0 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d      ** on system
1c8c0 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  s that do not ha
1c8d0 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1c8e0 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ate() system cal
1c8f0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
1c900 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66    int nBlk = buf
1c910 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a  .st_blksize;  /*
1c920 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f   File-system blo
1c930 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ck size */.     
1c940 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20   i64 iWrite;    
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c960 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77  Next offset to w
1c970 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20  rite to */..    
1c980 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1c990 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1c9a0 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   nSize) ){.     
1c9b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1c9c0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1c9d0 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
1c9e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1c9f0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1ca00 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1ca10 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1ca20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65    }.      iWrite
1ca30 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65   = ((buf.st_size
1ca40 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e   + 2*nBlk - 1)/n
1ca50 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20  Blk)*nBlk-1;.   
1ca60 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65     while( iWrite
1ca70 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  <nSize ){.      
1ca80 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73    int nWrite = s
1ca90 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1caa0 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1cab0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1cac0 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1cad0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1cae0 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57  RITE;.        iW
1caf0 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20  rite += nBlk;.  
1cb00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1cb10 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1cb20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1cb30 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1cb40 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
1cb50 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
1cb60 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
1cb70 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
1cb80 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
1cb90 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1cba0 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
1cbb0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
1cbc0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
1cbd0 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
1cbe0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
1cbf0 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
1cc00 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1cc10 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1cc20 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e  d unixModeBit(un
1cc30 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
1cc40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
1cc50 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
1cc60 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
1cc70 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
1cc80 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1cc90 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
1cca0 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
1ccb0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
1ccc0 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
1ccd0 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
1cce0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1ccf0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
1cd00 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
1cd10 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
1cd20 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
1cd30 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1cd40 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
1cd50 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1cd60 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
1cd70 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
1cd80 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1cd90 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1cda0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1cdb0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1cdc0 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1cdd0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1cde0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1cdf0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1ce00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ce10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1ce20 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
1ce30 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1ce40 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
1ce50 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
1ce60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ce70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ce80 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1ce90 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1cea0 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
1ceb0 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1cec0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ced0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1cee0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1cef0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
1cf00 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1cf10 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1cf20 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1cf30 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
1cf40 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
1cf50 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
1cf60 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1cf70 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1cf80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cf90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1cfa0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
1cfb0 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
1cfc0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
1cfd0 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
1cfe0 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
1cff0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1d000 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d010 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1d020 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
1d030 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
1d040 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1d050 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1d060 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
1d070 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1d080 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d090 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1d0a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1d0b0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
1d0c0 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
1d0d0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1d0e0 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
1d0f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1d100 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d110 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
1d120 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  BUG.    /* The p
1d130 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ager calls this 
1d140 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c  method to signal
1d150 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e   that it has don
1d160 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  e.    ** a rollb
1d170 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1d180 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
1d190 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64  refore unchanged
1d1a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68   and.    ** it h
1d1b0 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f  ence it is OK fo
1d1c0 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
1d1d0 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  n change counter
1d1e0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e   to be.    ** un
1d1f0 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a  changed..    */.
1d200 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d210 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d220 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e  ED: {.      ((un
1d230 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55  ixFile*)id)->dbU
1d240 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  pdate = 0;.     
1d250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d260 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  K;.    }.#endif.
1d270 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1d280 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1d290 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1d2a0 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  LE__).    case S
1d2b0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
1d2c0 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73  OXYFILE:.    cas
1d2d0 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
1d2e0 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
1d2f0 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
1d300 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f  FileControl(id,o
1d310 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23  p,pArg);.    }.#
1d320 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1d330 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d340 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1d350 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20  __APPLE__) */.  
1d360 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1d370 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
1d380 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1d390 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
1d3a0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
1d3b0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
1d3c0 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
1d3d0 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
1d3e0 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
1d3f0 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
1d400 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
1d410 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
1d420 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
1d430 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
1d440 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1d450 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
1d460 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1d470 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
1d480 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
1d490 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
1d4a0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
1d4b0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
1d4c0 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
1d4d0 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
1d4e0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
1d4f0 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
1d500 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
1d510 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
1d520 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1d530 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1d540 20 28 76 6f 69 64 29 70 46 69 6c 65 3b 0a 20 20   (void)pFile;.  
1d550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
1d560 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
1d570 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
1d580 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68  rn the device ch
1d590 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f  aracteristics fo
1d5a0 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  r the file..**.*
1d5b0 2a 20 54 68 69 73 20 56 46 53 20 69 73 20 73 65  * This VFS is se
1d5c0 74 20 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53  t up to return S
1d5d0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1d5e0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1d5f0 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48  by default..** H
1d600 6f 77 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f  owever, that cho
1d610 69 63 65 20 69 73 20 63 6f 6e 74 72 61 76 65 72  ice is contraver
1d620 73 69 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e  sial since techn
1d630 69 63 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72  ically the under
1d640 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79  lying.** file sy
1d650 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c  stem does not al
1d660 77 61 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77  ways provide pow
1d670 65 72 73 61 66 65 20 6f 76 65 72 77 72 69 74 65  ersafe overwrite
1d680 73 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a  s.  (In other.**
1d690 20 77 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20   words, after a 
1d6a0 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74  power-loss event
1d6b0 2c 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 66  , parts of the f
1d6c0 69 6c 65 20 74 68 61 74 20 77 65 72 65 20 6e 65  ile that were ne
1d6d0 76 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d  ver.** written m
1d6e0 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
1d6f0 67 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77  g altered.)  How
1d700 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62  ever, non-PSOW b
1d710 65 68 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c  ehavior is very,
1d720 0a 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20  .** very rare.  
1d730 41 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50 53  And asserting PS
1d740 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65  OW makes a large
1d750 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68   reduction in th
1d760 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72  e amount.** of r
1d770 65 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20  equired I/O for 
1d780 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63  journaling, sinc
1d790 65 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69  e a lot of paddi
1d7a0 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64  ng is eliminated
1d7b0 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69  ..**  Hence, whi
1d7c0 6c 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  le POWERSAFE_OVE
1d7d0 52 57 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20  RWRITE is on by 
1d7e0 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69  default, there i
1d7f0 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  s a file-control
1d800 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  .** available to
1d810 20 74 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64   turn it off and
1d820 20 55 52 49 20 71 75 65 72 79 20 70 61 72 61 6d   URI query param
1d830 65 74 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74  eter available t
1d840 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a  o turn it off..*
1d850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1d860 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1d870 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
1d880 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
1d890 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46  File *p = (unixF
1d8a0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
1d8b0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1d8c0 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20  IXFILE_PSOW ){. 
1d8d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d8e0 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1d8f0 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 65  _OVERWRITE;.  }e
1d900 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1d910 30 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  0;.  }.}..#ifnde
1d920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1d930 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  L.../*.** Object
1d940 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
1d950 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d  nt an shared mem
1d960 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a  ory buffer.  .**
1d970 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  .** When multipl
1d980 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
1d990 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
1d9a0 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68   wal-index, each
1d9b0 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69   thread.** has i
1d9c0 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f  ts own unixShm o
1d9d0 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20  bject, but they 
1d9e0 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  all point to a s
1d9f0 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a  ingle instance.*
1da00 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68  * of this unixSh
1da10 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49  mNode object.  I
1da20 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
1da30 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73  ach wal-index is
1da40 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20   opened.** only 
1da50 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
1da60 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69  ..**.** Each uni
1da70 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1da80 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
1da90 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f  a single unixIno
1daa0 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
1dab0 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65  * We could coale
1dac0 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  sce this object 
1dad0 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e  into unixInodeIn
1dae0 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75  fo, but that wou
1daf0 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79  ld mean.** every
1db00 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20   open file that 
1db10 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61  does not use sha
1db20 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f  red memory (in o
1db30 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74  ther words, most
1db40 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20  .** open files) 
1db50 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61  would have to ca
1db60 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20  rry around this 
1db70 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
1db80 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e  n.  So.** the un
1db90 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
1dba0 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ct contains a po
1dbb0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e  inter to this un
1dbc0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1dbd0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78  .** and the unix
1dbe0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
1dbf0 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77  s created only w
1dc00 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a  hen needed..**.*
1dc10 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  * unixMutexHeld(
1dc20 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
1dc30 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
1dc40 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
1dc50 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
1dc60 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
1dc70 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
1dc80 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
1dc90 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a  *      nRef.**.*
1dca0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1dcb0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d  fields are read-
1dcc0 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f  only after the o
1dcd0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
1dce0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69  :.** .**      fi
1dcf0 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
1dd00 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
1dd10 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74   unixShmNode.mut
1dd20 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
1dd30 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  or unixShmNode.n
1dd40 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e  Ref==0 and.** un
1dd50 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
1dd60 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
1dd70 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
1dd80 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
1dd90 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
1dda0 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  re..*/.struct un
1ddb0 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e  ixShmNode {.  un
1ddc0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1ddd0 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78  ode;     /* unix
1dde0 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f  InodeInfo that o
1ddf0 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64  wns this SHM nod
1de00 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
1de10 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
1de20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
1de30 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
1de40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
1de50 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1de60 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1de70 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1de80 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20    int h;        
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dea0 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
1deb0 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ptor */.  int sz
1dec0 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
1ded0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1dee0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1def0 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e  gions */.  u16 n
1df00 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
1df10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1df20 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20   array apRegion 
1df30 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e  */.  u8 isReadon
1df40 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
1df50 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d  /* True if read-
1df60 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  only */.  char *
1df70 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  *apRegion;      
1df80 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1df90 20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d   mapped shared-m
1dfa0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1dfb0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dfd0 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53   Number of unixS
1dfe0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
1dff0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
1e000 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74   unixShm *pFirst
1e010 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
1e020 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ll unixShm objec
1e030 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1e040 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  his */.#ifdef SQ
1e050 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
1e060 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
1e070 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1e080 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
1e090 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1e0a0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
1e0b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1e0c0 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
1e0d0 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78  held */.  u8 nex
1e0e0 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20  tShmId;         
1e0f0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
1e100 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69  ilable unixShm.i
1e110 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
1e120 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  f.};../*.** Stru
1e130 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
1e140 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
1e150 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
1e160 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
1e170 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
1e180 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
1e190 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1e1a0 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
1e1b0 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
1e1c0 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
1e1d0 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
1e1e0 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
1e1f0 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75  fter:.**.**    u
1e200 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20  nixShm.pFile.** 
1e210 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a     unixShm.id.**
1e220 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
1e230 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
1e240 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68  ite.  The unixSh
1e250 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d  m.pFile->mutex m
1e260 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
1e270 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
1e280 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
1e290 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
1e2a0 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78  unixShm {.  unix
1e2b0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1e2c0 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  e;     /* The un
1e2d0 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d  derlying unixShm
1e2e0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
1e2f0 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b   unixShm *pNext;
1e300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e310 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68  ext unixShm with
1e320 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68   the same unixSh
1e330 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
1e340 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
1e350 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e360 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69   holding the uni
1e370 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  xShmNode mutex *
1e380 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  /.  u8 id;      
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e3a0 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
1e3b0 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69  nection within i
1e3c0 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ts unixShmNode *
1e3d0 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
1e3e0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
1e3f0 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
1e400 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
1e410 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
1e420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1e430 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
1e440 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d   locks held */.}
1e450 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  ;../*.** Constan
1e460 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ts used for lock
1e470 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ing.*/.#define U
1e480 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28  NIX_SHM_BASE   (
1e490 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  (22+SQLITE_SHM_N
1e4a0 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20  LOCK)*4)        
1e4b0 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
1e4c0 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  yte */.#define U
1e4d0 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  NIX_SHM_DMS    (
1e4e0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51  UNIX_SHM_BASE+SQ
1e4f0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
1e500 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
1e510 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
1e520 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  ly posix advisor
1e530 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
1e540 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20  bytes from ofst 
1e550 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31  through ofst+n-1
1e560 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c  ..**.** Locks bl
1e570 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20  ock if the mask 
1e580 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f  is exactly UNIX_
1e590 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f  SHM_C and are no
1e5a0 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74  n-blocking.** ot
1e5b0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
1e5c0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79  ic int unixShmSy
1e5d0 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78  stemLock(.  unix
1e5e0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1e5f0 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b  e, /* Apply lock
1e600 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
1e610 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
1e620 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ment */.  int lo
1e630 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
1e640 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52   /* F_UNLCK, F_R
1e650 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b  DLCK, or F_WRLCK
1e660 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e680 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
1e690 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
1e6a0 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20  */.  int n      
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e6c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1e6d0 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  o lock */.){.  s
1e6e0 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20  truct flock f;  
1e6f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69       /* The posi
1e700 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69  x advisory locki
1e710 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ng structure */.
1e720 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e730 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c  E_OK;   /* Resul
1e740 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74  t code form fcnt
1e750 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  l() */..  /* Acc
1e760 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
1e770 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
1e780 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
1e790 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61  he caller */.  a
1e7a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1e7b0 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f  utex_held(pShmNo
1e7c0 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53  de->mutex) || pS
1e7d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
1e7e0 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20  );..  /* Shared 
1e7f0 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e  locks never span
1e800 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
1e810 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  yte */.  assert(
1e820 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70   n==1 || lockTyp
1e830 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20  e!=F_RDLCK );.. 
1e840 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69   /* Locks are wi
1e850 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  thin range */.  
1e860 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20  assert( n>=1 && 
1e870 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  n<SQLITE_SHM_NLO
1e880 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  CK );..  if( pSh
1e890 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
1e8a0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1e8b0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
1e8c0 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d  ameters */.    m
1e8d0 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a  emset(&f, 0, siz
1e8e0 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c  eof(f));.    f.l
1e8f0 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65  _type = lockType
1e900 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65  ;.    f.l_whence
1e910 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
1e920 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73   f.l_start = ofs
1e930 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d  t;.    f.l_len =
1e940 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73   n;..    rc = os
1e950 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fcntl(pShmNode->
1e960 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b  h, F_SETLK, &f);
1e970 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28  .    rc = (rc!=(
1e980 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  -1)) ? SQLITE_OK
1e990 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
1e9a0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
1e9b0 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b   the global lock
1e9c0 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65   state and do de
1e9d0 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  bug tracing */.#
1e9e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1e9f0 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b  UG.  { u16 mask;
1ea00 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1ea10 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73  -LOCK "));.  mas
1ea20 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
1ea30 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
1ea40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ea50 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  OK ){.    if( lo
1ea60 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
1ea70 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1ea80 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22  (("unlock %d ok"
1ea90 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
1eaa0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1eab0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1eac0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1ead0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
1eae0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1eaf0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
1eb00 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
1eb10 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25  CE(("read-lock %
1eb20 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
1eb30 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
1eb40 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1eb50 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1eb60 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
1eb70 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mask;.    }else{
1eb80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
1eb90 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
1eba0 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
1ebb0 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
1ebc0 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
1ebd0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
1ebe0 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
1ebf0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1ec00 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
1ec10 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1ec20 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  lse{.    if( loc
1ec30 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
1ec40 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1ec50 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ("unlock %d fail
1ec60 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
1ec70 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
1ec80 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
1ec90 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1eca0 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64  read-lock failed
1ecb0 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  "));.    }else{.
1ecc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
1ecd0 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
1ece0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1ecf0 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
1ed00 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
1ed10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
1ed20 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72  TRACE((" - after
1ed30 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c  wards %03x,%03x\
1ed40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
1ed50 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
1ed60 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65  ask, pShmNode->e
1ed70 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23  xclMask));.  }.#
1ed80 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1ed90 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a  rc;        .}...
1eda0 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
1edb0 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20  unixShmNodeList 
1edc0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
1edd0 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d  ies with unixShm
1ede0 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
1edf0 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
1ee00 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
1ee10 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
1ee20 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
1ee30 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
1ee40 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
1ee50 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
1ee60 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1ee70 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c  ShmPurge(unixFil
1ee80 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53  e *pFd){.  unixS
1ee90 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d  hmNode *p = pFd-
1eea0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1eeb0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
1eec0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
1eed0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52    if( p && p->nR
1eee0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ef==0 ){.    int
1eef0 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
1ef00 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
1ef10 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71  pInode );.    sq
1ef20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
1ef30 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
1ef40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
1ef50 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
1ef60 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
1ef70 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e 6d 61 70  {.        munmap
1ef80 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c  (p->apRegion[i],
1ef90 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   p->szRegion);. 
1efa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1efb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1efc0 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29  (p->apRegion[i])
1efd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1efe0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1eff0 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20  (p->apRegion);. 
1f000 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
1f010 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
1f020 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20  lose(pFd, p->h, 
1f030 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
1f040 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20   p->h = -1;.    
1f050 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d  }.    p->pInode-
1f060 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20  >pShmNode = 0;. 
1f070 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f080 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
1f090 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d   Open a shared-m
1f0a0 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
1f0b0 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20  iated with open 
1f0c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
1f0d0 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70  bFd.  .** This p
1f0e0 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d  articular implem
1f0f0 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d  entation uses mm
1f100 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a  apped files..**.
1f110 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64  ** The file used
1f120 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68   to implement sh
1f130 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69  ared-memory is i
1f140 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
1f150 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f  tory.** as the o
1f160 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1f170 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  e and has the sa
1f180 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
1f190 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  pen database.** 
1f1a0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d  file with the "-
1f1b0 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65  shm" suffix adde
1f1c0 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  d.  For example,
1f1d0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1f1e0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f   file.** is "/ho
1f1f0 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
1f200 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c  db" then the fil
1f210 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  e that is create
1f220 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a  d and mmapped.**
1f230 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
1f240 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ry will be calle
1f250 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  d "/home/user1/c
1f260 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20  onfig.db-shm".  
1f270 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61  .**.** Another a
1f280 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f  pproach to is to
1f290 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64   use files in /d
1f2a0 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74  ev/shm or /dev/t
1f2b0 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65  mp or an.** some
1f2c0 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75   other tmpfs mou
1f2d0 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c  nt. But if a fil
1f2e0 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  e in a different
1f2f0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72   directory.** fr
1f300 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1f310 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68  file is used, th
1f320 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63  en differing acc
1f330 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  ess permissions.
1f340 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29  ** or a chroot()
1f350 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f   might cause two
1f360 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65   different proce
1f370 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sses on the same
1f380 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20  .** database to 
1f390 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66  end up using dif
1f3a0 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72  ferent files for
1f3b0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d   shared memory -
1f3c0 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61   .** meaning tha
1f3d0 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77  t their memory w
1f3e0 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20  ould not really 
1f3f0 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75  be shared - resu
1f400 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61  lting.** in data
1f410 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1f420 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
1f430 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20  this tmpfs file 
1f440 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20  usage.** can be 
1f450 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
1f460 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44  le-time using -D
1f470 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1f480 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a  TORY="/dev/shm".
1f490 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61  ** or the equiva
1f4a0 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f  lent.  The use o
1f4b0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d  f the SQLITE_SHM
1f4c0 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69  _DIRECTORY compi
1f4d0 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f  le-time.** optio
1f4e0 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20  n results in an 
1f4f0 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69  incompatible bui
1f500 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62  ld of SQLite;  b
1f510 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a  uilds of SQLite.
1f520 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66  ** that with dif
1f530 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48  fering SQLITE_SH
1f540 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74  M_DIRECTORY sett
1f550 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ings attempt to 
1f560 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  use the.** same 
1f570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
1f580 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
1f590 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1f5a0 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  ion will likely.
1f5b0 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53  ** result. The S
1f5c0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1f5d0 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
1f5e0 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69   option is consi
1f5f0 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70  dered.** "unsupp
1f600 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67  orted" and may g
1f610 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75  o away in a futu
1f620 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73  re SQLite releas
1f630 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  e..**.** When op
1f640 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
1f650 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
1f660 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
1f670 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
1f680 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
1f690 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
1f6a0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
1f6b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
1f6c0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
1f6d0 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
1f6e0 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
1f6f0 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
1f700 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
1f710 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67  *.** If the orig
1f720 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1f730 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73  le (pDbFd) is us
1f740 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78  ing the "unix-ex
1f750 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20  cl" VFS.** that 
1f760 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78  means that an ex
1f770 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
1f780 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1f790 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a  base file and.**
1f7a0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
1f7b0 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c  rocesses are abl
1f7c0 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  e to read or wri
1f7d0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  te the database.
1f7e0 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73    In.** that cas
1f7f0 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61  e, we do not rea
1f800 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20  lly need shared 
1f810 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72  memory.  No shar
1f820 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c  ed memory.** fil
1f830 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
1f840 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1f850 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74   will be simulat
1f860 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d  ed with heap mem
1f870 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
1f880 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65  nt unixOpenShare
1f890 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65  dMemory(unixFile
1f8a0 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
1f8b0 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  ct unixShm *p = 
1f8c0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0;          /* T
1f8d0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1f8e0 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
1f8f0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
1f900 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
1f910 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1f920 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
1f930 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1f960 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  de */.  unixInod
1f970 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
1f980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1f990 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20  node of fd */.  
1f9a0 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61  char *zShmFilena
1f9b0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
1f9c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
1f9d0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d  ile used for SHM
1f9e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69   */.  int nShmFi
1f9f0 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
1fa00 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1fa10 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d   the SHM filenam
1fa20 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
1fa30 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
1fa40 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  ce for the new u
1fa50 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a  nixShm object. *
1fa60 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  /.  p = sqlite3_
1fa70 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
1fa80 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
1fa90 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1faa0 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
1fab0 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
1fac0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  ));.  assert( pD
1fad0 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  bFd->pShm==0 );.
1fae0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1faf0 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e  ee if a unixShmN
1fb00 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61  ode object alrea
1fb10 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65  dy exists. Reuse
1fb20 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
1fb30 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74  * one if present
1fb40 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f  . Create a new o
1fb50 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
1fb60 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
1fb70 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
1fb80 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
1fb90 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  de;.  pShmNode =
1fba0 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
1fbb0 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  e;.  if( pShmNod
1fbc0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  e==0 ){.    stru
1fbd0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fbf0 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66  * fstat() info f
1fc00 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
1fc10 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c   */..    /* Call
1fc20 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75   fstat() to figu
1fc30 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69  re out the permi
1fc40 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61  ssions on the da
1fc50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
1fc60 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73      ** a new *-s
1fc70 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  hm file is creat
1fc80 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77  ed, an attempt w
1fc90 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63  ill be made to c
1fca0 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  reate it.    ** 
1fcb0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65  with the same pe
1fcc0 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a  rmissions..    *
1fcd0 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
1fce0 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74  t(pDbFd->h, &sSt
1fcf0 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62  at) && pInode->b
1fd00 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
1fd10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1fd20 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1fd30 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1fd40 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1fd50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
1fd60 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
1fd70 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
1fd80 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
1fd90 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
1fda0 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  1;.#else.    nSh
1fdb0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20  mFilename = 6 + 
1fdc0 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46  (int)strlen(pDbF
1fdd0 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69  d->zPath);.#endi
1fde0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
1fdf0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1fe00 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
1fe10 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  e) + nShmFilenam
1fe20 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  e );.    if( pSh
1fe30 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
1fe40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1fe50 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1fe60 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1fe70 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
1fe80 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  ShmNode, 0, size
1fe90 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53  of(*pShmNode)+nS
1fea0 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
1feb0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   zShmFilename = 
1fec0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
1fed0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53  ame = (char*)&pS
1fee0 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65  hmNode[1];.#ifde
1fef0 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
1ff00 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74  ECTORY.    sqlit
1ff10 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
1ff20 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
1ff30 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  lename, .       
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1ff50 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1ff60 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d  RY "/sqlite-shm-
1ff70 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20  %x-%x",.        
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
1ff90 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20  2)sStat.st_ino, 
1ffa0 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65  (u32)sStat.st_de
1ffb0 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71  v);.#else.    sq
1ffc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
1ffd0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
1ffe0 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  mFilename, "%s-s
1fff0 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
20000 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
20010 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
20020 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
20030 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
20040 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
20050 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
20060 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
20070 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
20080 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
20090 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
200a0 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
200b0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
200c0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
200d0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
200e0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
200f0 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
20100 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20110 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
20120 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
20130 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
20140 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
20150 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
20160 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
20170 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
20180 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  T;.      if( sql
20190 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
201a0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22  (pDbFd->zPath, "
201b0 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30  readonly_shm", 0
201c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65  ) ){.        ope
201d0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
201e0 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  Y;.        pShmN
201f0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
20200 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
20210 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
20220 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
20230 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46  mFilename, openF
20240 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f  lags, (sStat.st_
20250 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20  mode&0777));.   
20260 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
20270 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
20280 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
20290 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
202a0 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
202b0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
202c0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f         goto shm_
202d0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20  open_err;.      
202e0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
202f0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72  his process is r
20300 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20  unning as root, 
20310 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
20320 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20  he SHM file.    
20330 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79    ** is owned by
20340 20 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74   the same user t
20350 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69  hat owns the ori
20360 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20  ginal database. 
20370 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
20380 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
20390 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74  l owner will not
203a0 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e   be able to conn
203b0 65 63 74 2e 20 49 66 20 74 68 69 73 20 70 72 6f  ect. If this pro
203c0 63 65 73 73 20 69 73 0a 20 20 20 20 20 20 2a 2a  cess is.      **
203d0 20 6e 6f 74 20 72 6f 6f 74 2c 20 74 68 65 20 66   not root, the f
203e0 6f 6c 6c 6f 77 69 6e 67 20 66 63 68 6f 77 6e 28  ollowing fchown(
203f0 29 20 77 69 6c 6c 20 66 61 69 6c 2c 20 62 75 74  ) will fail, but
20400 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
20410 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 66   The.      ** if
20420 28 29 7b 2e 2e 7d 20 61 6e 64 20 74 68 65 20 55  (){..} and the U
20430 4e 49 58 46 49 4c 45 5f 43 48 4f 57 4e 20 66 6c  NIXFILE_CHOWN fl
20440 61 67 20 61 72 65 20 70 75 72 65 6c 79 20 74 6f  ag are purely to
20450 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
20460 72 0a 20 20 20 20 20 20 2a 2a 20 77 61 72 6e 69  r.      ** warni
20470 6e 67 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ngs..      */.  
20480 20 20 20 20 69 66 28 20 6f 73 46 63 68 6f 77 6e      if( osFchown
20490 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53  (pShmNode->h, sS
204a0 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61  tat.st_uid, sSta
204b0 74 2e 73 74 5f 67 69 64 29 3d 3d 30 20 29 7b 0a  t.st_gid)==0 ){.
204c0 20 20 20 20 20 20 20 20 70 44 62 46 64 2d 3e 63          pDbFd->c
204d0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
204e0 46 49 4c 45 5f 43 48 4f 57 4e 3b 0a 20 20 20 20  FILE_CHOWN;.    
204f0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
20500 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
20510 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
20520 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
20530 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
20540 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c        ** If not,
20550 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
20560 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
20570 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  h. .      */.   
20580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20590 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  K;.      if( uni
205a0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
205b0 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
205c0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
205d0 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
205e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62  .        if( rob
205f0 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53  ust_ftruncate(pS
20600 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b  hmNode->h, 0) ){
20610 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20620 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
20630 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
20640 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  N, "ftruncate", 
20650 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
20660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20670 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
20680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20690 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
206a0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
206b0 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e  ode, F_RDLCK, UN
206c0 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IX_SHM_DMS, 1);.
206d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
206e0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
206f0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
20700 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
20710 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
20720 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
20730 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
20740 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
20750 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
20760 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20770 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
20780 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
20790 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
207a0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
207b0 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
207c0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
207d0 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
207e0 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
207f0 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
20800 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
20810 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
20820 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
20830 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
20840 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
20850 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
20860 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
20870 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
20880 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
20890 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
208a0 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
208b0 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
208c0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
208d0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
208e0 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
208f0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
20900 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
20910 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
20920 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
20930 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
20940 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
20950 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
20960 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
20970 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
20980 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
20990 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
209a0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
209b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
209c0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
209d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
209e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
209f0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
20a00 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
20a10 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
20a20 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
20a30 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
20a40 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
20a50 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
20a60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
20a70 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
20a80 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
20a90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20aa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20ab0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
20ac0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
20ad0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
20ae0 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
20af0 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
20b00 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
20b10 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
20b20 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
20b30 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
20b40 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
20b50 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
20b60 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
20b70 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
20b80 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
20b90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
20ba0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
20bb0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
20bc0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
20bd0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
20be0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
20bf0 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61  f the bExtend pa
20c00 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
20c10 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
20c20 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
20c30 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
20c40 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
20c50 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
20c60 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
20c70 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
20c80 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
20c90 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
20ca0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
20cb0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
20cc0 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73  f .** bExtend is
20cd0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
20ce0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
20cf0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
20d00 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
20d10 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
20d20 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
20d30 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
20d40 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
20d50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
20d60 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
20d70 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
20d80 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
20d90 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
20da0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
20db0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
20dc0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
20dd0 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
20de0 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
20df0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
20e00 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
20e10 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
20e20 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
20e30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
20e40 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
20e50 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61  ic int unixShmMa
20e60 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
20e70 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
20e80 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
20e90 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
20ea0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
20eb0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
20ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
20ed0 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
20ee0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
20ef0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20f00 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
20f10 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
20f20 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20   bExtend,       
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20f40 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
20f50 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
20f60 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
20f70 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
20f80 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
20f90 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
20fa0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
20fb0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
20fc0 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
20fd0 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  p;.  unixShmNode
20fe0 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
20ff0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21000 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
21010 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
21020 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
21030 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
21040 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28  it now. */.  if(
21050 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
21060 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  ){.    rc = unix
21070 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
21080 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
21090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
210a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
210b0 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
210c0 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  hm;.  pShmNode =
210d0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20   p->pShmNode;.  
210e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
210f0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
21100 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
21110 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
21120 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
21130 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
21140 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
21150 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
21160 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
21170 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
21180 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c  ShmNode->h>=0 ||
21190 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
211a0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20  bProcessLock==1 
211b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
211c0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44  mNode->h<0 || pD
211d0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
211e0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
211f0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
21200 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
21210 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
21220 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
21230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21240 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72  ew apRegion[] ar
21250 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
21260 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
21270 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a  1)*szRegion;  /*
21280 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
21290 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
212a0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
212b0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
212c0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
212d0 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20   fstat() */..   
212e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
212f0 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
21300 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
21310 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
21320 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
21330 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
21340 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
21350 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
21360 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20  ss space..      
21370 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
21380 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
21390 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
213a0 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
213b0 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  file is.      **
213c0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
213d0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
213e0 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
213f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21400 66 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e  f( osFstat(pShmN
21410 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  ode->h, &sStat) 
21420 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21430 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
21440 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f  SIZE;.        go
21450 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
21460 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
21470 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69   if( sStat.st_si
21480 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  ze<nByte ){.    
21490 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
214a0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
214b0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
214c0 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73  t. If bExtend is
214d0 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20   set to.        
214e0 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65  ** false, exit e
214f0 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
21500 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
21510 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
21520 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  rned..        **
21530 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65  .        ** Alte
21540 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45  rnatively, if bE
21550 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75  xtend is true, u
21560 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  se ftruncate() t
21570 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20  o allocate.     
21580 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
21590 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
215a0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
215b0 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65        if( !bExte
215c0 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  nd ) goto shmpag
215d0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69  e_out;.        i
215e0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
215f0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
21600 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20   nByte) ){.     
21610 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
21620 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
21630 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74  ERR_SHMSIZE, "ft
21640 72 75 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20  runcate",.      
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21660 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21670 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
21680 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
21690 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
216a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
216b0 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
216c0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
216d0 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
216e0 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
216f0 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
21700 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
21710 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
21720 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
21730 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
21740 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65  (iRegion+1)*size
21750 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29  of(char *).    )
21760 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
21770 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
21780 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21790 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
217a0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
217b0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
217c0 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  pRegion = apNew;
217d0 0a 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e  .    while(pShmN
217e0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
217f0 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f  egion){.      vo
21800 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20  id *pMem;.      
21810 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
21820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =0 ){.        pM
21830 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52  em = mmap(0, szR
21840 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  egion,.         
21850 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52     pShmNode->isR
21860 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52  eadonly ? PROT_R
21870 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c  EAD : PROT_READ|
21880 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20  PROT_WRITE, .   
21890 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41           MAP_SHA
218a0 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  RED, pShmNode->h
218b0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
218c0 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20  ion*szRegion.   
218d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
218e0 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41  if( pMem==MAP_FA
218f0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
21900 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
21910 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
21920 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c  _SHMMAP, "mmap",
21930 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
21940 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
21950 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
21960 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
21970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21980 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33    pMem = sqlite3
21990 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e  _malloc(szRegion
219a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
219b0 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
219c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
219d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
219e0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
219f0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
21a00 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
21a10 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
21a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
21a30 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
21a40 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
21a50 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20  on] = pMem;.    
21a60 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
21a70 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ion++;.    }.  }
21a80 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
21a90 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
21aa0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
21ab0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
21ac0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
21ad0 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
21ae0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
21af0 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
21b00 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
21b10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21b20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
21b30 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
21b40 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
21b50 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
21b60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21b70 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21b80 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
21b90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
21ba0 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
21bb0 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
21bc0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
21bd0 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
21be0 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
21bf0 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
21c00 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
21c10 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
21c20 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
21c30 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
21c40 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
21c50 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
21c60 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
21c70 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
21c80 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
21c90 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
21ca0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
21cb0 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
21cc0 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
21cd0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
21ce0 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
21cf0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
21d00 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
21d10 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
21d20 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
21d30 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d50 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
21d60 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
21d70 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21da0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
21db0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
21dc0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21de0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
21df0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
21e00 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
21e10 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
21e20 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
21e30 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
21e40 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
21e50 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
21e60 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
21e70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
21e80 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
21e90 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
21ea0 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
21ed0 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
21ee0 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
21ef0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
21f00 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
21f10 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
21f20 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
21f30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21f40 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
21f50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
21f60 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
21f70 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
21fa0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
21fb0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
21fc0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
21fd0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
21fe0 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
21ff0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
22000 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
22010 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
22020 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
22030 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
22040 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
22050 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
22060 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
22070 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
22080 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
22090 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
220a0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
220b0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
220c0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
220d0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
220e0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
220f0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
22100 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
22110 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
22120 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
22130 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
22140 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
22150 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
22160 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
22170 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
22180 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
22190 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
221a0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
221b0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
221c0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
221d0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
221e0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
221f0 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
22200 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
22210 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
22220 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
22230 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
22240 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22250 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
22260 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
22270 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
22280 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
22290 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
222a0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
222b0 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
222c0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
222d0 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
222e0 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
222f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
22300 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
22310 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
22320 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
22330 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
22340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
22350 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
22360 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
22370 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
22380 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
22390 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
223a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
223b0 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
223c0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
223d0 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
223e0 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
223f0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
22400 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
22410 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20  mNode, F_UNLCK, 
22420 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
22430 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
22440 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
22450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
22460 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
22470 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
22480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
224a0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
224b0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
224c0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
224d0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
224e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
224f0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
22500 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
22510 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
22520 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
22530 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
22540 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
22550 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
22560 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
22570 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
22580 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
22590 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
225a0 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
225b0 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
225c0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
225d0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
225e0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
225f0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
22600 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
22610 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
22620 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
22630 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
22640 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
22650 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
22660 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
22670 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
22680 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
22690 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
226a0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
226b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
226c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
226d0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
226e0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
226f0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
22700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22710 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
22720 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
22730 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
22740 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
22750 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
22760 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
22770 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
22780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
22790 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
227a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
227b0 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
227c0 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
227d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
227e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
227f0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
22800 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
22810 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
22820 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
22830 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
22840 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
22850 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
22860 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
22870 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
22880 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
22890 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
228a0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
228b0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
228c0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
228d0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
228e0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
228f0 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
22900 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
22910 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
22920 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
22930 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22940 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
22950 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
22960 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
22970 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
22980 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
22990 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
229a0 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
229b0 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
229c0 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
229d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
229e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
229f0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
22a00 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
22a10 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  , F_WRLCK, ofst+
22a20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
22a30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
22a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
22a60 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
22a70 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
22a80 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
22a90 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
22aa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
22ab0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22ac0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
22ad0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
22ae0 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
22af0 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78   pid-%d got %03x
22b00 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
22b10 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70       p->id, getp
22b20 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  id(), p->sharedM
22b30 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
22b40 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
22b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
22b60 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
22b70 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
22b80 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
22b90 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
22ba0 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
22bb0 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
22bc0 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
22bd0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
22be0 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
22bf0 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
22c00 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
22c10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
22c20 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20  nixShmBarrier(. 
22c30 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
22c40 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
22c50 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
22c60 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
22c70 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
22c80 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
22c90 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78  ETER(fd);.  unix
22ca0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
22cb0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
22cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
22cd0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
22ce0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
22cf0 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
22d00 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
22d10 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
22d20 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
22d30 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
22d40 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
22d50 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22d60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e   connection then
22d70 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
22d80 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
22d90 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
22da0 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  int unixShmUnmap
22db0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
22dc0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
22dd0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
22de0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
22df0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ile */.  int del
22e00 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
22e10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
22e20 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  te shared-memory
22e30 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
22e40 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20   unixShm *p;    
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
22e70 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
22e80 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
22e90 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
22ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
22eb0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
22ec0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
22ed0 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  nixShm **pp;    
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ef0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
22f00 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
22f10 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78  ctions */.  unix
22f20 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
22f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22f40 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
22f50 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
22f60 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46    pDbFd = (unixF
22f70 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
22f80 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
22f90 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
22fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
22fb0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
22fc0 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ode;..  assert( 
22fd0 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
22fe0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
22ff0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
23000 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
23010 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
23020 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
23030 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
23040 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
23050 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
23060 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
23070 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
23080 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
23090 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
230a0 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
230b0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
230c0 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
230d0 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
230e0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
230f0 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
23100 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
23110 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
23120 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
23130 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
23140 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
23150 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
23160 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
23170 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
23180 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
23190 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
231a0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
231b0 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75  file, too */.  u
231c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
231d0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
231e0 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
231f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
23200 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
23210 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
23220 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
23230 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e   && pShmNode->h>
23240 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28 70 53  =0 ) osUnlink(pS
23250 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
23260 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50  e);.    unixShmP
23270 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d  urge(pDbFd);.  }
23280 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
23290 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
232a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65  QLITE_OK;.}...#e
232b0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
232c0 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  xShmMap     0.# 
232d0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f  define unixShmLo
232e0 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
232f0 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20   unixShmBarrier 
23300 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
23310 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
23320 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
23330 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
23340 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
23350 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
23360 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
23370 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
23380 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
23390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
233a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
233b0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
233c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233d0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
233e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23420 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
23430 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
23440 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
23450 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
23460 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
23470 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
23480 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
23490 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
234a0 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
234b0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
234c0 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
234d0 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
234e0 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
234f0 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
23500 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
23510 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23520 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
23530 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
23540 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
23550 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
23560 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
23570 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
23580 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
23590 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
235a0 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
235b0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
235c0 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
235d0 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
235e0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
235f0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
23600 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
23610 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
23620 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
23630 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
23640 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
23650 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
23660 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
23670 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
23680 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
23690 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
236a0 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
236b0 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
236c0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
236d0 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
236e0 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
236f0 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
23700 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
23710 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
23720 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
23730 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
23740 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
23750 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
23760 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
23770 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
23780 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
23790 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
237a0 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
237b0 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
237c0 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
237d0 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
237e0 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
237f0 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
23800 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
23810 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
23820 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
23830 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
23840 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
23850 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
23860 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
23870 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
23880 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
23890 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
238a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
238b0 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
238c0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
238d0 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
238e0 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
238f0 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
23900 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
23910 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
23920 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
23930 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
23940 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
23950 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
23960 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
23970 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
23980 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
23990 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
239a0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
239b0 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
239c0 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
239d0 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
239e0 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20  OCK, CKLOCK)    
239f0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
23a00 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23a10 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a40 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20   \.   VERSION,  
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23ae0 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23b30 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23b50 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23b80 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ba0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
23bd0 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23bf0 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23c20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
23c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23c40 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
23c70 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
23c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
23c90 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cb0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
23cc0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
23cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23ce0 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
23d10 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
23d20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
23d30 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
23d40 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23d50 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
23d60 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
23d70 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
23d80 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23da0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
23db0 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
23dc0 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
23dd0 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
23e00 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
23e10 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
23e20 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e40 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
23e50 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
23e60 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
23e70 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e90 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c     \.   unixShmL
23ea0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23eb0 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
23ec0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61    \.   unixShmBa
23ef0 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
23f00 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
23f10 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f30 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d   \.   unixShmUnm
23f40 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
23f50 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
23f60 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23fd0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
23fe0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23ff0 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
24000 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
24010 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
24020 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
24030 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
24040 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
24070 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24100 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
24110 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
24120 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
24130 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
24140 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
24150 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
24160 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
24170 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
24180 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
24190 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
241a0 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
241b0 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
241c0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
241d0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
241e0 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
241f0 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
24200 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
24210 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
24220 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
24230 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
24240 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
24250 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
24260 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
24270 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
24280 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
24290 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20   name */.  2,   
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
242c0 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64  emory is enabled
242d0 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
242e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242f0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
24300 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
24330 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24350 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
24360 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
24370 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
24380 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
24390 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
243a0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
243b0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
243c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
243d0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
243e0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
243f0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
24400 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
24410 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
24420 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
24450 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
24460 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24480 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
24490 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244b0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
244c0 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
244d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
244e0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
244f0 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
24500 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20  servedLock   /* 
24510 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
24520 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
24530 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
24540 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
24550 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
24560 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
24570 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
24580 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
24590 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
245a0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
245b0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
245c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
245d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
245e0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
245f0 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
24600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
24610 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
24620 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
24630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
24640 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
24650 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
24660 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
24670 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
24680 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
24690 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68  rvedLock  /* xCh
246a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
246b0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
246c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
246d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
246e0 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45  !OS_VXWORKS.IOME
246f0 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
24700 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
24710 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
24720 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
24730 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
24740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
24750 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
24760 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
24770 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
24780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
24790 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
247a0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
247b0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
247c0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
247d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
247e0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
247f0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
24800 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
24810 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
24820 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
24830 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
24840 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
24850 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
24860 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
24870 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
24880 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
24890 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
248a0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
248b0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
248c0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
248d0 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
248e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
248f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24900 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
24910 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24930 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
24940 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
24950 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20   semClose,      
24960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
24970 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
24980 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20   semLock,       
24990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
249a0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
249b0 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  semUnlock,      
249c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
249d0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
249e0 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
249f0 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
24a00 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
24a10 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
24a20 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
24a30 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
24a40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
24a50 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
24a60 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
24a70 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
24a80 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
24a90 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
24aa0 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
24ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
24ac0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
24ad0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
24ae0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
24af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
24b00 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
24b10 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43  sabled */.  afpC
24b20 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
24b30 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
24b40 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
24b50 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
24b60 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
24b70 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
24b80 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
24b90 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
24ba0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
24bb0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
24bc0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
24bd0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
24be0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
24bf0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
24c00 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
24c10 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
24c20 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
24c30 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
24c40 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
24c50 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
24c60 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
24c70 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
24c80 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
24c90 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
24ca0 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
24cb0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
24cc0 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
24cd0 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
24ce0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
24cf0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
24d00 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
24d10 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
24d20 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
24d30 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
24d40 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
24d50 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
24d60 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
24d70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
24d80 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
24d90 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
24da0 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
24db0 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
24dc0 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
24dd0 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
24de0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
24df0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
24e00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
24e10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
24e20 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
24e30 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
24e40 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
24e50 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
24e60 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
24e70 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
24e80 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
24e90 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
24ea0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
24eb0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
24ec0 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
24ed0 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
24ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
24ef0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
24f00 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
24f10 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
24f20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
24f30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
24f40 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
24f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f60 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
24f70 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
24f80 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24fa0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
24fb0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24fd0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
24fe0 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25000 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
25010 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
25020 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
25030 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
25040 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
25050 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c  #endif../* nfs l
25060 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33  ockd on OSX 10.3
25070 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20  + doesn't clear 
25080 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e  write locks when
25090 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
250a0 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  set */.#if defin
250b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
250c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
250d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
250e0 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46  ETHODS(.  nfsIoF
250f0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
25100 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
25110 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
25120 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20    nfsIoMethods, 
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25140 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
25150 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
25160 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25180 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
25190 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
251a0 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
251b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
251c0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
251d0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
251f0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
25200 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20    nfsUnlock,    
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25220 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
25230 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
25240 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
25250 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
25260 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
25270 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
25280 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
25290 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
252a0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
252b0 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
252c0 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
252d0 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
252e0 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
252f0 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
25300 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
25310 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
25320 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
25330 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
25340 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
25350 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
25360 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
25370 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
25380 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c  s for MacOSX onl
25390 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
253a0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
253b0 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
253c0 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
253d0 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
253e0 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
253f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
25400 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
25410 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
25420 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20     /* open file 
25430 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64  object for the d
25440 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25450 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
25460 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67  t struct Mapping
25470 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
25480 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  r *zFilesystem; 
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
254a0 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  Filesystem type 
254b0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  name */.    cons
254c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
254d0 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20  hods *pMethods; 
254e0 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65    /* Appropriate
254f0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
25500 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20  */.  } aMap[] = 
25510 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20  {.    { "hfs",  
25520 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
25530 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22  s },.    { "ufs"
25540 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
25550 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61  hods },.    { "a
25560 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  fpfs",  &afpIoMe
25570 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
25580 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  smbfs",  &afpIoM
25590 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
255a0 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63  "webdav", &noloc
255b0 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  kIoMethods },.  
255c0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
255d0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
255e0 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
255f0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
25600 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
25610 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
25620 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
25630 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
25640 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
25650 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
25660 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
25670 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
25680 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
25690 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
256a0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
256b0 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28   }.  if( statfs(
256c0 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66  filePath, &fsInf
256d0 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) != -1 ){.    
256e0 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if( fsInfo.f_fla
256f0 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20  gs & MNT_RDONLY 
25700 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
25710 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
25720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
25730 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  i=0; aMap[i].zFi
25740 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a  lesystem; i++){.
25750 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
25760 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
25770 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46  name, aMap[i].zF
25780 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b  ilesystem)==0 ){
25790 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
257a0 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73  aMap[i].pMethods
257b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
257c0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c    }..  /* Defaul
257d0 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c  t case. Handles,
257e0 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c   amongst others,
257f0 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73   "nfs"..  ** Tes
25800 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  t byte-range loc
25810 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e  k using fcntl().
25820 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63   If the call suc
25830 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73  ceeds, .  ** ass
25840 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
25850 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
25860 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  s POSIX style lo
25870 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63  cks. .  */.  loc
25880 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
25890 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
258a0 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
258b0 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
258c0 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
258d0 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
258e0 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
258f0 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
25900 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
25910 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28  !=-1 ) {.    if(
25920 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
25930 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66  _fstypename, "nf
25940 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
25950 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74  return &nfsIoMet
25960 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65  hods;.    } else
25970 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
25980 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
25990 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
259a0 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c      return &dotl
259b0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
259c0 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
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 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
259f0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
25a00 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
25a10 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
25a20 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
25a30 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
25a40 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
25a50 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
25a60 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
25a70 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
25a80 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
25a90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
25aa0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
25ab0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
25ac0 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
25ad0 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
25ae0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
25af0 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
25b00 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
25b10 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
25b20 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
25b30 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
25b40 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
25b50 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
25b60 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
25b70 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f  is for VXWorks o
25b80 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
25b90 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
25ba0 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
25bb0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
25bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
25bd0 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
25be0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
25bf0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
25c00 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
25c10 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e       /* the open
25c20 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   file object */.
25c30 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
25c40 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
25c50 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
25c60 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
25c70 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
25c80 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
25c90 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
25ca0 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
25cb0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
25cc0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
25cd0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
25ce0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
25cf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
25d00 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75  if fcntl() is su
25d10 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20  pported and use 
25d20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
25d30 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  s..  ** Otherwis
25d40 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  e fall back to t
25d50 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
25d60 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a  re method..  */.
25d70 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
25d80 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
25d90 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
25da0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
25db0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
25dc0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
25dd0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
25de0 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
25df0 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
25e00 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
25e10 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
25e20 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
25e30 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73  e{.    return &s
25e40 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  emIoMethods;.  }
25e50 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
25e60 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
25e70 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
25e80 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
25e90 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
25ea0 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
25eb0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
25ec0 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
25ed0 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f  WORKS && SQLITE_
25ee0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
25ef0 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  TYLE */../*.** A
25f00 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20  n abstract type 
25f10 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  for a pointer to
25f20 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e   a IO method fin
25f30 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
25f40 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
25f50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
25f60 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
25f70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
25f80 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a  ixFile*);.../***
25f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
25fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25ff0 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
26000 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
26010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26020 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
26030 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
26040 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
26050 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
26060 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
26070 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
26080 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
26090 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
260a0 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
260b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
260c0 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
260d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
260e0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
260f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
26100 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
26110 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
26120 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26140 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
26150 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
26160 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
26170 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
26180 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
26190 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
261a0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
261b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
261c0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
261d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
261e0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
261f0 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  .  int ctrlFlags
26200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65             /* Ze
26210 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46  ro or more UNIXF
26220 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ILE_* values */.
26230 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  ){.  const sqlit
26240 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
26250 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
26260 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
26270 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
26280 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26290 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
262a0 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d  t( pNew->pInode=
262b0 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55  =NULL );..  /* U
262c0 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20  sually the path 
262d0 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64  zFilename should
262e0 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69   not be a relati
262f0 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ve pathname. The
26300 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  .  ** exception 
26310 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  is when opening 
26320 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68  the proxy "conch
26330 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73  " file in builds
26340 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75   that.  ** inclu
26350 64 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41  de the special A
26360 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  pple locking sty
26370 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  les..  */.#if de
26380 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
26390 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
263a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
263b0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
263c0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
263d0 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20  ame[0]=='/' .   
263e0 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61   || pVfs->pAppDa
263f0 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f  ta==(void*)&auto
26400 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a  lockIoFinder );.
26410 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
26420 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
26430 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
26440 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ' );.#endif..  /
26450 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63  * No locking occ
26460 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  urs in temporary
26470 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65   files */.  asse
26480 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
26490 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26   || (ctrlFlags &
264a0 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
264b0 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  )!=0 );..  OSTRA
264c0 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33  CE(("OPEN    %-3
264d0 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  d %s\n", h, zFil
264e0 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d  ename));.  pNew-
264f0 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e  >h = h;.  pNew->
26500 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
26510 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69  New->zPath = zFi
26520 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e  lename;.  pNew->
26530 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29  ctrlFlags = (u8)
26540 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 69 66 28  ctrlFlags;.  if(
26550 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
26560 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73  lean(((ctrlFlags
26570 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29   & UNIXFILE_URI)
26580 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30   ? zFilename : 0
26590 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
265b0 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
265c0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
265d0 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  ) ){.    pNew->c
265e0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
265f0 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
26600 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 56 66 73   if( memcmp(pVfs
26610 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
26620 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b 0a 20 20  cl",10)==0 ){.  
26630 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
26640 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58  s |= UNIXFILE_EX
26650 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  CL;.  }..#if OS_
26660 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e  VXWORKS.  pNew->
26670 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e  pId = vxworksFin
26680 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d  dFileId(zFilenam
26690 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  e);.  if( pNew->
266a0 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74  pId==0 ){.    ct
266b0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
266c0 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20  ILE_NOLOCK;.    
266d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
266e0 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
266f0 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26   if( ctrlFlags &
26700 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
26710 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
26720 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
26730 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
26740 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
26750 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
26760 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
26770 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
26780 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
26790 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
267a0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
267b0 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
267c0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
267d0 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
267e0 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
267f0 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
26800 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
26810 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
26820 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
26830 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
26840 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
26850 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
26860 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
26870 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
26880 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
26890 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
268a0 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
268b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
268c0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
268d0 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
268e0 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
268f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
26900 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
26910 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
26920 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
26930 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
26940 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20  .#endif.  ){.   
26950 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
26960 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
26970 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
26980 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
26990 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
269a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
269b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
269c0 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  cured in findIno
269d0 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
269e0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
269f0 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
26a00 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
26a10 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
26a20 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
26a30 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
26a40 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
26a50 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
26a60 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
26a70 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
26a80 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
26a90 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
26aa0 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
26ab0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
26ac0 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
26ad0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
26ae0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
26af0 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
26b00 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
26b10 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
26b20 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
26b30 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
26b40 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
26b50 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
26b60 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
26b70 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
26b80 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
26b90 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
26ba0 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
26bb0 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
26bc0 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
26bd0 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
26be0 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
26bf0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
26c00 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
26c10 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
26c20 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
26c30 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
26c40 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
26c50 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
26c60 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
26c70 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
26c80 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
26c90 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
26ca0 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
26cb0 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
26cc0 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
26cd0 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
26ce0 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
26cf0 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
26d00 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
26d10 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
26d20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26d30 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
26d40 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
26d50 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
26d60 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
26d70 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
26d80 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
26d90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
26da0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
26db0 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
26dc0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
26dd0 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
26de0 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
26df0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
26e00 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
26e10 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
26e20 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
26e30 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
26e40 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
26e50 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
26e60 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
26e70 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
26e80 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
26e90 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
26ea0 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
26eb0 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
26ec0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26ed0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
26ee0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
26ef0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
26f00 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
26f10 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
26f20 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
26f30 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
26f40 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
26f50 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
26f60 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
26f70 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
26f80 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
26f90 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
26fa0 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
26fb0 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
26fc0 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
26fd0 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
26fe0 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
26ff0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
27000 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
27010 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
27020 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
27030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27040 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
27050 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
27060 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
27070 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
27080 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
27090 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
270a0 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
270b0 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
270c0 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
270d0 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
270e0 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
270f0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
27100 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
27110 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
27120 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
27130 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
27140 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
27150 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
27160 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
27170 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
27180 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
27190 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
271a0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
271b0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
271c0 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
271d0 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
271e0 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
271f0 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
27200 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
27210 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69  lite3_malloc(nFi
27220 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
27230 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
27240 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
27250 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
27260 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
27270 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
27280 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
27290 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
272a0 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
272b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
272c0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
272d0 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
272e0 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
272f0 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
27300 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
27310 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
27320 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
27330 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
27340 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
27350 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
27360 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
27370 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
27380 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
27390 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
273a0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
273b0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
273c0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
273d0 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28  node);.    if( (
273e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
273f0 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  & (pNew->pInode-
27400 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
27410 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
27420 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e  Name = pNew->pIn
27430 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  ode->aSemName;. 
27440 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
27450 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27460 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
27470 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
27480 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
274a0 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
274b0 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
274c0 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
274d0 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
274e0 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
274f0 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
27500 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
27510 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
27520 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
27530 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
27540 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
27550 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
27560 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53  Inode->pSem == S
27570 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
27580 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27590 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
275a0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
275b0 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
275c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
275d0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
275e0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
275f0 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74  .  .  pNew->last
27600 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f  Errno = 0;.#if O
27610 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
27620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27630 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
27640 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
27650 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
27660 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
27670 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
27680 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65  ame);.    isDele
27690 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  te = 0;.  }.  if
276a0 28 20 69 73 44 65 6c 65 74 65 20 29 20 70 4e 65  ( isDelete ) pNe
276b0 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
276c0 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
276d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
276e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
276f0 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
27700 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
27710 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
27720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
27730 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
27740 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
27750 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
27760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27780 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
27790 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63  irectory in whic
277a0 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61  h to put tempora
277b0 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20  ry files..** If 
277c0 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70  no suitable temp
277d0 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63  orary file direc
277e0 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e  tory can be foun
277f0 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  d, return NULL..
27800 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
27810 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69  char *unixTempFi
27820 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73  leDir(void){.  s
27830 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
27840 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
27850 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
27860 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
27870 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
27880 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
27890 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c     0        /* L
278a0 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a  ist terminator *
278b0 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65  /.  };.  unsigne
278c0 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63  d int i;.  struc
278d0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
278e0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
278f0 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d   0;..  azDirs[0]
27900 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
27910 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 28  directory;.  if(
27920 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a   !azDirs[1] ) az
27930 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76  Dirs[1] = getenv
27940 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f  ("TMPDIR");.  fo
27950 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
27960 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
27970 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d  zDirs[0]); zDir=
27980 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20  azDirs[i++]){.  
27990 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
279a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
279b0 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26  ( osStat(zDir, &
279c0 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
279d0 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
279e0 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
279f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
27a00 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72  f( osAccess(zDir
27a10 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65  , 07) ) continue
27a20 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
27a30 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a  .  return zDir;.
27a40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
27a50 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
27a60 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
27a70 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c  zBuf must be all
27a80 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
27a90 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73   calling process
27aa0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67   and must be big
27ab0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
27ac0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73  at least.** pVfs
27ad0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  ->mxPathname byt
27ae0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
27af0 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  t unixGetTempnam
27b00 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
27b10 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
27b20 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
27b30 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
27b40 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
27b50 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
27b60 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
27b70 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
27b80 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
27b90 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  89";.  unsigned 
27ba0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73  int i, j;.  cons
27bb0 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20  t char *zDir;.. 
27bc0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
27bd0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
27be0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
27bf0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
27c00 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
27c10 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
27c20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
27c30 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
27c40 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
27c50 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
27c60 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
27c70 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
27c80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
27c90 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78  ;..  zDir = unix
27ca0 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20  TempFileDir();. 
27cb0 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a   if( zDir==0 ) z
27cc0 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a  Dir = ".";..  /*
27cd0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
27ce0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
27cf0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
27d00 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
27d10 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
27d20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
27d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27d40 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  OR..  */.  if( (
27d50 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73  strlen(zDir) + s
27d60 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d  trlen(SQLITE_TEM
27d70 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b  P_FILE_PREFIX) +
27d80 20 31 38 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29   18) >= (size_t)
27d90 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nBuf ){.    retu
27da0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
27db0 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
27dc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
27dd0 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20  (nBuf-18, zBuf, 
27de0 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
27df0 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44  _FILE_PREFIX, zD
27e00 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e  ir);.    j = (in
27e10 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  t)strlen(zBuf);.
27e20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
27e30 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
27e40 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
27e50 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
27e60 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
27e70 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
27e80 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
27e90 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
27ea0 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
27eb0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
27ec0 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 42 75 66  j] = 0;.    zBuf
27ed0 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  [j+1] = 0;.  }wh
27ee0 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42  ile( osAccess(zB
27ef0 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
27f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27f10 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
27f20 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
27f30 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
27f40 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52  APPLE__)./*.** R
27f50 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66  outine to transf
27f60 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69  orm a unixFile i
27f70 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b  nto a proxy-lock
27f80 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a  ing unixFile..**
27f90 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
27fa0 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63  in the proxy-loc
27fb0 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20  k division, but 
27fc0 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  used by unixOpen
27fd0 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ().** if SQLITE_
27fe0 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
27ff0 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e  KING is defined.
28000 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
28010 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
28020 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c  xFile(unixFile*,
28030 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23   const char*);.#
28040 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  endif../*.** Sea
28050 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
28060 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
28070 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65  r that was opene
28080 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
28090 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20  e .** file (not 
280a0 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73  a journal or mas
280b0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
280c0 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  ) identified by 
280d0 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74  pathname.** zPat
280e0 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50  h with SQLITE_OP
280f0 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74  EN_XXX flags mat
28100 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73  ching those pass
28110 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
28120 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
28130 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
28140 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65  *.** Such a file
28150 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20   descriptor may 
28160 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62  exist if a datab
28170 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ase connection w
28180 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74  as closed.** but
28190 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
281a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
281b0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f  could not be clo
281c0 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65  sed because some
281d0 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64  .** other file d
281e0 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
281f0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  n the same file 
28200 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c  is holding a fil
28210 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72  e-lock..** Refer
28220 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   to comments in 
28230 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20  the unixClose() 
28240 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  function and the
28250 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74   lengthy comment
28260 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22  .** describing "
28270 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
28280 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73  ocking" at the s
28290 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c  tart of this fil
282a0 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65  e for .** furthe
282b0 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c  r details. Also,
282c0 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a   ticket #4018..*
282d0 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62  *.** If a suitab
282e0 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
282f0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
28300 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  n it is returned
28310 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20  . If no.** such 
28320 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
28330 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69  is located, -1 i
28340 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
28350 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64  tatic UnixUnused
28360 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65  Fd *findReusable
28370 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Fd(const char *z
28380 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29  Path, int flags)
28390 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  {.  UnixUnusedFd
283a0 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a   *pUnused = 0;..
283b0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72    /* Do not sear
283c0 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
283d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
283e0 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74   on vxworks. Not
283f0 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78   because.  ** vx
28400 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20  works would not 
28410 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65  benefit from the
28420 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68   change (it migh
28430 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72  t, we're not sur
28440 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63  e),.  ** but bec
28450 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74  ause no way to t
28460 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e  est it is curren
28470 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49  tly available. I
28480 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a  t is better .  *
28490 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72  * not to risk br
284a0 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73  eaking vxworks s
284b0 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73  upport for the s
284c0 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f  ake of such an o
284d0 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61  bscure .  ** fea
284e0 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f  ture.  */.#if !O
284f0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
28500 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73   /* Results of s
28530 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20  tat() call */.. 
28540 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c   /* A stat() cal
28550 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76  l may fail for v
28560 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20  arious reasons. 
28570 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
28580 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f   it is.  ** almo
28590 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  st certain that 
285a0 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f  an open() call o
285b0 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20  n the same path 
285c0 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a  will also fail..
285d0 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65    ** For this re
285e0 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f  ason, if an erro
285f0 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
28600 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65  stat() call here
28610 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e  , it is.  ** ign
28620 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72  ored and -1 is r
28630 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
28640 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20  ler will try to 
28650 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a  open a new file.
28660 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
28670 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
28680 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75  , fail, and retu
28690 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
286a0 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  QLite..  **.  **
286b0 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65   Even if a subse
286c0 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c  quent open() cal
286d0 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20  l does succeed, 
286e0 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73  the consequences
286f0 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61   of.  ** not sea
28700 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73  rching for a res
28710 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  usable file desc
28720 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64  riptor are not d
28730 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30  ire.  */.  if( 0
28740 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
28750 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75  &sStat) ){.    u
28760 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
28770 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45  node;..    unixE
28780 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
28790 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
287a0 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ist;.    while( 
287b0 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64  pInode && (pInod
287c0 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73  e->fileId.dev!=s
287d0 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20  Stat.st_dev.    
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65   || pInode->file
28800 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74  Id.ino!=sStat.st
28810 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  _ino) ){.       
28820 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
28830 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
28840 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a    if( pInode ){.
28850 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
28860 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  Fd **pp;.      f
28870 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70  or(pp=&pInode->p
28880 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28  Unused; *pp && (
28890 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61  *pp)->flags!=fla
288a0 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  gs; pp=&((*pp)->
288b0 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70  pNext));.      p
288c0 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20  Unused = *pp;.  
288d0 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
288e0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  ){.        *pp =
288f0 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
28900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28910 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
28920 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  x();.  }.#endif 
28930 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57     /* if !OS_VXW
28940 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ORKS */.  return
28950 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a   pUnused;.}../*.
28960 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
28970 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e   is called by un
28980 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65  ixOpen() to dete
28990 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70  rmine the unix p
289a0 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f  ermissions.** to
289b0 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65   create new file
289c0 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72  s with. If no er
289d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
289e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
289f0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20  turned.** and a 
28a00 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66  value suitable f
28a10 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68  or passing as th
28a20 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
28a30 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a   to open(2) is.*
28a40 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d  * written to *pM
28a50 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ode. If an IO er
28a60 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
28a70 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
28a80 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
28a90 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
28aa0 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20  f *pMode is not 
28ab0 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
28ac0 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 63 61  In most cases ca
28ad0 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ses, this routin
28ae0 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  e sets *pMode to
28af0 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62   0, which will b
28b00 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69  ecome.** an indi
28b10 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74  cation to robust
28b20 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74  _open() to creat
28b30 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67  e the file using
28b40 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  .** SQLITE_DEFAU
28b50 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
28b60 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79 20  ONS adjusted by 
28b70 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75  the umask..** Bu
28b80 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62 65  t if the file be
28b90 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20  ing opened is a 
28ba0 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a  WAL or regular j
28bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
28bc0 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  n .** this funct
28bd0 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65 20  ion queries the 
28be0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
28bf0 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
28c00 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65  on the .** corre
28c10 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73  sponding databas
28c20 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20  e file and sets 
28c30 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76  *pMode to this v
28c40 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a  alue. Whenever .
28c50 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c  ** possible, WAL
28c60 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
28c70 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 75  es are created u
28c80 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65  sing the same pe
28c90 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73  rmissions .** as
28ca0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
28cb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
28cc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49  *.** If the SQLI
28cd0 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
28ce0 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  MES option is en
28cf0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
28d00 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  ** original file
28d10 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61  name is unavaila
28d20 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41  ble.  But 8_3_NA
28d30 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  MES is only used
28d40 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65   for.** FAT file
28d50 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d  systems and perm
28d60 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d  issions do not m
28d70 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20  atter there, so 
28d80 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20  just use.** the 
28d90 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  default permissi
28da0 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
28db0 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c  nt findCreateFil
28dc0 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
28dd0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
28de0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
28df0 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62   of file (possib
28e00 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65  ly) being create
28e10 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  d */.  int flags
28e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e30 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
28e40 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72  passed as 4th ar
28e50 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28  gument to xOpen(
28e60 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70  ) */.  mode_t *p
28e70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
28e80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
28e90 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70  ermissions to op
28ea0 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  en file with */.
28eb0 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20    uid_t *pUid,  
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f    /* OUT: uid to
28ee0 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
28ef0 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69   */.  gid_t *pGi
28f00 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
28f10 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69        /* OUT: gi
28f20 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
28f30 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
28f40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f60 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
28f70 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a   *pMode = 0;.  *
28f80 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69  pUid = 0;.  *pGi
28f90 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61  d = 0;.  if( fla
28fa0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
28fb0 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
28fc0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
28fd0 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
28fe0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
28ff0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
29000 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
29010 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
29040 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
29050 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
29060 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
29070 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
29080 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
29090 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
290a0 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
290b0 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
290c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
290d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
290e0 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
290f0 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
29100 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
29110 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
29120 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
29130 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
29140 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
29150 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
29160 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
29170 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
29180 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
29190 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
291a0 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
291b0 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
291c0 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
291d0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
291e0 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
291f0 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
29200 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
29210 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
29220 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
29230 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
29240 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
29250 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
29260 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
29270 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
29280 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53 51   - 1; .#ifdef SQ
29290 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
292a0 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65 28  NAMES.    while(
292b0 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74 65   nDb>0 && sqlite
292c0 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e  3Isalnum(zPath[n
292d0 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20  Db]) ) nDb--;.  
292e0 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20    if( nDb==0 || 
292f0 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
29300 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29310 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77 68  OK;.#else.    wh
29320 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ile( zPath[nDb]!
29330 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61 73  ='-' ){.      as
29340 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20  sert( nDb>0 );. 
29350 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50 61       assert( zPa
29360 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b  th[nDb]!='\n' );
29370 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
29380 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d    }.#endif.    m
29390 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68  emcpy(zDb, zPath
293a0 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b  , nDb);.    zDb[
293b0 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  nDb] = '\0';..  
293c0 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
293d0 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  zDb, &sStat) ){.
293e0 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73        *pMode = s
293f0 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
29400 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69 64  777;.      *pUid
29410 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b   = sStat.st_uid;
29420 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20 73  .      *pGid = s
29430 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20  Stat.st_gid;.   
29440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
29450 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
29460 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
29470 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
29480 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
29490 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
294a0 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
294b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
294c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
294d0 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
294e0 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
294f0 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
29500 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
29510 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
29520 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
29530 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
29540 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
29550 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
29560 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
29570 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
29580 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
29590 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
295a0 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
295b0 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
295c0 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
295d0 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
295e0 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
295f0 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
29600 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
29610 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
29620 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
29630 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
29640 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
29650 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
29660 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
29670 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
29680 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
29690 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
296a0 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
296b0 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
296c0 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
296d0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
296e0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
296f0 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
29700 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
29710 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
29720 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
29730 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
29740 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
29750 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
29760 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
29770 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
29780 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
29790 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
297a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
297b0 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
297c0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
297d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
297e0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
297f0 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
29800 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
29810 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
29820 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
29830 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
29840 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
29850 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
29860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29870 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
29880 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
29890 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
298c0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
298d0 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
298e0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
298f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
29900 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
29910 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
29920 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
29930 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
29940 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
29950 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
29960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29970 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
29980 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
29990 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
299a0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
299b0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
299c0 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
299d0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
299e0 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
299f0 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
29a00 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
29a10 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
29a40 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
29a50 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
29a60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
29a70 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
29a80 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
29a90 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
29aa0 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
29ab0 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f      /* UNIXFILE_
29ac0 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e  * flags */..  in
29ad0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
29ae0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
29af0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
29b00 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
29b10 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
29b20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
29b30 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
29b40 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
29b50 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
29b60 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
29b70 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
29b80 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
29b90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
29ba0 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
29bb0 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
29bc0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
29bd0 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
29be0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29bf0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
29c00 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
29c10 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
29c20 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
29c30 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
29c40 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
29c50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29c60 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
29c70 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
29c80 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
29c90 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
29ca0 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
29cb0 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
29cc0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
29cd0 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
29ce0 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
29cf0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
29d00 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
29d10 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
29d20 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
29d30 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
29d40 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
29d50 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
29d60 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
29d70 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69  int syncDir = (i
29d80 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
29d90 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
29da0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
29db0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
29dc0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29dd0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
29de0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
29df0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
29e00 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
29e10 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
29e20 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
29e30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29e40 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
29e50 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
29e60 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
29e70 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
29e80 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
29e90 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
29ea0 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
29eb0 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e  THNAME+2];.  con
29ec0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
29ed0 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
29ee0 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
29ef0 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
29f00 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
29f10 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
29f20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
29f30 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
29f40 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
29f50 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
29f60 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
29f70 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
29f80 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
29f90 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
29fa0 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
29fb0 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
29fc0 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
29fd0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
29fe0 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
29ff0 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
2a000 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
2a010 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
2a020 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
2a030 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
2a040 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
2a050 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
2a060 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
2a070 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
2a080 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
2a090 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
2a0a0 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
2a0b0 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
2a0c0 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
2a0d0 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
2a0e0 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
2a0f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
2a100 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
2a110 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
2a120 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
2a130 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
2a140 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
2a150 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
2a160 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
2a170 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2a180 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2a190 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2a1a0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
2a1b0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2a1c0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2a1d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2a1e0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
2a1f0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2a200 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2a210 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2a220 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2a230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2a240 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2a250 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2a260 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
2a270 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
2a280 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
2a290 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
2a2a0 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
2a2b0 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
2a2c0 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
2a2d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
2a2e0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2a2f0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
2a300 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
2a310 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2a320 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
2a330 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2a340 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
2a350 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
2a360 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
2a370 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
2a380 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2a390 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2a3a0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
2a3b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
2a3c0 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
2a3d0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2a3e0 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d  _WAL.  );..  mem
2a3f0 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
2a400 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20  (unixFile));..  
2a410 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
2a420 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
2a430 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64  {.    UnixUnused
2a440 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20  Fd *pUnused;.   
2a450 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
2a460 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c  eusableFd(zName,
2a470 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
2a480 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2a490 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
2a4a0 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  fd;.    }else{. 
2a4b0 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73       pUnused = s
2a4c0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
2a4d0 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
2a4e0 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75  .      if( !pUnu
2a4f0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sed ){.        r
2a500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a510 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
2a520 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  }.    p->pUnused
2a530 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20   = pUnused;..   
2a540 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
2a550 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c  enames are doubl
2a560 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65  e-zero terminate
2a570 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f  d if they are no
2a580 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69  t.    ** URIs wi
2a590 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20  th parameters.  
2a5a0 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20  Hence, they can 
2a5b0 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64  always be passed
2a5c0 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c   into.    ** sql
2a5d0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
2a5e0 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73  er(). */.    ass
2a5f0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 53 51  ert( (flags & SQ
2a600 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
2a610 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a  | zName[strlen(z
2a620 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a  Name)+1]==0 );..
2a630 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61    }else if( !zNa
2a640 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  me ){.    /* If 
2a650 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74  zName is NULL, t
2a660 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69  he upper layer i
2a670 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74  s requesting a t
2a680 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  emp file. */.   
2a690 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
2a6a0 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20   && !syncDir);. 
2a6b0 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54     rc = unixGetT
2a6c0 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
2a6d0 4e 41 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65  NAME+2, zTmpname
2a6e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2a6f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2a710 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
2a720 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  Tmpname;..    /*
2a730 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f   Generated tempo
2a740 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61  rary filenames a
2a750 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65  re always double
2a760 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
2a770 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20  .    ** for use 
2a780 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  by sqlite3_uri_p
2a790 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
2a7a0 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
2a7b0 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31  [strlen(zName)+1
2a7c0 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ]==0 );.  }..  /
2a7d0 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
2a7e0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61  value of the fla
2a7f0 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  gs parameter pas
2a800 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e  sed to POSIX fun
2a810 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28  ction.  ** open(
2a820 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65  ). These must be
2a830 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e   calculated even
2a840 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f   if open() is no
2a850 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a  t called, as.  *
2a860 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74  * they may be st
2a870 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
2a880 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
2a890 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20  and used by the 
2a8a0 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c  .  ** 'conch fil
2a8b0 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74  e' locking funct
2a8c0 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20  ions later on.  
2a8d0 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  */.  if( isReado
2a8e0 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73  nly )  openFlags
2a8f0 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
2a900 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
2a910 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f  ) openFlags |= O
2a920 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43  _RDWR;.  if( isC
2a930 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46  reate )    openF
2a940 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b  lags |= O_CREAT;
2a950 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
2a960 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  ve ) openFlags |
2a970 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  = (O_EXCL|O_NOFO
2a980 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61  LLOW);.  openFla
2a990 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49  gs |= (O_LARGEFI
2a9a0 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20  LE|O_BINARY);.. 
2a9b0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2a9c0 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65   mode_t openMode
2a9d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2a9e0 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  * Permissions to
2a9f0 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74   create file wit
2aa00 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75  h */.    uid_t u
2aa10 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2aa20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64         /* Userid
2aa30 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
2aa40 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20  .    gid_t gid; 
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa60 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f     /* Groupid fo
2aa70 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  r the file */.  
2aa80 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74    rc = findCreat
2aa90 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c  eFileMode(zName,
2aaa0 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64   flags, &openMod
2aab0 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a  e, &uid, &gid);.
2aac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2aad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2aae0 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73  ssert( !p->pUnus
2aaf0 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ed );.      asse
2ab00 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
2ab10 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54  E_OPEN_WAL || eT
2ab20 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2ab30 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
2ab40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2ab50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d  ;.    }.    fd =
2ab60 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
2ab70 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
2ab80 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53  penMode);.    OS
2ab90 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20  TRACE(("OPENX   
2aba0 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20  %-3d %s 0%o\n", 
2abb0 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  fd, zName, openF
2abc0 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20  lags));.    if( 
2abd0 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45  fd<0 && errno!=E
2abe0 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57  ISDIR && isReadW
2abf0 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75  rite && !isExclu
2ac00 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  sive ){.      /*
2ac10 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20   Failed to open 
2ac20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61  the file for rea
2ac30 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
2ac40 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a  Try read-only. *
2ac50 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d  /.      flags &=
2ac60 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
2ac70 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2ac80 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
2ac90 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d      openFlags &=
2aca0 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41   ~(O_RDWR|O_CREA
2acb0 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  T);.      flags 
2acc0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
2acd0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f  EADONLY;.      o
2ace0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
2acf0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65  ONLY;.      isRe
2ad00 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adonly = 1;.    
2ad10 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
2ad20 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
2ad30 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
2ad40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
2ad50 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
2ad60 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2ad70 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2ad80 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d  PT, "open", zNam
2ad90 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  e);.      goto o
2ada0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
2adb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2adc0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72  his process is r
2add0 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 61  unning as root a
2ade0 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67 20 61  nd if creating a
2adf0 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   new rollback.  
2ae00 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20    ** journal or 
2ae10 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74 68  WAL file, set th
2ae20 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
2ae30 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41  he journal or WA
2ae40 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74  L to be.    ** t
2ae50 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f  he same as the o
2ae60 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
2ae70 2e 20 20 49 66 20 77 65 20 61 72 65 20 6e 6f 74  .  If we are not
2ae80 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
2ae90 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
2aea0 65 20 66 63 68 6f 77 6e 28 29 20 63 61 6c 6c 20  e fchown() call 
2aeb0 77 69 6c 6c 20 66 61 69 6c 2c 20 62 75 74 20 74  will fail, but t
2aec0 68 61 74 27 73 20 6f 6b 2e 20 20 54 68 65 20 22  hat's ok.  The "
2aed0 69 66 28 29 7b 7d 22 20 61 6e 64 0a 20 20 20 20  if(){}" and.    
2aee0 2a 2a 20 74 68 65 20 73 65 74 74 69 6e 67 20 6f  ** the setting o
2aef0 66 20 74 68 65 20 55 4e 49 58 46 49 4c 45 5f 43  f the UNIXFILE_C
2af00 48 4f 57 4e 20 66 6c 61 67 20 61 72 65 20 70 75  HOWN flag are pu
2af10 72 65 6c 79 20 74 6f 20 73 69 6c 65 6e 63 65 20  rely to silence 
2af20 63 6f 6d 70 69 6c 65 72 0a 20 20 20 20 2a 2a 20  compiler.    ** 
2af30 77 61 72 6e 69 6e 67 73 20 66 72 6f 6d 20 67 63  warnings from gc
2af40 63 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  c..    */.    if
2af50 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
2af60 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
2af70 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2af80 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  NAL) ){.      if
2af90 28 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c 20 75  ( osFchown(fd, u
2afa0 69 64 2c 20 67 69 64 29 3d 3d 30 20 29 7b 20 70  id, gid)==0 ){ p
2afb0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2afc0 4e 49 58 46 49 4c 45 5f 43 48 4f 57 4e 3b 20 7d  NIXFILE_CHOWN; }
2afd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2afe0 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20  ert( fd>=0 );.  
2aff0 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
2b000 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20  .    *pOutFlags 
2b010 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
2b020 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29  if( p->pUnused )
2b030 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  {.    p->pUnused
2b040 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70  ->fd = fd;.    p
2b050 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73  ->pUnused->flags
2b060 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
2b070 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
2b080 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2b090 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d      zPath = zNam
2b0a0 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55  e;.#else.    osU
2b0b0 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65  nlink(zName);.#e
2b0c0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c  ndif.  }.#if SQL
2b0d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b0e0 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b  NG_STYLE.  else{
2b0f0 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  .    p->openFlag
2b100 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
2b110 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
2b120 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 6f  f FD_CLOEXEC.  o
2b130 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54  sFcntl(fd, F_SET
2b140 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  FD, osFcntl(fd, 
2b150 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
2b160 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
2b170 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54  f..  noLock = eT
2b180 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2b190 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69  _MAIN_DB;..  .#i
2b1a0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2b1b0 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
2b1c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2b1d0 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74 66  YLE.  if( fstatf
2b1e0 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
2b1f0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e  = -1 ){.    ((un
2b200 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2b210 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
2b220 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  o;.    robust_cl
2b230 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
2b240 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E__);.    return
2b250 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2b260 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  CESS;.  }.  if (
2b270 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73  0 == strncmp("ms
2b280 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  dos", fsInfo.f_f
2b290 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
2b2a0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2b2b0 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
2b2c0 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
2b2d0 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
2b2e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
2b2f0 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65  t up appropriate
2b300 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20   ctrlFlags */.  
2b310 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20 20  if( isDelete )  
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
2b330 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2b340 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66  ILE_DELETE;.  if
2b350 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
2b360 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
2b370 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2b380 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  E_RDONLY;.  if( 
2b390 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20  noLock )        
2b3a0 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
2b3b0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2b3c0 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79  NOLOCK;.  if( sy
2b3d0 6e 63 44 69 72 20 29 20 20 20 20 20 20 20 20 20  ncDir )         
2b3e0 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
2b3f0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49  s |= UNIXFILE_DI
2b400 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61  RSYNC;.  if( fla
2b410 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2b420 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73  _URI ) ctrlFlags
2b430 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49   |= UNIXFILE_URI
2b440 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ;..#if SQLITE_EN
2b450 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b460 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52  LE.#if SQLITE_PR
2b470 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
2b480 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79  NG.  isAutoProxy
2b490 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 1;.#endif.  i
2b4a0 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26  f( isAutoProxy &
2b4b0 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20  & (zPath!=NULL) 
2b4c0 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20  && (!noLock) && 
2b4d0 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20  pVfs->xOpen ){. 
2b4e0 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63     char *envforc
2b4f0 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
2b500 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2b510 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e  OCKING");.    in
2b520 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a  t useProxy = 0;.
2b530 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
2b540 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
2b550 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63  NG==1 means forc
2b560 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f  e always use pro
2b570 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20  xy, 0 means .   
2b580 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72   ** never use pr
2b590 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  oxy, NULL means 
2b5a0 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f  use proxy for no
2b5b0 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e  n-local files on
2b5c0 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ly.  */.    if( 
2b5d0 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29  envforce!=NULL )
2b5e0 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  {.      useProxy
2b5f0 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65   = atoi(envforce
2b600 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )>0;.    }else{.
2b610 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66 73        if( statfs
2b620 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  (zPath, &fsInfo)
2b630 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
2b640 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
2b650 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61  the close(fd) ca
2b660 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61  ll is sub-optima
2b670 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  l. If the file o
2b680 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  pened.        **
2b690 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64 61   with fd is a da
2b6a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
2b6b0 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
2b6c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65   connections ope
2b6d0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
2b6e0 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
2b6f0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c  re currently hol
2b700 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f  ding advisory lo
2b710 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20  cks on it,.     
2b720 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63     ** then the c
2b730 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77  all to close() w
2b740 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65  ill cancel those
2b750 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74   locks. In pract
2b760 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ice,.        ** 
2b770 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74  we're assuming t
2b780 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f 65  hat statfs() doe
2b790 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f  sn't fail very o
2b7a0 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20  ften. At least. 
2b7b0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68         ** not wh
2b7c0 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64  ile other file d
2b7d0 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
2b7e0 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  d by the same pr
2b7f0 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20  ocess on.       
2b800 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c   ** the same fil
2b810 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20  e are working.  
2b820 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61  */.        p->la
2b830 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
2b840 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
2b850 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
2b860 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20  INE__);.        
2b870 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2b880 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20  R_ACCESS;.      
2b890 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
2b8a0 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  shed;.      }.  
2b8b0 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21      useProxy = !
2b8c0 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26  (fsInfo.f_flags&
2b8d0 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20  MNT_LOCAL);.    
2b8e0 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f  }.    if( usePro
2b8f0 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  xy ){.      rc =
2b900 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
2b910 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c  pVfs, fd, pFile,
2b920 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67   zPath, ctrlFlag
2b930 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
2b940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b950 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
2b960 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2b970 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46  le((unixFile*)pF
2b980 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  ile, ":auto:");.
2b990 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2b9a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b9b0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e         /* Use un
2b9c0 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e  ixClose to clean
2b9d0 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65   up the resource
2b9e0 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49  s added in fillI
2b9f0 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20  nUnixFile .     
2ba00 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61       ** and clea
2ba10 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74  r all the struct
2ba20 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73  ure's references
2ba30 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
2ba40 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2ba50 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77  File->pMethods w
2ba60 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73  ill be NULL so s
2ba70 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69  qlite3OsClose wi
2ba80 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20  ll be a no-op . 
2ba90 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2baa0 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28        unixClose(
2bab0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
2bac0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2bae0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2baf0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
2bb00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
2bb10 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2bb20 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
2bb30 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
2bb40 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e  lags);..open_fin
2bb50 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ished:.  if( rc!
2bb60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bb70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2bb80 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a  ->pUnused);.  }.
2bb90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2bba0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2bbb0 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e  e file at zPath.
2bbc0 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
2bbd0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
2bbe0 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65  , fsync().** the
2bbf0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
2bc00 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
2bc10 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2bc20 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20  t unixDelete(.  
2bc30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2bc40 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53  Used,     /* VFS
2bc50 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
2bc60 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20   as the xDelete 
2bc70 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2bc80 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2bc90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2bca0 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
2bcb0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ted */.  int dir
2bcc0 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
2bcd0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66     /* If true, f
2bce0 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79  sync() directory
2bcf0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
2bd00 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2bd10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bd20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2bd30 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2bd40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2bd50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2bd60 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69  ERR_DELETE);.  i
2bd70 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74  f( osUnlink(zPat
2bd80 68 29 3d 3d 28 2d 31 29 20 26 26 20 65 72 72 6e  h)==(-1) && errn
2bd90 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  o!=ENOENT ){.   
2bda0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
2bdb0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
2bdc0 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
2bdd0 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  k", zPath);.  }.
2bde0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
2bdf0 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
2be00 20 69 66 28 20 28 64 69 72 53 79 6e 63 20 26 20   if( (dirSync & 
2be10 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  1)!=0 ){.    int
2be20 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73   fd;.    rc = os
2be30 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  OpenDirectory(zP
2be40 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69  ath, &fd);.    i
2be50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2be60 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
2be70 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  KS.      if( fsy
2be80 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c  nc(fd)==-1 ).#el
2be90 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  se.      if( fsy
2bea0 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a  nc(fd) ).#endif.
2beb0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2bec0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
2bed0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
2bee0 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
2bef0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
2bf00 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f   }.      robust_
2bf10 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
2bf20 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
2bf30 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2bf40 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2bf50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2bf60 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  K;.    }.  }.#en
2bf70 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
2bf80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
2bf90 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
2bfa0 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
2bfb0 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
2bfc0 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
2bfd0 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
2bfe0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
2bff0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2c000 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2c010 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
2c020 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
2c030 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
2c040 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
2c050 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
2c060 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
2c070 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
2c080 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2c090 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
2c0a0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2c0b0 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
2c0c0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2c0d0 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
2c0e0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
2c0f0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
2c100 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
2c110 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
2c120 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
2c130 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
2c140 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2c150 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
2c160 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
2c170 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
2c180 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2c190 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
2c1a0 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
2c1b0 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
2c1c0 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
2c1d0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
2c1e0 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
2c1f0 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
2c200 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65  /.){.  int amode
2c210 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
2c220 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2c230 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
2c240 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2c250 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
2c260 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ; );.  switch( f
2c270 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
2c280 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2c290 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f  XISTS:.      amo
2c2a0 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20  de = F_OK;.     
2c2b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2c2c0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2c2d0 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
2c2e0 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f  amode = W_OK|R_O
2c2f0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
2c300 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2c310 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
2c320 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b     amode = R_OK;
2c330 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2c340 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2c350 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
2c360 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
2c370 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
2c380 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28  Out = (osAccess(
2c390 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
2c3a0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  );.  if( flags==
2c3b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2c3c0 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74  ISTS && *pResOut
2c3d0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
2c3e0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28  tat buf;.    if(
2c3f0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2c400 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73  , &buf) && buf.s
2c410 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  t_size==0 ){.   
2c420 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b     *pResOut = 0;
2c430 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2c440 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c450 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
2c460 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2c470 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
2c480 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
2c490 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
2c4a0 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
2c4b0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
2c4c0 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
2c4d0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
2c4e0 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
2c4f0 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
2c500 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
2c510 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
2c520 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
2c530 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
2c540 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
2c550 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
2c560 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
2c570 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
2c580 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
2c590 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2c5a0 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
2c5b0 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
2c5c0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2c5d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2c5e0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
2c5f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c600 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2c610 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
2c620 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
2c630 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
2c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c650 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
2c660 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
2c670 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
2c680 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
2c690 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2c6a0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
2c6b0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
2c6c0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
2c6d0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
2c6e0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
2c6f0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
2c700 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
2c710 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
2c720 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
2c730 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
2c740 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
2c750 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
2c760 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
2c770 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
2c780 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
2c790 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
2c7a0 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
2c7b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
2c7c0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2c7d0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2c7e0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
2c7f0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
2c800 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
2c810 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2c820 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75  ER(pVfs);..  zOu
2c830 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27  t[nOut-1] = '\0'
2c840 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
2c850 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
2c860 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
2c870 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20  ut, zOut, "%s", 
2c880 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
2c890 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20  .    int nCwd;. 
2c8a0 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28     if( osGetcwd(
2c8b0 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30  zOut, nOut-1)==0
2c8c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2c8d0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2c8e0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2c8f0 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50  PT, "getcwd", zP
2c900 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
2c910 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c  nCwd = (int)strl
2c920 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  en(zOut);.    sq
2c930 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2c940 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b  Out-nCwd, &zOut[
2c950 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50  nCwd], "/%s", zP
2c960 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ath);.  }.  retu
2c970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2c980 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c990 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2c9a0 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
2c9b0 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
2c9c0 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
2c9d0 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
2c9e0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
2c9f0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
2ca00 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
2ca10 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
2ca20 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
2ca30 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
2ca40 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
2ca50 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
2ca60 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
2ca70 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2ca80 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2ca90 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2caa0 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
2cab0 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
2cac0 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
2cad0 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
2cae0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
2caf0 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
2cb00 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
2cb10 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
2cb20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
2cb30 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
2cb40 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
2cb50 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
2cb60 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
2cb70 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
2cb80 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
2cb90 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
2cba0 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
2cbb0 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
2cbc0 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
2cbd0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
2cbe0 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
2cbf0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
2cc00 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
2cc10 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
2cc20 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2cc30 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2cc40 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2cc50 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Out){.  const ch
2cc60 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53  ar *zErr;.  UNUS
2cc70 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2cc80 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74  Used);.  unixEnt
2cc90 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72  erMutex();.  zEr
2cca0 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20  r = dlerror();. 
2ccb0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
2ccc0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2ccd0 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c  f(nBuf, zBufOut,
2cce0 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20   "%s", zErr);.  
2ccf0 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
2cd00 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ex();.}.static v
2cd10 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28  oid (*unixDlSym(
2cd20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2cd30 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63  Used, void *p, c
2cd40 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29  onst char*zSym))
2cd50 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20  (void){.  /* .  
2cd60 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64  ** GCC with -ped
2cd70 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79  antic-errors say
2cd80 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20  s that C90 does 
2cd90 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64  not allow a void
2cda0 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73  * to be.  ** cas
2cdb0 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  t into a pointer
2cdc0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
2cdd0 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62   And yet the lib
2cde0 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75  rary dlsym() rou
2cdf0 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e  tine.  ** return
2ce00 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20  s a void* which 
2ce10 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
2ce20 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2ce30 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65  n.  So how do we
2ce40 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28  .  ** use dlsym(
2ce50 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  ) with -pedantic
2ce60 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20  -errors?.  **.  
2ce70 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65  ** Variable x be
2ce80 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74  low is defined t
2ce90 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  o be a pointer t
2cea0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  o a function tak
2ceb0 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74  ing.  ** paramet
2cec0 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f  ers void* and co
2ced0 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65  nst char* and re
2cee0 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65  turning a pointe
2cef0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
2cf00 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c  .  ** We initial
2cf10 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69  ize x by assigni
2cf20 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20  ng it a pointer 
2cf30 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66  to the dlsym() f
2cf40 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54  unction..  ** (T
2cf50 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72  hat assignment r
2cf60 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29  equires a cast.)
2cf70 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74    Then we call t
2cf80 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  he function that
2cf90 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74  .  ** x points t
2cfa0 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  o.  .  **.  ** T
2cfb0 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
2cfc0 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77  is unlikely to w
2cfd0 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e  ork correctly on
2cfe0 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72   any system wher
2cff0 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c  e.  ** you reall
2d000 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20  y cannot cast a 
2d010 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
2d020 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75   into void*.  Bu
2d030 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20  t then, on the. 
2d040 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20   ** other hand, 
2d050 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74  dlsym() will not
2d060 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20   work on such a 
2d070 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73  system either, s
2d080 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e  o we have.  ** n
2d090 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61  ot really lost a
2d0a0 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  nything..  */.  
2d0b0 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64  void (*(*x)(void
2d0c0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
2d0d0 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  void);.  UNUSED_
2d0e0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2d0f0 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28  d);.  x = (void(
2d100 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  *(*)(void*,const
2d110 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64   char*))(void))d
2d120 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28  lsym;.  return (
2d130 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  *x)(p, zSym);.}.
2d140 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2d150 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
2d160 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
2d170 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
2d180 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d190 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63  (NotUsed);.  dlc
2d1a0 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
2d1b0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
2d1c0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
2d1d0 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
2d1e0 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
2d1f0 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
2d200 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
2d210 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
2d220 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
2d230 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
2d240 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
2d250 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
2d260 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
2d270 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
2d280 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
2d290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d2a0 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73  unixRandomness(s
2d2b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2d2c0 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
2d2d0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
2d2e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2d2f0 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72  otUsed);.  asser
2d300 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d  t((size_t)nBuf>=
2d310 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
2d320 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
2d330 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
2d340 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
2d350 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
2d360 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
2d370 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
2d380 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
2d390 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
2d3a0 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
2d3b0 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
2d3c0 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
2d3d0 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
2d3e0 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
2d3f0 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
2d400 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
2d410 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
2d420 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
2d430 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
2d440 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
2d450 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
2d460 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
2d470 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
2d480 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
2d490 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
2d4a0 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
2d4b0 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
2d4c0 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
2d4d0 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
2d4e0 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
2d4f0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
2d500 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
2d510 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
2d520 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
2d530 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
2d540 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
2d550 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
2d560 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
2d570 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
2d580 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
2d590 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
2d5a0 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
2d5b0 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21   0, nBuf);.#if !
2d5c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2d5d0 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  EST).  {.    int
2d5e0 20 70 69 64 2c 20 66 64 2c 20 67 6f 74 3b 0a 20   pid, fd, got;. 
2d5f0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2d600 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
2d610 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  m", O_RDONLY, 0)
2d620 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
2d630 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
2d640 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
2d650 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
2d660 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
2d670 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  t));.      pid =
2d680 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
2d690 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
2d6a0 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
2d6b0 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
2d6c0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
2d6d0 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64  of(t)+sizeof(pid
2d6e0 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
2d6f0 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
2d700 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
2d710 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c  of(pid);.    }el
2d720 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f  se{.      do{ go
2d730 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a  t = osRead(fd, z
2d740 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69  Buf, nBuf); }whi
2d750 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
2d760 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
2d770 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2d780 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
2d790 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2d7a0 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66  if.  return nBuf
2d7b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
2d7c0 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
2d7d0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
2d7e0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
2d7f0 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
2d800 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
2d810 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
2d820 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
2d830 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
2d840 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
2d850 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
2d860 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
2d870 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
2d880 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
2d890 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
2d8a0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
2d8b0 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
2d8c0 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
2d8d0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
2d8e0 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
2d8f0 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
2d900 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
2d910 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
2d920 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69  t unixSleep(sqli
2d930 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2d940 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
2d950 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ds){.#if OS_VXWO
2d960 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
2d970 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e  espec sp;..  sp.
2d980 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65  tv_sec = microse
2d990 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b  conds / 1000000;
2d9a0 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20  .  sp.tv_nsec = 
2d9b0 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20  (microseconds % 
2d9c0 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b  1000000) * 1000;
2d9d0 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70  .  nanosleep(&sp
2d9e0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45  , NULL);.  UNUSE
2d9f0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2da00 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
2da10 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
2da20 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
2da30 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
2da40 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
2da50 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
2da60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2da70 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2da80 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
2da90 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
2daa0 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
2dab0 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
2dac0 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
2dad0 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
2dae0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2daf0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2db00 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
2db10 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2db20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2db30 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2db40 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2db50 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2db60 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2db70 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2db80 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2db90 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2dba0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2dbb0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2dbc0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2dbd0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2dbe0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2dbf0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2dc00 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2dc10 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2dc20 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2dc30 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2dc40 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2dc50 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2dc60 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2dc70 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2dc80 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2dc90 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2dca0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2dcb0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2dcc0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2dcd0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2dce0 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2dcf0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2dd00 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2dd10 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2dd20 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2dd30 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2dd40 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2dd50 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2dd60 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2dd70 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2dd80 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2dd90 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2dda0 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
2ddb0 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
2ddc0 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
2ddd0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
2dde0 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  .** cannot be fo
2ddf0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
2de00 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
2de10 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
2de20 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71  vfs *NotUsed, sq
2de30 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
2de40 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  ow){.  static co
2de50 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2de60 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34  4 unixEpoch = 24
2de70 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f  405875*(sqlite3_
2de80 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20  int64)8640000;. 
2de90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2dea0 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  _OK;.#if defined
2deb0 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
2dec0 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
2ded0 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28  t);.  *piNow = (
2dee0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74  (sqlite3_int64)t
2def0 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f  )*1000 + unixEpo
2df00 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57  ch;.#elif OS_VXW
2df10 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
2df20 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63  mespec sNow;.  c
2df30 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f  lock_gettime(CLO
2df40 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e  CK_REALTIME, &sN
2df50 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  ow);.  *piNow = 
2df60 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
2df70 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2df80 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
2df90 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30  ow.tv_nsec/10000
2dfa0 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  00;.#else.  stru
2dfb0 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b  ct timeval sNow;
2dfc0 0a 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f 66  .  if( gettimeof
2dfd0 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30  day(&sNow, 0)==0
2dfe0 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
2dff0 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
2e000 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
2e010 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
2e020 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30  Now.tv_usec/1000
2e030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2e040 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2e050 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
2e060 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2e070 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
2e080 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
2e090 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
2e0a0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2e0b0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2e0c0 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
2e0d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
2e0e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2e0f0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
2e100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e110 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
2e120 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
2e130 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
2e140 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
2e150 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
2e160 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
2e170 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
2e180 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
2e190 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
2e1a0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2e1b0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
2e1c0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
2e1d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2e1e0 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
2e1f0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2e200 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  d, double *prNow
2e210 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
2e220 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 i = 0;.  int 
2e230 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rc;.  UNUSED_PAR
2e240 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2e250 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72  .  rc = unixCurr
2e260 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20  entTimeInt64(0, 
2e270 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  &i);.  *prNow = 
2e280 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
2e290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e2a0 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
2e2b0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
2e2c0 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
2e2d0 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
2e2e0 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
2e2f0 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
2e300 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
2e310 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
2e320 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
2e330 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
2e340 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
2e350 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
2e360 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
2e370 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
2e380 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
2e390 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2e3a0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
2e3b0 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
2e3c0 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
2e3d0 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
2e3e0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
2e3f0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
2e400 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
2e410 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
2e420 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
2e430 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2e440 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
2e450 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2e460 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
2e470 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2e480 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
2e490 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*.*******
2e4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4b0 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
2e4c0 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
2e4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2e4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e530 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
2e540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e580 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2e590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5a0 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
2e5b0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
2e5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
2e5e0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
2e5f0 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67   a "uber-locking
2e600 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73  -method" in this
2e610 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73   sense:  It uses
2e620 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f   the.** other lo
2e630 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
2e640 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20   secondary lock 
2e650 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f  files.  Proxy lo
2e660 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65  cking is a.** me
2e670 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f  ta-layer over to
2e680 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69  p of the primiti
2e690 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ve locking imple
2e6a0 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46  mented above.  F
2e6b0 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f  or.** this reaso
2e6c0 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
2e6d0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2e6e0 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
2e6f0 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20   is deferred.** 
2e700 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68  until late in th
2e710 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66  e file (here) af
2e720 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ter all of the o
2e730 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73  ther I/O methods
2e740 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65   have.** been de
2e750 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20  fined - so that 
2e760 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
2e770 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72  cking methods ar
2e780 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61  e available.** a
2e790 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65  s services to he
2e7a0 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c  lp with the impl
2e7b0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72  ementation of pr
2e7c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  oxy locking..**.
2e7d0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
2e7e0 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73  efault locking s
2e7f0 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65  chemes in SQLite
2e800 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20   use byte-range 
2e810 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  locks on the.** 
2e820 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2e830 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65   coordinate safe
2e840 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63  , concurrent acc
2e850 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ess by multiple 
2e860 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77  readers.** and w
2e870 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73  riters [http://s
2e880 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e  qlite.org/lockin
2e890 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20  gv3.html].  The 
2e8a0 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  five file lockin
2e8b0 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c  g.** states (UNL
2e8c0 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20  OCKED, PENDING, 
2e8d0 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
2e8e0 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65  , EXCLUSIVE) are
2e8f0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
2e900 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20  as POSIX read & 
2e910 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72  write locks over
2e920 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f   fixed set of lo
2e930 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63  cations (via fsc
2e940 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61  tl),.** on AFP a
2e950 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c  nd SMB only excl
2e960 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
2e970 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c   locks are avail
2e980 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a  able via fsctl.*
2e990 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27  * with _IOWR('z'
2e9a0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
2e9b0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74  eRangeLockPB2) t
2e9c0 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65  o track the same
2e9d0 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f   5 states..** To
2e9e0 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44   simulate a F_RD
2e9f0 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65  LCK on the share
2ea00 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20  d range, on AFP 
2ea10 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  a randomly selec
2ea20 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69  ted.** address i
2ea30 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
2ea40 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
2ea50 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
2ea60 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61  he entire.** sha
2ea70 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
2ea80 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53  en for an EXCLUS
2ea90 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a  IVE lock):.**.**
2eaa0 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
2eab0 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  TE        0x4000
2eac0 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20  0000..   ..**   
2ead0 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
2eae0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
2eaf0 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
2eb00 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
2eb10 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
2eb20 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
2eb30 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
2eb40 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
2eb50 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
2eb60 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
2eb70 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
2eb80 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
2eb90 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
2eba0 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
2ebb0 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
2ebc0 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
2ebd0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
2ebe0 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
2ebf0 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
2ec00 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
2ec10 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
2ec20 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
2ec30 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
2ec40 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
2ec50 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
2ec60 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
2ec70 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
2ec80 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
2ec90 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
2eca0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
2ecb0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
2ecc0 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
2ecd0 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
2ece0 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
2ecf0 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
2ed00 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
2ed10 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
2ed20 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
2ed30 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
2ed40 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
2ed50 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
2ed60 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
2ed70 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
2ed80 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
2ed90 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
2eda0 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
2edb0 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
2edc0 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
2edd0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
2ede0 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
2edf0 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
2ee00 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
2ee10 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
2ee20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
2ee30 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
2ee40 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
2ee50 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
2ee60 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
2ee70 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
2ee80 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
2ee90 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
2eea0 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
2eeb0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
2eec0 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
2eed0 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
2eee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2eef0 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
2ef00 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
2ef10 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
2ef20 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ame, SQLITE_SET_
2ef30 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
2ef40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2ef50 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70          <proxy_p
2ef60 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29  ath> | ":auto:")
2ef70 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.**  sqlite3_fi
2ef80 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
2ef90 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45  bname, SQLITE_GE
2efa0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
2efb0 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b   &<proxy_path>);
2efc0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72  .**.**.** SQL pr
2efd0 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41  agmas.**.**  PRA
2efe0 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
2eff0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c  ock_proxy_file=<
2f000 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61  proxy_path> | :a
2f010 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  uto:.**  PRAGMA 
2f020 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
2f030 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a  proxy_file.**.**
2f040 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75   Specifying ":au
2f050 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20  to:" means that 
2f060 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  if there is a co
2f070 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20  nch file with a 
2f080 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74  matching.** host
2f090 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70   ID in it, the p
2f0a0 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65  roxy path in the
2f0b0 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
2f0c0 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77   be used, otherw
2f0d0 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70  ise.** a proxy p
2f0e0 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ath based on the
2f0f0 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72   user's temp dir
2f100 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72  .** (via confstr
2f110 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
2f120 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20  _TEMP_DIR,...)) 
2f130 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64  will be used and
2f140 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70   the.** actual p
2f150 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  roxy file name i
2f160 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
2f170 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61   the name and pa
2f180 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  th of the.** dat
2f190 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72  abase file.  For
2f1a0 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
2f1b0 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61        For databa
2f1c0 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f  se path "/Users/
2f1d0 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20  me/foo.db" .**  
2f1e0 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61       The lock pa
2f1f0 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70  th will be "<tmp
2f200 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b  dir>/sqliteplock
2f210 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e  s/_Users_me_foo.
2f220 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a  db:auto:").**.**
2f230 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f   Once a lock pro
2f240 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  xy is configured
2f250 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
2f260 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63  connection, it c
2f270 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d  an not.** be rem
2f280 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74  oved, however it
2f290 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64   may be switched
2f2a0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2f2b0 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a  proxy path via.*
2f2c0 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73  * the above APIs
2f2d0 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63   (assuming the c
2f2e0 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74  onch file is not
2f2f0 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61   being held by a
2f300 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63  nother.** connec
2f310 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29  tion or process)
2f320 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20  . .**.**.** How 
2f330 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f  proxy locking wo
2f340 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  rks.** ---------
2f350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
2f360 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20  *.** Proxy file 
2f370 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70  locking relies p
2f380 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20  rimarily on two 
2f390 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66  new supporting f
2f3a0 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  iles: .**.**   *
2f3b0 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20    conch file to 
2f3c0 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20  limit access to 
2f3d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f3e0 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f  e to a single ho
2f3f0 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20  st.**      at a 
2f400 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  time.**.**   *  
2f410 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63  proxy file to ac
2f420 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72  t as a proxy for
2f430 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f   the advisory lo
2f440 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  cks normally.** 
2f450 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68       taken on th
2f460 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  e database.**.**
2f470 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
2f480 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79  - to use a proxy
2f490 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75   file, sqlite mu
2f4a0 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74  st first "hold t
2f4b0 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20  he conch".** by 
2f4c0 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  taking an sqlite
2f4d0 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f  -style shared lo
2f4e0 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
2f4f0 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68  file, reading th
2f500 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e  e.** contents an
2f510 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  d comparing the 
2f520 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f  host's unique ho
2f530 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77  st ID (see below
2f540 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72  ) and lock.** pr
2f550 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74  oxy path against
2f560 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
2f570 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e  ed in the conch.
2f580 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65    The conch file
2f590 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e   is.** stored in
2f5a0 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
2f5b0 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62  ory as the datab
2f5c0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
2f5d0 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73   file name.** is
2f5e0 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72   patterned after
2f5f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f600 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61  le name as ".<da
2f610 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63  tabasename>-conc
2f620 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  h"..** If the co
2f630 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nch file does no
2f640 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73  t exist, or it's
2f650 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
2f660 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
2f670 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
2f680 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
2f690 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
2f6a0 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
2f6b0 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
2f6c0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
2f6d0 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
2f6e0 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
2f6f0 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
2f700 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
2f710 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
2f720 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
2f730 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
2f740 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
2f750 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
2f760 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
2f770 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
2f780 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
2f790 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
2f7a0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
2f7b0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2f7c0 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
2f7d0 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
2f7e0 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
2f7f0 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
2f800 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
2f810 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
2f820 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
2f830 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
2f840 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
2f850 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f860 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
2f870 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
2f880 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
2f890 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
2f8a0 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
2f8b0 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
2f8c0 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
2f8d0 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
2f8e0 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
2f8f0 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
2f900 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
2f910 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
2f920 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
2f930 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
2f940 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
2f950 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2f960 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
2f970 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
2f980 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
2f990 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
2f9a0 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
2f9b0 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
2f9c0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
2f9d0 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
2f9e0 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
2f9f0 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
2fa00 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
2fa10 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
2fa20 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
2fa30 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
2fa40 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
2fa50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
2fa60 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
2fa70 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
2fa80 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
2fa90 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
2faa0 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
2fab0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
2fac0 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
2fad0 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
2fae0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
2faf0 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
2fb00 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
2fb10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
2fb20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2fb30 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
2fb40 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
2fb50 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
2fb60 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
2fb70 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
2fb80 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
2fb90 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
2fba0 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
2fbb0 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
2fbc0 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
2fbd0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
2fbe0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
2fbf0 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
2fc00 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
2fc10 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
2fc20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
2fc30 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
2fc40 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
2fc50 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
2fc60 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
2fc70 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
2fc80 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
2fc90 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
2fca0 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
2fcb0 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
2fcc0 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
2fcd0 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
2fce0 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
2fcf0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
2fd00 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
2fd10 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
2fd20 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
2fd30 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
2fd40 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
2fd50 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
2fd60 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
2fd70 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
2fd80 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
2fd90 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
2fda0 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
2fdb0 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
2fdc0 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
2fdd0 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
2fde0 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
2fdf0 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
2fe00 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
2fe10 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
2fe20 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
2fe30 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2fe40 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
2fe50 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
2fe60 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
2fe70 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2fe80 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
2fe90 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
2fea0 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
2feb0 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
2fec0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
2fed0 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
2fee0 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
2fef0 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
2ff00 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
2ff10 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
2ff20 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
2ff30 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  city calling the
2ff40 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
2ff50 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61  PROXYFILE pragma
2ff60 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69   or.** sqlite_fi
2ff70 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69  le_control API i
2ff80 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62  s not affected b
2ff90 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  y SQLITE_FORCE_P
2ffa0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a  ROXY_LOCKING)..*
2ffb0 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  /../*.** Proxy l
2ffc0 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
2ffd0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
2ffe0 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  SX .*/.#if defin
2fff0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
30000 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
30010 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
30020 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63  .** The proxyLoc
30030 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20  kingContext has 
30040 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c  the path and fil
30050 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
30060 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20   the remote .** 
30070 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20  and local proxy 
30080 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74  files in it.*/.t
30090 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72  ypedef struct pr
300a0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
300b0 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
300c0 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72  ntext;.struct pr
300d0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
300e0 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t {.  unixFile *
300f0 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20  conchFile;      
30100 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68     /* Open conch
30110 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
30120 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20  *conchFilePath; 
30130 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
30140 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  of the conch fil
30150 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
30160 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20  *lockProxy;     
30170 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78      /* Open prox
30180 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
30190 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79   char *lockProxy
301a0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
301b0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
301c0 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
301d0 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20    char *dbPath; 
301e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
301f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
30200 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  en file */.  int
30210 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20   conchHeld;     
30220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69            /* 1 i
30230 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68  f the conch is h
30240 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c  eld, -1 if lockl
30250 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  ess */.  void *o
30260 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
30270 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
30280 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
30290 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
302a0 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
302b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
302c0 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
302d0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
302e0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
302f0 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
30300 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
30310 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
30320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
30330 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
30340 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
30350 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
30360 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
30370 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
30380 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
30390 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
303a0 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
303b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
303c0 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
303d0 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
303e0 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
303f0 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
30400 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
30410 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
30420 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
30430 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
30440 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
30450 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
30460 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
30470 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
30480 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
30490 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
304a0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
304b0 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
304c0 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
304d0 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
304e0 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
304f0 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
30500 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30510 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
30520 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
30530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30540 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
30550 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
30560 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
30570 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
30580 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
30590 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
305a0 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
305b0 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
305c0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
305d0 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
305e0 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
305f0 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
30600 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
30610 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
30620 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
30630 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
30640 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
30650 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
30660 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
30670 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
30680 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74  & (i+len+7)<(int
30690 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  )maxLen; i++){. 
306a0 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61     char c = dbPa
306b0 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68  th[i];.    lPath
306c0 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f  [i+len] = (c=='/
306d0 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20  ')?'_':c;.  }.  
306e0 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30  lPath[i+len]='\0
306f0 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61  ';.  strlcat(lPa
30700 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61  th, ":auto:", ma
30710 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45  xLen);.  OSTRACE
30720 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
30730 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
30740 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50  %s pid=%d\n", lP
30750 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ath, getpid()));
30760 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30770 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20  _OK;.}../* . ** 
30780 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b  Creates the lock
30790 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69   file and any mi
307a0 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  ssing directorie
307b0 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a  s in lockPath. *
307c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
307d0 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
307e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63  (const char *loc
307f0 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c  kPath){.  int i,
30800 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66   len;.  char buf
30810 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
30820 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20  int start = 0;. 
30830 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50   .  assert(lockP
30840 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a  ath!=NULL);.  /*
30850 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
30860 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  ll the intermedi
30870 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  ate directories 
30880 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29  */.  len = (int)
30890 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29  strlen(lockPath)
308a0 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63  ;.  buf[0] = loc
308b0 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28  kPath[0];.  for(
308c0 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b   i=1; i<len; i++
308d0 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
308e0 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26  Path[i] == '/' &
308f0 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30  & (i - start > 0
30900 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e  ) ){.      /* on
30910 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66  ly mkdir if leaf
30920 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22   dir != "." or "
30930 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20  /" or ".." */.  
30940 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e      if( i-start>
30950 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31  2 || (i-start==1
30960 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
30970 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
30980 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20  rt] != '/') .   
30990 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72        || (i-star
309a0 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72  t==2 && buf[star
309b0 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
309c0 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27  [start+1] != '.'
309d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66  ) ){.        buf
309e0 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20  [i]='\0';.      
309f0 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75    if( osMkdir(bu
30a00 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  f, SQLITE_DEFAUL
30a10 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
30a20 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20  SSIONS) ){.     
30a30 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72       int err=err
30a40 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  no;.          if
30a50 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20  ( err!=EEXIST ) 
30a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53  {.            OS
30a70 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f  TRACE(("CREATELO
30a80 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63  CKPATH  FAILED c
30a90 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20  reating %s, ".  
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ab0 20 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c     "'%s' proxy l
30ac0 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
30ad0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
30ae0 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c              buf,
30af0 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20   strerror(err), 
30b00 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64  lockPath, getpid
30b10 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ()));.          
30b20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20    return err;.  
30b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30b50 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20    start=i+1;.   
30b60 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20   }.    buf[i] = 
30b70 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d  lockPath[i];.  }
30b80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45  .  OSTRACE(("CRE
30b90 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  ATELOCKPATH  pro
30ba0 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
30bb0 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50  pid=%d\n", lockP
30bc0 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ath, getpid()));
30bd0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
30be0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
30bf0 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63  ew VFS file desc
30c00 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69  riptor (stored i
30c10 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
30c20 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
30c30 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70  3_malloc) and op
30c40 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  en the file name
30c50 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20  d "path" in the 
30c60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
30c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
30c80 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
30c90 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c   not only for cl
30ca0 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  osing the file d
30cb0 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74  escriptor.** but
30cc0 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e   also for freein
30cd0 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73  g the memory ass
30ce0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
30cf0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
30d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30d10 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
30d20 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile(.    const c
30d30 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
30d40 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68    /* path for th
30d50 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a  e new unixFile *
30d60 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  /.    unixFile *
30d70 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f  *ppFile,       /
30d80 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74  * unixFile creat
30d90 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ed and returned 
30da0 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e  by ref */.    in
30db0 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20  t islockfile    
30dc0 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e         /* if non
30dd0 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69   zero missing di
30de0 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  rs will be creat
30df0 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20  ed */.) {.  int 
30e00 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46  fd = -1;.  unixF
30e10 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ile *pNew;.  int
30e20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30e30 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
30e40 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
30e50 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  EAT;.  sqlite3_v
30e60 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69  fs dummyVfs;.  i
30e70 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20  nt terrno = 0;. 
30e80 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
30e90 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a  Unused = NULL;..
30ea0 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72    /* 1. first tr
30eb0 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  y to open/create
30ec0 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32   the file.  ** 2
30ed0 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c  . if that fails,
30ee0 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c   and this is a l
30ef0 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f  ock file (not-co
30f00 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69  nch), try creati
30f10 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65  ng.  ** the pare
30f20 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61  nt directories a
30f30 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69  nd then try agai
30f40 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68  n..  ** 3. if th
30f50 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f  at fails, try to
30f60 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72   open the file r
30f70 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74  ead-only.  ** ot
30f80 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42  herwise return B
30f90 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c  USY (if lock fil
30fa0 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66  e) or CANTOPEN f
30fb0 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  or the conch fil
30fc0 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64  e.  */.  pUnused
30fd0 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
30fe0 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  d(path, openFlag
30ff0 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65  s);.  if( pUnuse
31000 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55  d ){.    fd = pU
31010 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c  nused->fd;.  }el
31020 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  se{.    pUnused 
31030 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
31040 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
31050 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e  ));.    if( !pUn
31060 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65  used ){.      re
31070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
31080 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
31090 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66  f( fd<0 ){.    f
310a0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
310b0 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
310c0 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20   0);.    terrno 
310d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
310e0 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   fd<0 && errno==
310f0 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b  ENOENT && islock
31100 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  file ){.      if
31110 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  ( proxyCreateLoc
31120 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53  kPath(path) == S
31130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31140 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
31150 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
31160 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
31170 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
31180 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70  ( fd<0 ){.    op
31190 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e  enFlags = O_RDON
311a0 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  LY;.    fd = rob
311b0 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
311c0 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
311d0 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
311e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  ;.  }.  if( fd<0
311f0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f   ){.    if( islo
31200 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  ckfile ){.      
31210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
31220 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  SY;.    }.    sw
31230 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a  itch (terrno) {.
31240 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45        case EACCE
31250 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  S:.        retur
31260 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
31270 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a       case EIO: .
31280 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31290 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
312a0 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ; /* even though
312b0 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68   it is the conch
312c0 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c   */.      defaul
312d0 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  t:.        retur
312e0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
312f0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
31300 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75  }.  .  pNew = (u
31310 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65  nixFile *)sqlite
31320 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
31330 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
31340 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  New==NULL ){.   
31350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
31360 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  EM;.    goto end
31370 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20  _create_proxy;. 
31380 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
31390 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
313a0 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  File));.  pNew->
313b0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
313c0 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28  Flags;.  memset(
313d0 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69  &dummyVfs, 0, si
313e0 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b  zeof(dummyVfs));
313f0 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70  .  dummyVfs.pApp
31400 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61  Data = (void*)&a
31410 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b  utolockIoFinder;
31420 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d  .  dummyVfs.zNam
31430 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70  e = "dummy";.  p
31440 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
31450 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  .  pUnused->flag
31460 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
31470 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d   pNew->pUnused =
31480 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72   pUnused;.  .  r
31490 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
314a0 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
314b0 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  , (sqlite3_file*
314c0 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b  )pNew, path, 0);
314d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
314e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
314f0 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
31500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31510 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
31520 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f  _proxy:    .  ro
31530 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
31540 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
31550 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31560 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
31570 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
31580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
31590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
315a0 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
315b0 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
315c0 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
315d0 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
315e0 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
315f0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
31600 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
31610 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
31620 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
31630 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
31640 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20  ngth */../* Not 
31650 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
31660 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
31670 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
31680 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
31690 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
316a0 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
316b0 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
316c0 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  );../* get the h
316d0 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f  ost ID via getho
316e0 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49  stuuid(), pHostI
316f0 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  D must point to 
31700 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
31710 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69  .** bytes of wri
31720 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  table memory..*/
31730 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
31740 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67  yGetHostID(unsig
31750 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49  ned char *pHostI
31760 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
31770 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f  .  assert(PROXY_
31780 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a  HOSTIDLEN == siz
31790 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20  eof(uuid_t));.  
317a0 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20  memset(pHostID, 
317b0 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  0, PROXY_HOSTIDL
317c0 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  EN);.#if defined
317d0 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53  (__MAX_OS_X_VERS
317e0 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
317f0 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
31800 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f    && __MAC_OS_X_
31810 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
31820 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20  IRED<1050.  {.  
31830 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
31840 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74  truct timespec t
31850 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b  imeout = {1, 0};
31860 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75   /* 1 sec timeou
31870 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74  t */.    if( get
31880 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
31890 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
318a0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
318b0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
318c0 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
318d0 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b    *pError = err;
318e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
318f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
31900 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
31910 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
31920 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a  AMETER(pError);.
31930 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
31940 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73  LITE_TEST.  /* s
31950 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
31960 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
31970 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
31980 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20   file paths */. 
31990 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73   if( sqlite3_hos
319a0 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20  tid_num != 0){. 
319b0 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20     pHostID[0] = 
319c0 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30  (char)(pHostID[0
319d0 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74  ] + (char)(sqlit
319e0 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20  e3_hostid_num & 
319f0 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  0xFF));.  }.#end
31a00 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53  if.  .  return S
31a10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
31a20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  The conch file c
31a30 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64  ontains the head
31a40 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20  er, host id and 
31a50 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
31a60 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
31a70 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20  _CONCHVERSION 2 
31a80 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64    /* 1-byte head
31a90 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74  er, 16-byte host
31aa0 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65   id, path */.#de
31ab0 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45  fine PROXY_HEADE
31ac0 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63  RLEN    1   /* c
31ad0 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72  onch file header
31ae0 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69   length */.#defi
31af0 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  ne PROXY_PATHIND
31b00 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41  EX    (PROXY_HEA
31b10 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
31b20 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20  TIDLEN).#define 
31b30 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
31b40 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52  N  (PROXY_HEADER
31b50 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
31b60 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a  LEN+MAXPATHLEN).
31b70 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ./* .** Takes an
31b80 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   open conch file
31b90 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e  , copies the con
31ba0 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70  tents to a new p
31bb0 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76  ath and then mov
31bc0 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20  es .** it back. 
31bd0 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74   The newly creat
31be0 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64  ed file's file d
31bf0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73  escriptor is ass
31c00 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  igned to the.** 
31c10 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63  conch file struc
31c20 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ture and finally
31c30 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
31c40 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  nch file descrip
31c50 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65  tor is .** close
31c60 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f  d.  Returns zero
31c70 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
31c80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
31c90 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
31ca0 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
31cb0 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
31cc0 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  ID){.  proxyLock
31cd0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
31ce0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
31cf0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
31d00 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
31d10 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f   .  unixFile *co
31d20 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
31d30 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61  conchFile;.  cha
31d40 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r tPath[MAXPATHL
31d50 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  EN];.  char buf[
31d60 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
31d70 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74  N];.  char *cPat
31d80 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h = pCtx->conchF
31d90 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f  ilePath;.  size_
31da0 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
31db0 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
31dc0 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d  = 0;.  char errm
31dd0 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69  sg[64] = "";.  i
31de0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
31df0 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55  t rc = -1;.  UNU
31e00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79  SED_PARAMETER(my
31e10 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63  HostID);..  /* c
31e20 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68  reate a new path
31e30 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20   by replace the 
31e40 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68  trailing '-conch
31e50 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20  ' with '-break' 
31e60 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73  */.  pathLen = s
31e70 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50  trlcpy(tPath, cP
31e80 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
31e90 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e  ;.  if( pathLen>
31ea0 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61  MAXPATHLEN || pa
31eb0 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20  thLen<6 || .    
31ec0 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68   (strlcpy(&tPath
31ed0 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72  [pathLen-5], "br
31ee0 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29  eak", 6) != 5) )
31ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
31f00 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
31f10 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61  rmsg),errmsg,"pa
31f20 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  th error (len %d
31f30 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29  )",(int)pathLen)
31f40 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
31f50 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
31f60 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63  /* read the conc
31f70 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72  h content */.  r
31f80 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64  eadLen = osPread
31f90 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62  (conchFile->h, b
31fa0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
31fb0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28  CHLEN, 0);.  if(
31fc0 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50   readLen<PROXY_P
31fd0 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20  ATHINDEX ){.    
31fe0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
31ff0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
32000 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72  errmsg,"read err
32010 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e  or (len %d)",(in
32020 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20  t)readLen);.    
32030 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
32040 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69  ck;.  }.  /* wri
32050 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
32060 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b   temporary break
32070 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20   file */.  fd = 
32080 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74  robust_open(tPat
32090 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  h, (O_RDWR|O_CRE
320a0 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a  AT|O_EXCL), 0);.
320b0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
320c0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
320d0 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
320e0 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61  ), errmsg, "crea
320f0 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
32100 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
32110 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
32120 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72  .  }.  if( osPwr
32130 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61  ite(fd, buf, rea
32140 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69  dLen, 0) != (ssi
32150 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a  ze_t)readLen ){.
32160 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
32170 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
32180 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72  sg), errmsg, "wr
32190 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ite failed (%d)"
321a0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
321b0 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
321c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61  ;.  }.  if( rena
321d0 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29  me(tPath, cPath)
321e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
321f0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32200 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
32210 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20   "rename failed 
32220 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
32230 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
32240 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  klock;.  }.  rc 
32250 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  = 0;.  fprintf(s
32260 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74  tderr, "broke st
32270 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e  ale lock on %s\n
32280 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62  ", cPath);.  rob
32290 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
322a0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f   conchFile->h, _
322b0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63  _LINE__);.  conc
322c0 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20  hFile->h = fd;. 
322d0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e   conchFile->open
322e0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
322f0 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62   O_CREAT;..end_b
32300 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20  reaklock:.  if( 
32310 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64  rc ){.    if( fd
32320 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  >=0 ){.      osU
32330 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20  nlink(tPath);.  
32340 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
32350 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49  (pFile, fd, __LI
32360 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NE__);.    }.   
32370 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
32380 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61   "failed to brea
32390 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20  k stale lock on 
323a0 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68  %s, %s\n", cPath
323b0 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20  , errmsg);.  }. 
323c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
323d0 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75 65  * Take the reque
323e0 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sted lock on the
323f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20   conch file and 
32400 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f  break a stale lo
32410 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ck if the .** ho
32420 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a  st id matches..*
32430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
32440 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  xyConchLock(unix
32450 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
32460 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e  d_t myHostID, in
32470 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70  t lockType){.  p
32480 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
32490 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
324a0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
324b0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
324c0 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78  Context; .  unix
324d0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
324e0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
324f0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
32500 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
32510 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72  Tries = 0;.  str
32520 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e  uct timespec con
32530 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20  chModTime;.  .  
32540 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64  memset(&conchMod
32550 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Time, 0, sizeof(
32560 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a  conchModTime));.
32570 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
32580 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
32590 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
325a0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
325b0 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  le, lockType);. 
325c0 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20     nTries ++;.  
325d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
325e0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f  _BUSY ){.      /
325f0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61  * If the lock fa
32600 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20  iled (busy):.   
32610 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67      * 1st try: g
32620 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  et the mod time 
32630 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61  of the conch, wa
32640 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20  it 0.5s and try 
32650 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a  again. .       *
32660 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69   2nd try: fail i
32670 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63  f the mod time c
32680 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69  hanged or host i
32690 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20  d is different, 
326a0 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20  wait .       *  
326b0 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63 20           10 sec 
326c0 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20  and try again.  
326d0 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20       * 3rd try: 
326e0 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75  break the lock u
326f0 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69  nless the mod ti
32700 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a  me has changed..
32710 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32720 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
32730 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
32740 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  at(conchFile->h,
32750 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20   &buf) ){.      
32760 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
32770 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
32780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32790 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
327a0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
327b0 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31     if( nTries==1
327c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63   ){.        conc
327d0 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73  hModTime = buf.s
327e0 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20  t_mtimespec;.   
327f0 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30       usleep(5000
32800 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35  00); /* wait 0.5
32810 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
32820 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20   lock again*/.  
32830 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
32840 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
32850 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e   assert( nTries>
32860 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  1 );.      if( c
32870 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73  onchModTime.tv_s
32880 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
32890 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c  mespec.tv_sec ||
328a0 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68   .         conch
328b0 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20  ModTime.tv_nsec 
328c0 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
328d0 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20  pec.tv_nsec ){. 
328e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
328f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
32900 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
32910 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b  if( nTries==2 ){
32920 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20    .        char 
32930 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  tBuf[PROXY_MAXCO
32940 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
32950 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65   int len = osPre
32960 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
32970 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58   tBuf, PROXY_MAX
32980 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
32990 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20        if( len<0 
329a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
329b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
329c0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
329d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
329e0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
329f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
32a00 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49   len>PROXY_PATHI
32a10 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d  NDEX && tBuf[0]=
32a20 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
32a30 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20  CHVERSION){.    
32a40 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
32a50 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66  reak the lock if
32a60 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65   the host id doe
32a70 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20  sn't match */.  
32a80 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d          if( 0!=m
32a90 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58  emcmp(&tBuf[PROX
32aa0 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
32ab0 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f  HostID, PROXY_HO
32ac0 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20  STIDLEN) ){.    
32ad0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
32ae0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
32af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32b10 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
32b20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72  the lock on shor
32b30 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72 73  t read or a vers
32b40 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a  ion mismatch */.
32b50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
32b60 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
32b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32b80 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30 29  usleep(10000000)
32b90 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63  ; /* wait 10 sec
32ba0 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63   and try the loc
32bb0 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  k again */.     
32bc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20     continue; .  
32bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
32be0 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65     assert( nTrie
32bf0 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  s==3 );.      if
32c00 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43  ( 0==proxyBreakC
32c10 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
32c20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20  myHostID) ){.   
32c30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32c40 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
32c50 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55   lockType==EXCLU
32c60 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
32c70 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
32c80 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
32c90 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
32ca0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
32cb0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20  SHARED_LOCK);   
32cc0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
32cd0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72  }.        if( !r
32ce0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
32cf0 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
32d00 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
32d10 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
32d20 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
32d30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32d40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77     }.    }.  } w
32d50 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
32d60 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c  _BUSY && nTries<
32d70 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  3 );.  .  return
32d80 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73   rc;.}../* Takes
32d90 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61   the conch by ta
32da0 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  king a shared lo
32db0 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20  ck and read the 
32dc0 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20  contents conch, 
32dd0 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  if .** lockPath 
32de0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
32df0 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63   host ID and loc
32e00 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74  k file path must
32e10 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20   match.  A NULL 
32e20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61  .** lockPath mea
32e30 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ns that the lock
32e40 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  Path in the conc
32e50 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
32e60 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  sed if the .** h
32e70 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f  ost IDs match, o
32e80 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74  r a new lock pat
32e90 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  h will be genera
32ea0 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
32eb0 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65  y .** and writte
32ec0 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66  n to the conch f
32ed0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
32ee0 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  nt proxyTakeConc
32ef0 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
32f00 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
32f10 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
32f20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
32f30 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
32f40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
32f50 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  .  .  if( pCtx->
32f60 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a  conchHeld!=0 ){.
32f70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32f80 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
32f90 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
32fa0 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
32fb0 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75  onchFile;.    uu
32fc0 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20  id_t myHostID;. 
32fd0 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
32fe0 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64  0;.    char read
32ff0 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
33000 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
33010 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
33020 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
33030 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20  *tempLockPath = 
33040 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63  NULL;.    int rc
33050 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33060 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63    int createConc
33070 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68  h = 0;.    int h
33080 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a  ostIdMatch = 0;.
33090 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20      int readLen 
330a0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79  = 0;.    int try
330b0 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
330c0 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65  .    int forceNe
330d0 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  wLockPath = 0;. 
330e0 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28     .    OSTRACE(
330f0 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
33100 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
33110 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
33120 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
33130 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
33140 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
33150 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
33160 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b  :"), getpid()));
33170 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  ..    rc = proxy
33180 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74  GetHostID(myHost
33190 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20  ID, &pError);.  
331a0 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
331b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
331c0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
331d0 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72  stErrno = pError
331e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
331f0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
33200 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  }.    rc = proxy
33210 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
33220 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45   myHostID, SHARE
33230 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
33240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33250 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
33260 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
33270 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68  }.    /* read th
33280 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68  e existing conch
33290 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61   file */.    rea
332a0 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65  dLen = seekAndRe
332b0 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f  ad((unixFile*)co
332c0 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64  nchFile, 0, read
332d0 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
332e0 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28  NCHLEN);.    if(
332f0 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20   readLen<0 ){.  
33300 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72      /* I/O error
33310 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  : lastErrno set 
33320 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
33330 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  /.      pFile->l
33340 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68  astErrno = conch
33350 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
33360 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
33370 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20  TE_IOERR_READ;. 
33380 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
33390 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c  keconch;.    }el
333a0 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d  se if( readLen<=
333b0 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
333c0 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
333d0 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
333e0 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28     readBuf[0]!=(
333f0 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
33400 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20  VERSION ){.     
33410 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64   /* a short read
33420 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d   or version form
33430 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e  at mismatch mean
33440 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  s we need to cre
33450 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20  ate a new .     
33460 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20   ** conch file. 
33470 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33480 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b  createConch = 1;
33490 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66  .    }.    /* if
334a0 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74   the host id mat
334b0 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  ches and the loc
334c0 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20 65  k path already e
334d0 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e  xists in the con
334e0 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20  ch.    ** we'll 
334f0 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 70  try to use the p
33500 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77 65  ath there, if we
33510 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74   can't open that
33520 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20   path, we'll .  
33530 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20    ** retry with 
33540 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72  a new auto-gener
33550 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a  ated path .    *
33560 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e  /.    do { /* in
33570 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f   case we need to
33580 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61   try again for a
33590 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c  n :auto: named l
335a0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ock file */..   
335b0 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43 6f     if( !createCo
335c0 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77  nch && !forceNew
335d0 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
335e0 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20      hostIdMatch 
335f0 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42  = !memcmp(&readB
33600 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  uf[PROXY_HEADERL
33610 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a  EN], myHostID, .
33620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33640 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45    PROXY_HOSTIDLE
33650 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69  N);.        /* i
33660 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20  f the conch has 
33670 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65  data compare the
33680 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20   contents */.   
33690 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e       if( !pCtx->
336a0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
336b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f  .          /* fo
336c0 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63  r auto-named loc
336d0 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75  al lock file, ju
336e0 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73  st check the hos
336f0 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20  t ID and we'll. 
33700 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
33710 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20   the local lock 
33720 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27 73  file path that's
33730 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72   already in ther
33740 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e.           */.
33750 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68 6f            if( ho
33760 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20  stIdMatch ){.   
33770 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20           size_t 
33780 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c  pathLen = (readL
33790 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49  en - PROXY_PATHI
337a0 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20  NDEX);.         
337b0 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
337c0 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58  if( pathLen>=MAX
337d0 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20  PATHLEN ){.     
337e0 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e           pathLen
337f0 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20  =MAXPATHLEN-1;. 
33800 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
33810 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
33820 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42  lockPath, &readB
33830 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  uf[PROXY_PATHIND
33840 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20  EX], pathLen);. 
33850 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50             lockP
33860 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30  ath[pathLen] = 0
33870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
33880 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63  mpLockPath = loc
33890 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20  kPath;.         
338a0 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74     tryOldLockPat
338b0 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
338c0 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63     /* create a c
338d0 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  opy of the lock 
338e0 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63  path if the conc
338f0 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  h is taken */.  
33900 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
33910 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
33920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33930 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74    }else if( host
33940 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20  IdMatch.        
33950 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e 63         && !strnc
33960 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
33970 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  xyPath, &readBuf
33980 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
33990 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
339a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
339b0 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48  adLen-PROXY_PATH
339c0 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20 29  INDEX).        )
339d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  {.          /* c
339e0 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f  onch host and lo
339f0 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f  ck path match */
33a00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
33a10 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a  end_takeconch; .
33a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33a30 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  }.      .      /
33a40 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  * if the conch i
33a50 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e  sn't writable an
33a60 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c  d doesn't match,
33a70 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69   we can't take i
33a80 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  t */.      if( (
33a90 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
33aa0 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20  lags&O_RDWR) == 
33ab0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
33ac0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
33ad0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
33ae0 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20  takeconch;.     
33af0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
33b00 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 6f  /* either the co
33b10 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68  nch didn't match
33b20 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63   or we need to c
33b30 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
33b40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  */.      if( !pC
33b50 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
33b60 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f  h ){.        pro
33b70 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43  xyGetLockPath(pC
33b80 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b  tx->dbPath, lock
33b90 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
33ba0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c  );.        tempL
33bb0 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61  ockPath = lockPa
33bc0 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  th;.        /* c
33bd0 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
33be0 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f  the lock path _o
33bf0 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63  nly_ if the conc
33c00 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  h is taken */.  
33c10 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
33c20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e     /* update con
33c30 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64  ch with host and
33c40 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c   path (this will
33c50 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70   fail if other p
33c60 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20  rocess.      ** 
33c70 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
33c80 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74  k already), if t
33c90 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
33ca0 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a  es, use the big.
33cb0 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a        ** stick..
33cc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
33cd0 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65  utimes(conchFile
33ce0 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ->h, NULL);.    
33cf0 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63    if( hostIdMatc
33d00 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63  h && !createConc
33d10 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  h ){.        if(
33d20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f   conchFile->pIno
33d30 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d  de && conchFile-
33d40 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
33d50 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
33d60 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
33d70 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
33d80 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
33d90 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
33da0 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s.           ** 
33db0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
33dc0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
33dd0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
33de0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
33df0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
33e00 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20      } else {    
33e10 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
33e20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68   rc = proxyConch
33e30 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
33e40 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f  stID, EXCLUSIVE_
33e50 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
33e60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33e70 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
33e80 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
33e90 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
33ea0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45  le*)conchFile, E
33eb0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
33ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33ed0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33ee0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
33ef0 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
33f00 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
33f10 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69 74          int writ
33f20 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  eSize = 0;.     
33f30 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69 74     .        writ
33f40 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68  eBuffer[0] = (ch
33f50 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
33f60 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d  RSION;.        m
33f70 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66 66  emcpy(&writeBuff
33f80 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  er[PROXY_HEADERL
33f90 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50  EN], myHostID, P
33fa0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
33fb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
33fc0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
33fd0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
33fe0 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69      strlcpy(&wri
33ff0 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
34000 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d  ATHINDEX], pCtx-
34010 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
34020 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
34030 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34040 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77        strlcpy(&w
34050 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
34060 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d  _PATHINDEX], tem
34070 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41  pLockPath, MAXPA
34080 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
34090 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 53  }.        writeS
340a0 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48  ize = PROXY_PATH
340b0 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26  INDEX + strlen(&
340c0 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
340d0 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20  Y_PATHINDEX]);. 
340e0 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66 74         robust_ft
340f0 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c  runcate(conchFil
34100 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29  e->h, writeSize)
34110 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  ;.        rc = u
34120 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74 65  nixWrite((sqlite
34130 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69  3_file *)conchFi
34140 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c  le, writeBuffer,
34150 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a   writeSize, 0);.
34160 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f          fsync(co
34170 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  nchFile->h);.   
34180 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72       /* If we cr
34190 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63  eated a new conc
341a0 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74  h file (not just
341b0 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e   updated the con
341c0 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20  tents of a .    
341d0 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f       ** valid co
341e0 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74  nch file), try t
341f0 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d  o match the perm
34200 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64  issions of the d
34210 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 20  atabase .       
34220 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
34230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
34240 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b  & createConch ){
34250 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
34260 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
34270 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
34280 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
34290 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  , &buf);.       
342a0 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b     if( err==0 ){
342b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64  .            mod
342c0 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66 2e  e_t cmode = buf.
342d0 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53 52  st_mode&(S_IRUSR
342e0 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52 47  |S_IWUSR | S_IRG
342f0 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20 20  RP|S_IWGRP |.   
34300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34320 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f 49       S_IROTH|S_I
34330 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20 20  WOTH);.         
34340 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61 74     /* try to mat
34350 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ch the database 
34360 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73 73  file R/W permiss
34370 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61 69  ions, ignore fai
34380 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  lure */.#ifndef 
34390 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
343a0 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  UG.            o
343b0 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c  sFchmod(conchFil
343c0 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23 65  e->h, cmode);.#e
343d0 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  lse.            
343e0 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  do{.            
343f0 20 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64 28    rc = osFchmod(
34400 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d  conchFile->h, cm
34410 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
34420 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28 2d    }while( rc==(-
34430 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  1) && errno==EIN
34440 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TR );.          
34450 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
34460 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
34470 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
34480 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72               fpr
34490 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
344a0 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77  hmod %o FAILED w
344b0 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ith %d %s\n",.  
344c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
344d0 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c      cmode, code,
344e0 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29   strerror(code))
344f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
34500 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
34510 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
34520 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
34530 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64  SUCCEDED\n",cmod
34540 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
34550 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
34560 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
34570 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  nt code = errno;
34580 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
34590 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54  intf(stderr, "ST
345a0 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69  AT FAILED[%d] wi
345b0 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20  th %d %s\n", .  
345c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345d0 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72    err, code, str
345e0 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65  error(code));.#e
345f0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d  ndif.          }
34600 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34610 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69   }.      conchFi
34620 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
34630 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
34640 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
34650 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
34660 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65     .    end_take
34670 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54  conch:.      OST
34680 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
34690 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c  Y: CLOSE  %d\n",
346a0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
346b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
346c0 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f  E_OK && pFile->o
346d0 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  penFlags ){.    
346e0 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
346f0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68      if( pFile->h
34700 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
34710 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
34720 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f  ile, pFile->h, _
34730 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
34740 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c    }.        pFil
34750 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  e->h = -1;.     
34760 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
34770 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68  pen(pCtx->dbPath
34780 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  , pFile->openFla
34790 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  gs, 0);.        
347a0 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
347b0 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e  ROXY: OPEN  %d\n
347c0 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20  ", fd));.       
347d0 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
347e0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
347f0 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d   = fd;.        }
34800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34810 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
34820 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49  EN_BKPT; /* SQLI
34830 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61  TE_BUSY? proxyTa
34840 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20  keConch called. 
34850 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67            during
34860 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
34870 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34880 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34890 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e  TE_OK && !pCtx->
348a0 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20  lockProxy ){.   
348b0 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20       char *path 
348c0 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f  = tempLockPath ?
348d0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20   tempLockPath : 
348e0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
348f0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ath;.        rc 
34900 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
34910 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74  xFile(path, &pCt
34920 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29  x->lockProxy, 1)
34930 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
34950 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
34960 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74  && tryOldLockPat
34970 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  h ){.          /
34980 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72  * we couldn't cr
34990 65 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c  eate the proxy l
349a0 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68  ock file with th
349b0 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20  e old lock file 
349c0 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  path.           
349d0 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20  ** so try again 
349e0 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20  via auto-naming 
349f0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
34a00 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65           forceNe
34a10 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20  wLockPath = 1;. 
34a20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c           tryOldL
34a30 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
34a40 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
34a50 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74   /* go back to t
34a60 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73  he do {} while s
34a70 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20  tart point, try 
34a80 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
34a90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
34aa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34ab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
34ac0 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20   Need to make a 
34ad0 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66 20  copy of path if 
34ae0 77 65 20 65 78 74 72 61 63 74 65 64 20 74 68 65  we extracted the
34af0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20   value.         
34b00 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63  ** from the conc
34b10 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61  h file or the pa
34b20 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  th was allocated
34b30 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20   on the stack.  
34b40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34b50 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61    if( tempLockPa
34b60 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
34b70 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
34b80 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
34b90 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63  trDup(0, tempLoc
34ba0 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  kPath);.        
34bb0 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
34bc0 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
34bd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
34be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
34bf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34c00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
34c10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34c20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
34c30 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
34c40 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
34c50 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
34c60 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
34c70 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
34c80 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  s ){.          a
34c90 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
34ca0 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20   *afpCtx;.      
34cb0 20 20 20 20 61 66 70 43 74 78 20 3d 20 28 61 66      afpCtx = (af
34cc0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
34cd0 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  *)pCtx->lockProx
34ce0 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  y->lockingContex
34cf0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  t;.          afp
34d00 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43  Ctx->dbPath = pC
34d10 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
34d20 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
34d30 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
34d40 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
34d50 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
34d60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
34d70 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
34d80 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
34d90 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
34da0 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
34db0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
34dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
34dd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22  ==SQLITE_OK?"ok"
34de0 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  :"failed"));.   
34df0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34e00 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f    } while (1); /
34e10 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65  * in case we nee
34e20 64 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a  d to retry the :
34e30 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20  auto: lock file 
34e40 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  - .             
34e50 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
34e60 20 6e 65 76 65 72 20 67 65 74 20 68 65 72 65 20   never get here 
34e70 65 78 63 65 70 74 20 76 69 61 20 74 68 65 20 27  except via the '
34e80 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20  continue' call. 
34e90 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  */.  }.}../*.** 
34ea0 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61  If pFile holds a
34eb0 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68   lock on a conch
34ec0 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65   file, then rele
34ed0 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a  ase that lock..*
34ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
34ef0 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75  xyReleaseConch(u
34f00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
34f10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
34f20 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
34f30 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74  * Subroutine ret
34f40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72  urn code */.  pr
34f50 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34f60 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65  t *pCtx;  /* The
34f70 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
34f80 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c   for the proxy l
34f90 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ock */.  unixFil
34fa0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20  e *conchFile;   
34fb0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
34fc0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
34fd0 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f  /..  pCtx = (pro
34fe0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
34ff0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
35000 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63  gContext;.  conc
35010 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
35020 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41  nchFile;.  OSTRA
35030 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43  CE(("RELEASECONC
35040 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  H  %d for %s pid
35050 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c  =%d\n", conchFil
35060 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
35070 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
35080 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f  yPath ? pCtx->lo
35090 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a  ckProxyPath : ":
350a0 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20  auto:"), .      
350b0 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
350c0 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
350d0 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
350e0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
350f0 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
35100 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
35110 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f  conchFile, NO_LO
35120 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d  CK);.  }.  pCtx-
35130 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
35140 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45    OSTRACE(("RELE
35150 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c  ASECONCH  %d %s\
35160 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
35170 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
35180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
35190 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29  k" : "failed")))
351a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
351b0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
351c0 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
351d0 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75  base file, compu
351e0 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69  te the name of i
351f0 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  ts conch file..*
35200 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63  * Store the conc
35210 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65  h filename in me
35220 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
35230 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
35240 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43  c()..** Make *pC
35250 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74  onchPath point t
35260 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20  o the new name. 
35270 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
35280 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
35290 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
352a0 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74  if unable to obt
352b0 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  ain memory..**.*
352c0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * The caller is 
352d0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
352e0 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
352f0 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  e allocated memo
35300 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65  ry.** space is e
35310 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e  ventually freed.
35320 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61  .**.** *pConchPa
35330 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  th is set to NUL
35340 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  L if a memory al
35350 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
35360 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
35370 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
35380 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68  ConchPathname(ch
35390 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72  ar *dbPath, char
353a0 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a   **pConchPath){.
353b0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
353c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353d0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
353e0 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28  */.  int len = (
353f0 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
35400 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66  h); /* Length of
35410 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
35420 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20  me - dbPath */. 
35430 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68   char *conchPath
35440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
35450 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63  * buffer in whic
35460 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63  h to construct c
35470 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  onch name */..  
35480 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
35490 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  e for the conch 
354a0 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69  filename and ini
354b0 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65  tialize the name
354c0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d   to.  ** the nam
354d0 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
354e0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
354f0 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50   */  .  *pConchP
35500 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20  ath = conchPath 
35510 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
35520 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38  3_malloc(len + 8
35530 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61  );.  if( conchPa
35540 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  th==0 ){.    ret
35550 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
35560 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63  ;.  }.  memcpy(c
35570 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68  onchPath, dbPath
35580 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f  , len+1);.  .  /
35590 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22  * now insert a "
355a0 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61  ." before the la
355b0 73 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a  st / character *
355c0 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d  /.  for( i=(len-
355d0 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b  1); i>=0; i-- ){
355e0 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61  .    if( conchPa
355f0 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[i]=='/' ){.  
35600 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62      i++;.      b
35610 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
35620 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27    conchPath[i]='
35630 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c  .';.  while ( i<
35640 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68  len ){.    conch
35650 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68  Path[i+1]=dbPath
35660 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  [i];.    i++;.  
35670 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74  }..  /* append t
35680 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66  he "-conch" suff
35690 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a  ix to the file *
356a0 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63  /.  memcpy(&conc
356b0 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f  hPath[i+1], "-co
356c0 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65  nch", 7);.  asse
356d0 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rt( (int)strlen(
356e0 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65  conchPath) == le
356f0 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  n+7 );..  return
35700 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
35710 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79  /* Takes a fully
35720 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78   configured prox
35730 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20  y locking-style 
35740 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77  unix file and sw
35750 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f  itches.** the lo
35760 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
35770 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th .*/.static in
35780 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  t switchLockProx
35790 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a  yPath(unixFile *
357a0 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  pFile, const cha
357b0 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f  r *path) {.  pro
357c0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
357d0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
357e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
357f0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35800 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c  text;.  char *ol
35810 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f  dPath = pCtx->lo
35820 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69  ckProxyPath;.  i
35830 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
35840 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  K;..  if( pFile-
35850 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
35860 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
35870 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
35880 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69   }  ..  /* nothi
35890 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20  ng to do if the 
358a0 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61  path is NULL, :a
358b0 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20  uto: or matches 
358c0 74 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74  the existing pat
358d0 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68  h */.  if( !path
358e0 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30   || path[0]=='\0
358f0 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74  ' || !strcmp(pat
35900 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a  h, ":auto:") ||.
35910 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20      (oldPath && 
35920 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68  !strncmp(oldPath
35930 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  , path, MAXPATHL
35940 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  EN)) ){.    retu
35950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
35960 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
35970 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d  ile *lockProxy =
35980 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
35990 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  ;.    pCtx->lock
359a0 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20  Proxy=NULL;.    
359b0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
359c0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  = 0;.    if( loc
359d0 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a  kProxy!=NULL ){.
359e0 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f        rc=lockPro
359f0 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
35a00 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
35a10 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  e *)lockProxy);.
35a20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
35a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
35a40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63  sqlite3_free(loc
35a50 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20  kProxy);.    }. 
35a60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
35a70 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43  oldPath);.    pC
35a80 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35a90 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
35aa0 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20  Dup(0, path);.  
35ab0 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  }.  .  return rc
35ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65  ;.}../*.** pFile
35ad0 20 69 73 20 61 20 66 69 6c 65 20 74 68 61 74 20   is a file that 
35ae0 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
35af0 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e  by a prior xOpen
35b00 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a   call.  dbPath.*
35b10 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75  * is a string bu
35b20 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41  ffer at least MA
35b30 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61  XPATHLEN+1 chara
35b40 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  cters in size..*
35b50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
35b60 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e  e find the filen
35b70 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ame associated w
35b80 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72  ith pFile and wr
35b90 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64  ites it.** int d
35ba0 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  bPath..*/.static
35bb0 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50   int proxyGetDbP
35bc0 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75  athForUnixFile(u
35bd0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
35be0 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23  char *dbPath){.#
35bf0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
35c00 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c  LE__).  if( pFil
35c10 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61  e->pMethod == &a
35c20 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
35c30 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20     /* afp style 
35c40 6b 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63  keeps a referenc
35c50 65 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68  e to the db path
35c60 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68   in the filePath
35c70 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f   field .    ** o
35c80 66 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a  f the struct */.
35c90 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74      assert( (int
35ca0 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70  )strlen((char*)p
35cb0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35cc0 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45  text)<=MAXPATHLE
35cd0 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79  N );.    strlcpy
35ce0 28 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f  (dbPath, ((afpLo
35cf0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
35d00 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35d10 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d  text)->dbPath, M
35d20 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20  AXPATHLEN);.  } 
35d30 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66  else.#endif.  if
35d40 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
35d50 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
35d60 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
35d70 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75  dot lock style u
35d80 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
35d90 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65  context to store
35da0 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20   the dot lock.  
35db0 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a    ** file path *
35dc0 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20  /.    int len = 
35dd0 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
35de0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35df0 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44  text) - strlen(D
35e00 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a  OTLOCK_SUFFIX);.
35e10 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74      memcpy(dbPat
35e20 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65  h, (char *)pFile
35e30 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
35e40 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65  , len + 1);.  }e
35e50 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20  lse{.    /* all 
35e60 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65  other styles use
35e70 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
35e80 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68  text to store th
35e90 65 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a  e db file path *
35ea0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74  /.    assert( st
35eb0 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c  rlen((char*)pFil
35ec0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
35ed0 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  t)<=MAXPATHLEN )
35ee0 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62  ;.    strlcpy(db
35ef0 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46  Path, (char *)pF
35f00 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
35f10 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ext, MAXPATHLEN)
35f20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
35f30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
35f40 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65  ** Takes an alre
35f50 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e  ady filled in un
35f60 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65  ix file and alte
35f70 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c  rs it so all fil
35f80 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69  e locking .** wi
35f90 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ll be performed 
35fa0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f  on the local pro
35fb0 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54  xy lock file.  T
35fc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
35fd0 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65  lds.** are prese
35fe0 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b  rved in the lock
35ff0 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74  ing context so t
36000 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
36010 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a  restored and .**
36020 20 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74   the unix struct
36030 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65  ure properly cle
36040 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65  aned up at close
36050 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63   time:.**  ->loc
36060 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20  kingContext.**  
36070 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61  ->pMethod.*/.sta
36080 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
36090 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
360a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
360b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
360c0 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
360d0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
360e0 0a 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d  .  char dbPath[M
360f0 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20  AXPATHLEN+1];   
36100 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
36110 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36120 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b   */.  char *lock
36130 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74  Path=NULL;.  int
36140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36150 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .  .  if( pFile-
36160 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
36170 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
36180 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
36190 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50   }.  proxyGetDbP
361a0 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70  athForUnixFile(p
361b0 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20  File, dbPath);. 
361c0 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61   if( !path || pa
361d0 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21  th[0]=='\0' || !
361e0 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61  strcmp(path, ":a
361f0 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f  uto:") ){.    lo
36200 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d  ckPath=NULL;.  }
36210 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61  else{.    lockPa
36220 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b  th=(char *)path;
36230 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43  .  }.  .  OSTRAC
36240 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20  E(("TRANSPROXY  
36250 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
36260 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
36270 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50            (lockP
36280 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a  ath ? lockPath :
36290 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70   ":auto:"), getp
362a0 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74 78 20  id()));..  pCtx 
362b0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
362c0 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20  ( sizeof(*pCtx) 
362d0 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30  );.  if( pCtx==0
362e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
362f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
36300 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20  .  memset(pCtx, 
36310 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  0, sizeof(*pCtx)
36320 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79  );..  rc = proxy
36330 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
36340 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70 43 74  ame(dbPath, &pCt
36350 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
36360 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
36370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
36380 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e   = proxyCreateUn
36390 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e  ixFile(pCtx->con
363a0 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74  chFilePath, &pCt
363b0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29  x->conchFile, 0)
363c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
363d0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26  LITE_CANTOPEN &&
363e0 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c   ((pFile->openFl
363f0 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30  ags&O_RDWR) == 0
36400 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  ) ){.      /* if
36410 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20 66 6c   (a) the open fl
36420 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44  ags are not O_RD
36430 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f 6e 63  WR, (b) the conc
36440 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c 20 61  h isn't there, a
36450 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63 29 20  nd.      ** (c) 
36460 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
36470 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68  is read-only, th
36480 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63  en enable no-loc
36490 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20 20 20  king access..   
364a0 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65     ** Ugh, since
364b0 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30   O_RDONLY==0x000
364c0 30 20 77 65 20 74 65 73 74 20 66 6f 72 20 21 4f  0 we test for !O
364d0 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e 69 78  _RDWR since unix
364e0 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20 20 20  Open asserts.   
364f0 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46     ** that openF
36500 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65 20 6f  lags will have o
36510 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f  nly one of O_RDO
36520 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20  NLY or O_RDWR.. 
36530 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
36540 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
36550 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
36560 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b   stat conchInfo;
36570 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63  .      int goLoc
36580 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20  kless = 0;..    
36590 20 20 69 66 28 20 6f 73 53 74 61 74 28 70 43 74    if( osStat(pCt
365a0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
365b0 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d  , &conchInfo) ==
365c0 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20   -1 ) {.        
365d0 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
365e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 72  .        if( (er
365f0 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73  r==ENOENT) && (s
36600 74 61 74 66 73 28 64 62 50 61 74 68 2c 20 26 66  tatfs(dbPath, &f
36610 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b  sInfo) != -1) ){
36620 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63  .          goLoc
36630 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e  kless = (fsInfo.
36640 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e  f_flags&MNT_RDON
36650 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c  LY) == MNT_RDONL
36660 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
36670 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67     }.      if( g
36680 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20  oLockless ){.   
36690 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
366a0 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65  Held = -1; /* re
366b0 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b  ad only FS/ lock
366c0 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  less */.        
366d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
366e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
366f0 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }  .  if( rc==SQ
36700 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50  LITE_OK && lockP
36710 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d  ath ){.    pCtx-
36720 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
36730 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
36740 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  (0, lockPath);. 
36750 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
36760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
36770 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71  Ctx->dbPath = sq
36780 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
36790 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66   dbPath);.    if
367a0 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d  ( pCtx->dbPath==
367b0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
367c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
367d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
367e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
367f0 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d  {.    /* all mem
36800 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
36810 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63 72 65  , proxys are cre
36820 61 74 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65  ated and assigne
36830 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63  d, .    ** switc
36840 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  h the locking co
36850 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f  ntext and pMetho
36860 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20  d then return.. 
36870 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e     */.    pCtx->
36880 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
36890 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t = pFile->locki
368a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
368b0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
368c0 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20  text = pCtx;.   
368d0 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f   pCtx->pOldMetho
368e0 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  d = pFile->pMeth
368f0 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  od;.    pFile->p
36900 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49  Method = &proxyI
36910 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
36920 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  e{.    if( pCtx-
36930 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20  >conchFile ){ . 
36940 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
36950 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36960 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
36970 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63  ile *)pCtx->conc
36980 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  hFile);.      sq
36990 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d  lite3_free(pCtx-
369a0 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
369b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
369c0 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f  Free(0, pCtx->lo
369d0 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  ckProxyPath);.  
369e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
369f0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
36a00 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65  th); .    sqlite
36a10 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20  3_free(pCtx);.  
36a20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  }.  OSTRACE(("TR
36a30 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c  ANSPROXY  %d %s\
36a40 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
36a50 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
36a60 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
36a70 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20   "failed")));.  
36a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
36a90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
36aa0 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65  e handles sqlite
36ab0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29  3_file_control()
36ac0 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20   calls that are 
36ad0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70  specific.** to p
36ae0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  roxy locking..*/
36af0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
36b00 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
36b10 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
36b20 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
36b30 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  g){.  switch( op
36b40 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
36b50 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
36b60 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75  YFILE: {.      u
36b70 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
36b80 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
36b90 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
36ba0 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f  >pMethod == &pro
36bb0 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  xyIoMethods ){. 
36bc0 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b         proxyLock
36bd0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
36be0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
36bf0 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e  Context*)pFile->
36c00 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
36c10 20 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b          proxyTak
36c20 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
36c30 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
36c40 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
36c50 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
36c60 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
36c70 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
36c80 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
36c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36ca0 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
36cb0 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20  )pArg = ":auto: 
36cc0 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20  (not held)";.   
36cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65       }.      } e
36ce0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28  lse {.        *(
36cf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
36d00 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  rg = NULL;.     
36d10 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
36d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
36d30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
36d40 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
36d50 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  LE: {.      unix
36d60 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
36d70 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
36d80 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
36d90 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74  TE_OK;.      int
36da0 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20   isProxyStyle = 
36db0 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20  (pFile->pMethod 
36dc0 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f  == &proxyIoMetho
36dd0 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ds);.      if( p
36de0 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f  Arg==NULL || (co
36df0 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d  nst char *)pArg=
36e00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
36e10 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29  ( isProxyStyle )
36e20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
36e30 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f  urn off proxy lo
36e40 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70  cking - not supp
36e50 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  orted */.       
36e60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
36e70 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52  RROR /*SQLITE_PR
36e80 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d  OTOCOL? SQLITE_M
36e90 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20  ISUSE?*/;.      
36ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36eb0 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70     /* turn off p
36ec0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61  roxy locking - a
36ed0 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f  lready off - NOO
36ee0 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  P */.          r
36ef0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36f00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
36f20 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50  nst char *proxyP
36f30 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
36f40 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  r *)pArg;.      
36f50 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
36f60 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
36f70 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36f80 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20  ext *pCtx = .   
36f90 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c           (proxyL
36fa0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
36fb0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
36fc0 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
36fd0 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67  if( !strcmp(pArg
36fe0 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20  , ":auto:") .   
36ff0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78          || (pCtx
37000 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
37010 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
37020 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d    !strncmp(pCtx-
37030 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
37040 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41  proxyPath, MAXPA
37050 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20  THLEN)).        
37060 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
37070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37080 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
37090 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
370a0 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f   = switchLockPro
370b0 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72  xyPath(pFile, pr
370c0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20  oxyPath);.      
370d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
370e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
370f0 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20  * turn on proxy 
37100 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  file locking */.
37110 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
37120 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
37130 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f  xFile(pFile, pro
37140 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
37150 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
37160 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37170 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
37180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
37190 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c   );  /* The call
371a0 20 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e   assures that on
371b0 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73  ly valid opcodes
371c0 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20   are sent */.   
371d0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
371e0 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e  ACHED*/.  return
371f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
37200 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ../*.** Within t
37210 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68  his division (th
37220 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69  e proxying locki
37230 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
37240 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  n) the procedure
37250 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20  s.** above this 
37260 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74  point are all ut
37270 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f  ilities.  The lo
37280 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f  ck-related metho
37290 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f  ds of the.** pro
372a0 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  xy-locking sqlit
372b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a  e3_io_method obj
372c0 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a  ect follow..*/..
372d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
372e0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
372f0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
37300 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
37310 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
37320 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
37330 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
37340 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
37350 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
37360 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
37370 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
37380 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
37390 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
373a0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
373b0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
373c0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
373d0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
373e0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
373f0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
37400 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
37410 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
37420 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
37430 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
37440 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
37450 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
37460 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
37470 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
37480 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
37490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
374a0 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
374b0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
374c0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
374d0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
374e0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
374f0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
37500 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  Held>0 ){.      
37510 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
37520 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
37530 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  y;.      return 
37540 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
37550 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
37560 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
37570 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74  *)proxy, pResOut
37580 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a  );.    }else{ /*
37590 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69   conchHeld < 0 i
375a0 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  s lockless */.  
375b0 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20      pResOut=0;. 
375c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
375d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
375e0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
375f0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
37600 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
37610 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
37620 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
37630 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
37640 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
37650 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
37660 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
37670 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
37680 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
37690 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
376a0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
376b0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
376c0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
376d0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
376e0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
376f0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
37700 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
37710 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
37720 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
37730 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
37740 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
37750 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
37760 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
37770 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
37780 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
37790 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
377a0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
377b0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
377c0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
377d0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
377e0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
377f0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
37800 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
37810 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
37820 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
37830 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
37840 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
37850 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
37860 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
37870 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
37880 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
37890 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
378a0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
378b0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
378c0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
378d0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
378e0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
378f0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
37900 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
37910 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
37920 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
37930 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
37940 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
37950 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
37960 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
37970 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
37980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37990 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
379a0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
379b0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
379c0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
379d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
379e0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
379f0 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
37a00 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
37a10 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
37a20 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  oxy;.      rc = 
37a30 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
37a40 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
37a50 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c  ile*)proxy, eFil
37a60 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46  eLock);.      pF
37a70 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
37a80 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63   proxy->eFileLoc
37a90 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
37aa0 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64      /* conchHeld
37ab0 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
37ac0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
37ad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
37ae0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
37af0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
37b00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
37b10 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
37b20 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
37b30 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
37b40 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
37b50 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
37b60 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
37b70 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
37b80 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
37b90 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
37ba0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
37bb0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
37bc0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
37bd0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
37be0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
37bf0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
37c00 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
37c10 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
37c20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
37c30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
37c40 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
37c50 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
37c60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37c70 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
37c80 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
37c90 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
37ca0 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
37cb0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
37cc0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
37cd0 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
37ce0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
37cf0 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
37d00 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63  kProxy;.      rc
37d10 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f   = proxy->pMetho
37d20 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
37d30 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
37d40 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
37d50 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
37d60 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69  ock = proxy->eFi
37d70 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  leLock;.    }els
37d80 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
37d90 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
37da0 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
37db0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
37dd0 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20   file that uses 
37de0 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  proxy locks..*/.
37df0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
37e00 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
37e10 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
37e20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
37e30 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
37e40 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70  xFile*)id;.    p
37e50 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
37e60 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
37e70 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37e80 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
37e90 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
37ea0 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
37eb0 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
37ec0 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xy;.    unixFile
37ed0 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
37ee0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
37ef0 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
37f00 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20  TE_OK;.    .    
37f10 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  if( lockProxy ){
37f20 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
37f30 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
37f40 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
37f50 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
37f60 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
37f70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37f80 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
37f90 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
37fa0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
37fb0 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
37fc0 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
37fd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
37fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
37ff0 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
38000 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
38010 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d  Proxy = 0;.    }
38020 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69  .    if( conchFi
38030 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
38040 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
38050 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38060 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
38070 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
38080 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
38090 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
380a0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
380b0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
380c0 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
380d0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  e*)conchFile);. 
380e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
380f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
38100 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63  qlite3_free(conc
38110 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
38120 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
38130 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  0, pCtx->lockPro
38140 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  xyPath);.    sql
38150 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
38160 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
38170 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
38180 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50 61 74  e(0, pCtx->dbPat
38190 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f  h);.    /* resto
381a0 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
381b0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
381c0 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
381d0 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20   close it */.   
381e0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
381f0 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f  ontext = pCtx->o
38200 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
38210 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
38220 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c  thod = pCtx->pOl
38230 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c  dMethod;.    sql
38240 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
38250 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c  .    return pFil
38260 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
38270 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  se(id);.  }.  re
38280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
38290 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  }....#endif /* d
382a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
382b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
382c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
382d0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72   */./*.** The pr
382e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  oxy locking styl
382f0 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
38300 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66  r use with AFP f
38310 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41  ilesystems..** A
38320 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20  nd since AFP is 
38330 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
38340 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72  n MacOSX, the pr
38350 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
38360 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65  lso.** restricte
38370 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20  d to MacOSX..** 
38380 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
38390 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
383a0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d  he proxy lock im
383b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
383c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
383d0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
383e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
383f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
38420 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  **/../*.** Initi
38430 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
38440 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
38450 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  face..**.** This
38460 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
38470 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65  rs all VFS imple
38480 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75  mentations for u
38490 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69  nix-like operati
384a0 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
384b0 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e  This routine, an
384c0 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73  d the sqlite3_os
384d0 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74  _end() routine t
384e0 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20  hat follows,.** 
384f0 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
38500 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ly routines in t
38510 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72  his file that ar
38520 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
38530 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  ther.** files..*
38540 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
38550 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
38560 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69   during SQLite i
38570 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e  nitialization an
38580 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  d by a.** single
38590 20 74 68 72 65 61 64 2e 20 20 54