/ Hex Artifact Content
Login

Artifact 2c67d126874b78eb427371db4793f0e8fbc7448b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
12c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
12d0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
12e0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
12f0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1300: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1310: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1320: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1330: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1340: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1350: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1360: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1370: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1380: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1390: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
13a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
13b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
13c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1410: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1420: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1430: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1440: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1450: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1460: 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  *. ** Default pe
1470: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1480: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1490: 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64  xy dir. */.#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
14c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1500: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1510: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1520: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1530: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1540: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1550: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1560: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1570: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1580: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1590: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
15a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
15b0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
15c0: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
15d0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
15e0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
15f0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1600: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1610: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1620: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1640: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1650: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1660: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1670: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1690: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
16a0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
16b0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
16e0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
16f0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1700: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1710: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1720: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1730: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1740: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1750: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1760: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1770: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1780: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1790: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
17a0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
17b0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
17c0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
17d0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
17e0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
17f0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1800: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1810: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1820: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1830: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1840: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1850: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1860: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1870: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
18a0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
18b0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18d0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
18e0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
18f0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1900: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1910: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1920: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1930: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1940: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1950: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1960: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1970: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1980: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1990: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
19a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
19b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
19d0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
19e0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
19f0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1a00: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1a10: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1a20: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69  t entry */.  uni
1a30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1a50: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
1a60: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
1a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ab0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
1ac0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1af0: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1b00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b10: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b30: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b40: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b60: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b70: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b80: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b90: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1ba0: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bd0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1be0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bf0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1c00: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1c10: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c20: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c30: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c40: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c70: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c90: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1ca0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1cb0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cc0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cf0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1d00: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d10: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d40: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d50: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d70: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d80: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1da0: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1db0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1dc0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dd0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1de0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1df0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1e00: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e30: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e50: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e60: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e90: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1ea0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1eb0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ec0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ed0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ee0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ef0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1f00: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f10: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f20: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f30: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f40: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f50: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f70: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f80: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f90: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1fa0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fb0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fc0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fd0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fe0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1ff0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2000: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2010: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2020: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2030: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2040: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2050: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2060: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2070: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2080: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2090: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
20a0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20b0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20c0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20d0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20e0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20f0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2100: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2110: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2120: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2130: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2140: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2150: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2160: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2170: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2180: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2190: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
21a0: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21b0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21c0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21e0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21f0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
2200: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2210: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2220: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2230: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2240: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2250: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2260: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2270: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 30  NIXFILE_EXCL   0
2280: 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x01     /* Conne
2290: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20  ctions from one 
22a0: 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a  process only */.
22b0: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
22c0: 5f 52 44 4f 4e 4c 59 20 30 78 30 32 20 20 20 20  _RDONLY 0x02    
22d0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
22e0: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 0a  s read only */..
22f0: 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f  /*.** Include co
2300: 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f  de that is commo
2310: 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20  n to all os_*.c 
2320: 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64  files.*/.#includ
2330: 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a  e "os_common.h".
2340: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61  ./*.** Define va
2350: 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61  rious macros tha
2360: 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72  t are missing fr
2370: 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e  om some systems.
2380: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41  .*/.#ifndef O_LA
2390: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
23a0: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
23b0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
23c0: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
23d0: 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  # undef O_LARGEF
23e0: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
23f0: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
2400: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f  f.#ifndef O_NOFO
2410: 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f  LLOW.# define O_
2420: 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69  NOFOLLOW 0.#endi
2430: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41  f.#ifndef O_BINA
2440: 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49  RY.# define O_BI
2450: 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  NARY 0.#endif../
2460: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
2470: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
2480: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
2490: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
24a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
24b0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
24c0: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
24d0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
24e0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
24f0: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
2500: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
2510: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
2520: 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e  .** Different Un
2530: 69 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61  ix systems decla
2540: 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66  re open() in dif
2550: 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61  ferent ways.  Sa
2560: 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63  me use.** open(c
2570: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d  onst char*,int,m
2580: 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20  ode_t).  Others 
2590: 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  use open(const c
25a0: 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a  har*,int,...)..*
25b0: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
25c0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68   is important wh
25d0: 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74  en using a point
25e0: 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  er to the functi
25f0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  on..**.** The sa
2600: 66 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c  fest way to deal
2610: 20 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65   with the proble
2620: 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75  m is to always u
2630: 73 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a  se this wrapper.
2640: 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ** which always 
2650: 68 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c  has the same wel
2660: 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66  l-defined interf
2670: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
2680: 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e  nt posixOpen(con
2690: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
26a0: 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d  int flags, int m
26b0: 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  ode){.  return o
26c0: 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73  pen(zFile, flags
26d0: 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , mode);.}../*.*
26e0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
26f0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2700: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2710: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2720: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2730: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2740: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2750: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2760: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2770: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2780: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2790: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
27a0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
27b0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
27c0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
27d0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
27e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
27f0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2800: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2810: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2820: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2830: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2840: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2850: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2860: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2870: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2880: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2890: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
28a0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
28b0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
28c0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
28d0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
28e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
28f0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2900: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2910: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2920: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2930: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2940: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2950: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2960: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2970: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2980: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2990: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
29a0: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
29b0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
29c0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
29d0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
29e0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
29f0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2a00: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2a10: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2a20: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2a30: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2a40: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2a50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2a60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2a70: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2a80: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2a90: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2aa0: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2ab0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2ac0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2ad0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2ae0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2af0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2b00: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2b10: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2b20: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2b30: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2b40: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2b50: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2b60: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2b70: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2b80: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2b90: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2ba0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2bb0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2bc0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2bd0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2be0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2bf0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2c00: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2c10: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2c20: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2c30: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2c40: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2c50: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
2c60: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2c70: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2c80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
2c90: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
2ca0: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
2cb0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
2cc0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2cd0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
2ce0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
2cf0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
2d00: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2d10: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
2d20: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2d30: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
2d40: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
2d50: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2d60: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
2d70: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2d80: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
2d90: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
2da0: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
2db0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
2dc0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
2dd0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2de0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
2df0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
2e00: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
2e10: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
2e20: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
2e30: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
2e40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2e50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
2e60: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2e70: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
2e80: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
2e90: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
2ea0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2eb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2ec0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
2ed0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2ee0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2ef0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
2f00: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2f10: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
2f20: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
2f30: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
2f40: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2f50: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
2f60: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
2f70: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
2f80: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
2f90: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
2fa0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
2fb0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
2fc0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
2fd0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
2fe0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
2ff0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3000: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3010: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3020: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3030: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3040: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3050: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3060: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3070: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3080: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3090: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
30a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
30b0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
30c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
30d0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
30e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
30f0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
3100: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3110: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3120: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3130: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3140: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3150: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3160: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3170: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3180: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3190: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
31a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
31b0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
31c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
31d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
31e0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
31f0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3200: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3210: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3220: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3230: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3240: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3250: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3260: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3270: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3280: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3290: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
32a0: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
32b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
32c0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
32d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
32f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3300: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3310: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3320: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3330: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3360: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3370: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3380: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3390: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
33a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
33b0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
33c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
33d0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
33e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3400: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3410: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3420: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3430: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3440: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3450: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3460: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3470: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3480: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3490: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
34a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
34b0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
34c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
34d0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
34e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
34f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3500: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3510: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3520: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3530: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3540: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3550: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
3560: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
3570: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
3580: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
3590: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
35a0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
35b0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
35c0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
35d0: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
35e0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
35f0: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
3600: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
3610: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
3620: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
3630: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
3640: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
3650: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
3660: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
3670: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
3680: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
3690: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
36a0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
36b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
36c0: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
36d0: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
36e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
36f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3700: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
3710: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
3720: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3730: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
3740: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
3750: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
3760: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
3770: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
3780: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
3790: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
37a0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
37b0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
37c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
37d0: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
37e0: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
37f0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
3800: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
3810: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
3820: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
3830: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
3840: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
3850: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3860: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
3870: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
3880: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
3890: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
38a0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
38b0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
38c0: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
38d0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
38e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
38f0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
3900: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
3910: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
3920: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
3930: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
3940: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
3950: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
3960: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
3970: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
3980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
3990: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
39a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
39b0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
39c0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
39d0: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
39e0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
39f0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
3a00: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3a10: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
3a20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
3a30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
3a40: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
3a50: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
3a60: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
3a70: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
3a80: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
3a90: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
3aa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3ab0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3ac0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3ad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
3ae0: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
3af0: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
3b00: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
3b10: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
3b20: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
3b30: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
3b40: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
3b50: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
3b60: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
3b70: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
3b80: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
3b90: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
3ba0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
3bb0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
3bc0: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
3bd0: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
3be0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
3bf0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
3c00: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
3c10: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
3c20: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
3c30: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
3c40: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
3c50: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
3c60: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
3c70: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
3c80: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
3c90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3cb0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
3cc0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
3cd0: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
3ce0: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
3cf0: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
3d00: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
3d10: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
3d20: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
3d30: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
3d40: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
3d50: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
3d60: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
3d70: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
3d80: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
3d90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3da0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
3db0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
3dc0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
3dd0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
3de0: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
3df0: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
3e00: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
3e10: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
3e20: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
3e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
3e40: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
3e50: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
3e60: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
3e70: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
3e80: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
3e90: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
3ea0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
3eb0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
3ec0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
3ed0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
3ee0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3ef0: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65 6e  /*.** Retry open
3f00: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
3f10: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
3f20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
3f30: 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  bust_open(const 
3f40: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20  char *z, int f, 
3f50: 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72 63  int m){.  int rc
3f60: 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 4f  ;.  do{ rc = osO
3f70: 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69  pen(z,f,m); }whi
3f80: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
3f90: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
3fa0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3fb0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
3fc0: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
3fd0: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
3fe0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
3ff0: 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
4000: 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
4010: 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f  tect the unixIno
4020: 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78  deInfo and.** vx
4030: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
4040: 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73  cts used by this
4050: 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
4060: 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73  ich may be .** s
4070: 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
4080: 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
4090: 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75   Function unixMu
40a0: 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
40b0: 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
40c0: 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
40d0: 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
40e0: 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
40f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4100: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
4110: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
4120: 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
4130: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45  g..**.**   unixE
4140: 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
4150: 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d     assert( unixM
4160: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
4170: 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76     unixEnterLeav
4180: 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e().*/.static vo
4190: 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  id unixEnterMute
41a0: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
41b0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
41c0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
41d0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
41e0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
41f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
4200: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
4210: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
4220: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
4230: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
4240: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
4250: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
4260: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
4270: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
4280: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
4290: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
42a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
42b0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
42c0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
42d0: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
42e0: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
42f0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
4300: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
4310: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
4320: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
4330: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
4340: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
4350: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
4360: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
4370: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
4380: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
4390: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
43a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
43b0: 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74   *azFileLock(int
43c0: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73   eFileLock){.  s
43d0: 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b  witch( eFileLock
43e0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f   ){.    case NO_
43f0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
4400: 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48  NE";.    case SH
4410: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
4420: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20  n "SHARED";.    
4430: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
4440: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
4450: 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  RVED";.    case 
4460: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
4470: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
4480: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
4490: 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  VE_LOCK: return 
44a0: 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d  "EXCLUSIVE";.  }
44b0: 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52  .  return "ERROR
44c0: 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ";.}.#endif..#if
44d0: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
44e0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
44f0: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
4500: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
4510: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
4520: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4530: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
4540: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
4550: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
4560: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
4570: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
4580: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
4590: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
45a0: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
45b0: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
45c0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
45d0: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
45e0: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f  ally.** turned o
45f0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
4600: 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20  t lockTrace(int 
4610: 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75  fd, int op, stru
4620: 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20  ct flock *p){.  
4630: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a  char *zOpName, *
4640: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a  zType;.  int s;.
4650: 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f    int savedErrno
4660: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45  ;.  if( op==F_GE
4670: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
4680: 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20  me = "GETLK";.  
4690: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f  }else if( op==F_
46a0: 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  SETLK ){.    zOp
46b0: 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a  Name = "SETLK";.
46c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d    }else{.    s =
46d0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
46e0: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
46f0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
4700: 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64  tl unknown %d %d
4710: 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20   %d\n", fd, op, 
4720: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  s);.    return s
4730: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c  ;.  }.  if( p->l
4740: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
4750: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52  {.    zType = "R
4760: 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  DLCK";.  }else i
4770: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
4780: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  WRLCK ){.    zTy
4790: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
47a0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
47b0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
47c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
47d0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK";.  }else{.  
47e0: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
47f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
4800: 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53  l_whence==SEEK_S
4810: 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63  ET );.  s = osFc
4820: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
4830: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
4840: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
4850: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
4860: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
4870: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
4880: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
4890: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
48a0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
48b0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
48c0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
48d0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
48e0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
48f0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
4900: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
4910: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
4920: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
4930: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
4940: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46  l2 = *p;.    osF
4950: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
4960: 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20  , &l2);.    if( 
4970: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  l2.l_type==F_RDL
4980: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4990: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20  e = "RDLCK";.   
49a0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
49b0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
49c0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
49d0: 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  WRLCK";.    }els
49e0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
49f0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
4a00: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
4a10: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
4a20: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
4a30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4a40: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
4a50: 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61  cntl-failure-rea
4a60: 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64  son: %s %d %d %d
4a70: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70  \n",.       zTyp
4a80: 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61  e, (int)l2.l_sta
4a90: 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65  rt, (int)l2.l_le
4aa0: 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64  n, (int)l2.l_pid
4ab0: 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d  );.  }.  errno =
4ac0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72   savedErrno;.  r
4ad0: 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65  eturn s;.}.#unde
4ae0: 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e  f osFcntl.#defin
4af0: 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72  e osFcntl lockTr
4b00: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
4b10: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
4b20: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  */../*.** Retry 
4b30: 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  ftruncate() call
4b40: 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20  s that fail due 
4b50: 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74  to EINTR.*/.stat
4b60: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
4b70: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
4b80: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
4b90: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
4ba0: 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61  { rc = osFtrunca
4bb0: 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65  te(h,sz); }while
4bc0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
4bd0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
4be0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4bf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
4c00: 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61  nslates a standa
4c10: 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63  rd POSIX errno c
4c20: 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69  ode into somethi
4c30: 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20  ng.** useful to 
4c40: 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74  the clients of t
4c50: 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74  he sqlite3 funct
4c60: 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61  ions.  Specifica
4c70: 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e  lly, it is.** in
4c80: 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c  tended to transl
4c90: 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66  ate a variety of
4ca0: 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72   "try again" err
4cb0: 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f  ors into SQLITE_
4cc0: 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61  BUSY.** and a va
4cd0: 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65  riety of "please
4ce0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
4cf0: 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20  descriptor NOW" 
4d00: 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20  errors into .** 
4d10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20  SQLITE_IOERR.** 
4d20: 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e  .** Errors durin
4d30: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
4d40: 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69   of locks, or fi
4d50: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
4d60: 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t for locks,.** 
4d70: 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e  should handle EN
4d80: 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45  OLCK, ENOTSUP, E
4d90: 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61  OPNOTSUPP separa
4da0: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
4db0: 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46  int sqliteErrorF
4dc0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  romPosixError(in
4dd0: 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e  t posixError, in
4de0: 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b  t sqliteIOErr) {
4df0: 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78  .  switch (posix
4e00: 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20  Error) {.#if 0. 
4e10: 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
4e20: 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e   this code was n
4e30: 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74  ot commented out
4e40: 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69  . In theory, thi
4e50: 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68  s branch.  ** sh
4e60: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69  ould never be hi
4e70: 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  t, as this funct
4e80: 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ion should only 
4e90: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a  be called after.
4ea0: 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72    ** a locking-r
4eb0: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  elated function 
4ec0: 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68  (i.e. fcntl()) h
4ed0: 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d  as returned non-
4ee0: 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74  zero with.  ** t
4ef0: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e  he value of errn
4f00: 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  o as the first a
4f10: 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61  rgument. Since a
4f20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73   system call has
4f30: 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72   failed,.  ** er
4f40: 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  rno should be no
4f50: 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  n-zero..  **.  *
4f60: 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20  * Despite this, 
4f70: 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20  if errno really 
4f80: 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c  is zero, we stil
4f90: 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  l don't want to 
4fa0: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
4fb0: 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65  TE_OK. The syste
4fc0: 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61  m call failed, a
4fd0: 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65  nd *some* SQLite
4fe0: 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65   error should be
4ff0: 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64  .  ** propagated
5000: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c   back to the cal
5010: 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20  ler. Commenting 
5020: 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20  this branch out 
5030: 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20  means errno==0. 
5040: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64   ** will be hand
5050: 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61  led by the "defa
5060: 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77  ult:" case below
5070: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a  ..  */.  case 0:
5080: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
5090: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
50a0: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
50b0: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
50c0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
50d0: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
50e0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
50f0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
5100: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
5110: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
5120: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
5130: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
5140: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
5150: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
5160: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
5170: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5180: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
5190: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
51a0: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
51b0: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
51c0: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
51d0: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
51e0: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
51f0: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
5200: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
5210: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28  ERR_LOCK) || ..(
5220: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5230: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
5240: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
5250: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5260: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c  IOERR_RDLOCK) ||
5270: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
5280: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
5290: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
52a0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
52b0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
52c0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
52d0: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
52e0: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
52f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5300: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 2f  E_PERM;.    .  /
5310: 2a 20 45 44 45 41 44 4c 4b 20 69 73 20 6f 6e 6c  * EDEADLK is onl
5320: 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 61 20  y possible if a 
5330: 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c 28 46 5f  call to fcntl(F_
5340: 53 45 54 4c 4b 57 29 20 69 73 20 6d 61 64 65 2e  SETLKW) is made.
5350: 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d   And.  ** this m
5360: 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d 61 6b 65  odule never make
5370: 73 20 73 75 63 68 20 61 20 63 61 6c 6c 2e 20 41  s such a call. A
5380: 6e 64 20 74 68 65 20 63 6f 64 65 20 69 6e 20 53  nd the code in S
5390: 51 4c 69 74 65 20 69 74 73 65 6c 66 20 0a 20 20  QLite itself .  
53a0: 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
53b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
53c0: 43 4b 45 44 20 69 73 20 6e 65 76 65 72 20 72 65  CKED is never re
53d0: 74 75 72 6e 65 64 2e 20 46 6f 72 20 74 68 65 73  turned. For thes
53e0: 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a 2a 20 74  e reasons.  ** t
53f0: 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
5400: 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20   commented out. 
5410: 49 66 20 74 68 65 20 73 79 73 74 65 6d 20 64 6f  If the system do
5420: 65 73 20 73 65 74 20 65 72 72 6e 6f 20 74 6f 20  es set errno to 
5430: 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68  EDEADLK,.  ** th
5440: 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45  e default SQLITE
5450: 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f 64 65 20  _IOERR_XXX code 
5460: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5470: 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 63 61 73  . */.#if 0.  cas
5480: 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20 72  e EDEADLK:.    r
5490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
54a0: 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64  RR_BLOCKED;.#end
54b0: 69 66 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  if.    .#if EOPN
54c0: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
54d0: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
54e0: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
54f0: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
5500: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
5510: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
5520: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
5530: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
5540: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
5550: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
5560: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
5570: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
5580: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
5590: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
55a0: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
55b0: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
55c0: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
55d0: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
55e0: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
55f0: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
5600: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
5610: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
5620: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
5630: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
5640: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
5650: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
5660: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
5670: 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20 45  ENOENT:.  case E
5680: 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e  STALE:.  case EN
5690: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
56a0: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
56b0: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
56c0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
56d0: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
56e0: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
56f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
5700: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a  IOErr;.  }.}....
5710: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
5720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
5760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5770: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
5780: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
5790: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
57b0: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
57c0: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
57d0: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
57e0: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
57f0: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
5800: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
5810: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
5820: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
5830: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
5840: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
5850: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
5860: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
5870: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
5880: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
5890: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
58a0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
58b0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
58c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
58d0: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
58e0: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
58f0: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
5900: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
5910: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
5920: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
5930: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
5940: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
5950: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
5960: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
5970: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
5980: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
5990: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
59a0: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
59b0: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
59c0: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
59d0: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
59e0: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
59f0: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
5a00: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
5a10: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
5a20: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
5a30: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
5a40: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
5a50: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
5a60: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
5a70: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
5a80: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
5a90: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
5aa0: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
5ab0: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
5ac0: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
5ad0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
5b00: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
5b10: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
5b20: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
5b30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
5b40: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
5b50: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
5b60: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
5b70: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
5b80: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
5b90: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
5ba0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
5bb0: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
5bc0: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
5bd0: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
5be0: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
5bf0: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
5c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
5c10: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
5c20: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
5c30: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
5c40: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
5c50: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
5c60: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
5c70: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
5c80: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
5c90: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
5ca0: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
5cb0: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
5cc0: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
5cd0: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
5ce0: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
5cf0: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
5d00: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
5d10: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
5d20: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
5d30: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
5d40: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
5d50: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
5d60: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
5d70: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
5d80: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
5d90: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
5da0: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
5db0: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
5dc0: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
5dd0: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
5de0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
5df0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
5e00: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
5e10: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
5e20: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
5e30: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
5e40: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
5e50: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
5e60: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
5e70: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
5e80: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
5e90: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
5ea0: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
5eb0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
5ec0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
5ed0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
5ee0: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
5ef0: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
5f00: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
5f10: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
5f20: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
5f30: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
5f40: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
5f50: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
5f60: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
5f70: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
5f80: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
5f90: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
5fa0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
5fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
5fc0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
5fd0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
5fe0: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
5ff0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
6000: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
6010: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
6020: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
6030: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
6040: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
6050: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
6060: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
6070: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
6080: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
6090: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
60a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
60b0: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
60c0: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
60d0: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
60e0: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
60f0: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
6100: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
6110: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6120: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
6130: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
6140: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
6150: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
6160: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
6170: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
6180: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
6190: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
61a0: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
61b0: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
61c0: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
61d0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
61e0: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
61f0: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
6200: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
6210: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
6220: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6250: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
6260: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
6270: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
6280: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
6290: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
62a0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
62b0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
62c0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
62d0: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
62e0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
62f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
6300: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
6310: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
6320: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
6330: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6340: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
6350: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
6360: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
6370: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
6380: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
6390: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
63a0: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
63b0: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
63c0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
63d0: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
63e0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
63f0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
6400: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
6410: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
6420: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
6430: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
6440: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
6450: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
6460: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
6470: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
6480: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
6490: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
64a0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
64b0: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
64c0: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
64d0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
64e0: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
64f0: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
6500: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
6510: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
6520: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
6530: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
6540: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
6550: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
6560: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
6570: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
6580: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
6590: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
65a0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
65b0: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
65c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
65d0: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
65e0: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
65f0: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
6600: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
6610: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
6620: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
6630: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
6640: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
6650: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
6660: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6670: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
6680: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
6690: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
66a0: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
66b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
66c0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
66d0: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
66e0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
66f0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
6700: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
6710: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
6720: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
6730: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
6740: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
6750: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
6760: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
6770: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
6780: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
6790: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
67a0: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
67b0: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
67c0: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
67d0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
67e0: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
67f0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
6800: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
6810: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
6820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
6830: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
6840: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
6850: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
6860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
68c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
68d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
6930: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
6940: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
6950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6960: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
6970: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
6980: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
6990: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
69a0: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
69b0: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
69c0: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
69d0: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
69e0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
69f0: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
6a00: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
6a10: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
6a20: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
6a30: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
6a40: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
6a50: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
6a60: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
6a70: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
6a80: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
6a90: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
6aa0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
6ab0: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
6ac0: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
6ad0: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
6ae0: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
6af0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
6b00: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
6b10: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
6b20: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
6b30: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
6b40: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
6b50: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
6b60: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
6b70: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
6b80: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
6b90: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
6ba0: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
6bb0: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
6bc0: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
6bd0: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
6be0: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
6bf0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
6c00: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
6c10: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
6c20: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
6c30: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
6c40: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
6c50: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
6c60: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
6c70: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
6c80: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
6c90: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
6ca0: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
6cb0: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
6cc0: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
6cd0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
6ce0: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
6cf0: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
6d00: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
6d10: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
6d20: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
6d30: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
6d40: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
6d50: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
6d60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
6d70: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
6d80: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
6d90: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
6da0: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
6db0: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
6dc0: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
6dd0: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
6de0: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
6df0: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
6e00: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
6e10: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
6e20: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
6e30: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
6e40: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
6e50: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
6e60: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
6e70: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
6e80: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
6e90: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
6ea0: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
6eb0: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
6ec0: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
6ed0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
6ee0: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
6ef0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
6f00: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
6f10: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
6f20: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
6f30: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
6f40: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
6f50: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
6f60: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
6f70: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
6f80: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
6f90: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
6fa0: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
6fb0: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
6fc0: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
6fd0: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
6fe0: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
6ff0: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
7000: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
7010: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
7020: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
7030: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
7040: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
7050: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
7060: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
7070: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
7080: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
7090: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
70a0: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
70b0: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
70c0: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
70d0: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
70e0: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
70f0: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
7100: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
7110: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
7120: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
7130: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
7140: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
7150: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
7160: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
7170: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
7180: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
7190: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
71a0: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
71b0: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
71c0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
71d0: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
71e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
71f0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
7200: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
7210: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
7220: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7230: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
7240: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
7250: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
7260: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
7270: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
7280: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
7290: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
72a0: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
72b0: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
72c0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
72d0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
72e0: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
72f0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7300: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
7310: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
7320: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
7330: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
7340: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
7350: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
7360: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
7370: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
7380: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
7390: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
73a0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
73b0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
73c0: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
73d0: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
73e0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
73f0: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
7400: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
7410: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
7420: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
7430: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
7440: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
7450: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
7460: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
7470: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
7480: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
7490: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
74a0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
74b0: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
74c0: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
74d0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
74e0: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
74f0: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
7500: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
7510: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
7520: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
7530: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
7540: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
7550: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
7560: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
7570: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
7580: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
7590: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
75a0: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
75b0: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
75c0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
75d0: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
75e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
75f0: 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73  ect.** maintains
7600: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
7610: 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  number of pendin
7620: 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69  g locks on tha i
7630: 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e  node..** When an
7640: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
7650: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
7660: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
7670: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
7680: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
7690: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
76a0: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
76b0: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
76c0: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
76d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
76e0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
76f0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
7700: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
7710: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
7720: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61  tructure keeps a
7730: 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65   list of file de
7740: 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e  scriptors that n
7750: 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f  eed to.** be clo
7760: 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73  sed and that lis
7770: 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64  t is walked (and
7780: 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74   cleared) when t
7790: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20  he last lock.** 
77a0: 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65  clears..**.** Ye
77b0: 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65  t another proble
77c0: 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73  m:  LinuxThreads
77d0: 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c   do not play wel
77e0: 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63  l with posix loc
77f0: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f  ks..**.** Many o
7800: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
7810: 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c   linux use the L
7820: 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72  inuxThreads libr
7830: 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ary which is.** 
7840: 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69  not posix compli
7850: 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75  ant.  Under Linu
7860: 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b  xThreads, a lock
7870: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
7880: 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62  ad.** A cannot b
7890: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76  e modified or ov
78a0: 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69  erridden by a di
78b0: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42  fferent thread B
78c0: 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64  ..** Only thread
78d0: 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68   A can modify th
78e0: 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67  e lock.  Locking
78f0: 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72   behavior is cor
7900: 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61  rect.** if the a
7910: 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74  ppliation uses t
7920: 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20  he newer Native 
7930: 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62  Posix Thread Lib
7940: 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f  rary (NPTL).** o
7950: 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e  n linux - with N
7960: 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  PTL a lock creat
7970: 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63  ed by thread A c
7980: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
7990: 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42  s.** in thread B
79a0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
79b0: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
79c0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
79d0: 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e  hich.** threadin
79e0: 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69  g library is bei
79f0: 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65  ng used.  So the
7a00: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
7a10: 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69  know at.** compi
7a20: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
7a30: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20  or not thread A 
7a40: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
7a50: 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a  ks on thread B..
7a60: 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f  ** One has to do
7a70: 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63   a run-time chec
7a80: 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  k to discover th
7a90: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
7aa0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f  e.** current pro
7ab0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  cess..**.** SQLi
7ac0: 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f  te used to suppo
7ad0: 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  rt LinuxThreads.
7ae0: 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f    But support fo
7af0: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a  r LinuxThreads.*
7b00: 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65  * was dropped be
7b10: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72  ginning with ver
7b20: 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c  sion 3.7.0.  SQL
7b30: 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77  ite will still w
7b40: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75  ork with.** Linu
7b50: 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65  xThreads provide
7b60: 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65  d that (1) there
7b70: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e   is no more than
7b80: 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   one connection 
7b90: 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65  .** per database
7ba0: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
7bb0: 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32  e process and (2
7bc0: 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  ) database conne
7bd0: 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74  ctions.** do not
7be0: 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72   move across thr
7bf0: 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eads..*/../*.** 
7c00: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
7c10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
7c20: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
7c30: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
7c40: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
7c50: 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64  ticular unixInod
7c60: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  eInfo object..*/
7c70: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
7c80: 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  Id {.  dev_t dev
7c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ca0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
7cb0: 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ber */.#if OS_VX
7cc0: 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76  WORKS.  struct v
7cd0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
7ce0: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69  d;  /* Unique fi
7cf0: 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b  le ID for vxwork
7d00: 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  s. */.#else.  in
7d10: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20  o_t ino;        
7d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f            /* Ino
7d30: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e  de number */.#en
7d40: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
7d50: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7d60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
7d70: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
7d80: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
7d90: 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f  ** inode.  Or, o
7da0: 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  n LinuxThreads, 
7db0: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20  there is one of 
7dc0: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73  these structures
7dd0: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f   for.** each ino
7de0: 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63  de opened by eac
7df0: 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  h thread..**.** 
7e00: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
7e10: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
7e20: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7e30: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
7e40: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
7e50: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
7e60: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
7e70: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
7e80: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
7e90: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
7ea0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
7eb0: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
7ec0: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
7ed0: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
7ee0: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
7ef0: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
7f00: 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
7f10: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
7f20: 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20  int nShared;    
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
7f50: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
7f60: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
7f70: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
7f80: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
7f90: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
7fa0: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
7fb0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7fc0: 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20   bProcessLock;  
7fd0: 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69     /* An exclusi
7fe0: 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20  ve process lock 
7ff0: 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  is held */.  int
8000: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8020: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
8030: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
8040: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
8050: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
8060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
8070: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
8080: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
8090: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  inode */.  int n
80a0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
80b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
80c0: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
80d0: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a  ing file locks *
80e0: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
80f0: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
8100: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
8110: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8120: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69  o close */.  uni
8130: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78  xInodeInfo *pNex
8140: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
8150: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
8160: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8170: 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  s */.  unixInode
8180: 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20  Info *pPrev;    
8190: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e         /*    ...
81a0: 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  . doubly linked 
81b0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
81c0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
81d0: 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  LE.  unsigned lo
81e0: 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79  ng long sharedBy
81f0: 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20  te;  /* for AFP 
8200: 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64  simulated shared
8210: 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a   lock */.#endif.
8220: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
8230: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20   sem_t *pSem;   
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20   /* Named POSIX 
8260: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63  semaphore */.  c
8270: 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58  har aSemName[MAX
8280: 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f  _PATHNAME+2];  /
8290: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73  * Name of that s
82a0: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64  emaphore */.#end
82b0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  if.};../*.** A l
82c0: 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78  ists of all unix
82d0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
82e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69  s..*/.static uni
82f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64  xInodeInfo *inod
8300: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
8310: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
8320: 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  on - unixLogErro
8330: 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65  r_x(), is only e
8340: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
8350: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78  he macro.** unix
8360: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
8370: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
8380: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
8390: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
83a0: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e  unction and errn
83b0: 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65  o has been.** se
83c0: 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  t. It logs a mes
83d0: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
83e0: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
83f0: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
8400: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e  value of.** errn
8410: 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  o and, if possib
8420: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
8430: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
8440: 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  t from strerror(
8450: 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72  ) or.** strerror
8460: 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _r()..**.** The 
8470: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
8480: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
8490: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
84a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
84b0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
84c0: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
84d0: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
84e0: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
84f0: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
8500: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
8510: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
8520: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
8530: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
8540: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
8550: 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22  d (e.g. "unlink"
8560: 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68  , "open") and th
8570: 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  e the associated
8580: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
8590: 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f  h,.** if any..*/
85a0: 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67  .#define unixLog
85b0: 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20  Error(a,b,c)    
85c0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
85d0: 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45  ine(a,b,c,__LINE
85e0: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75  __).static int u
85f0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
8600: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
8610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8620: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
8630: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  rror code */.  c
8640: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
8650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8660: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
8670: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
8680: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8690: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
86a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
86b0: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
86c0: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
86d0: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
86f0: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
8700: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
8710: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
8720: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20    char *zErr;   
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f    /* Message fro
8750: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20  m strerror() or 
8760: 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20  equivalent */.  
8770: 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72  int iErrno = err
8780: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
8790: 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c  /* Saved syscall
87a0: 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f   error number */
87b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
87c0: 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61  s not a threadsa
87d0: 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45  fe build (SQLITE
87e0: 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c  _THREADSAFE==0),
87f0: 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74   then use.  ** t
8800: 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75  he strerror() fu
8810: 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  nction to obtain
8820: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
8830: 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ble error messag
8840: 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e  e.  ** equivalen
8850: 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65  t to errno. Othe
8860: 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72  rwise, use strer
8870: 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23  ror_r()..  */ .#
8880: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
8890: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
88a0: 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29  HAVE_STRERROR_R)
88b0: 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d  .  char aErr[80]
88c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c  ;.  memset(aErr,
88d0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29   0, sizeof(aErr)
88e0: 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72  );.  zErr = aErr
88f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52  ;..  /* If STRER
8900: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65  ROR_R_CHAR_P (se
8910: 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63  t by autoconf sc
8920: 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f  ripts) or __USE_
8930: 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a  GNU is defined,.
8940: 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
8950: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
8960: 69 64 65 73 20 74 68 65 20 74 68 65 20 47 4e 55  ides the the GNU
8970: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65   version of stre
8980: 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20 0a 20  rror_r() that . 
8990: 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
89a0: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
89b0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
89c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
89d0: 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20  That pointer .  
89e0: 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ** may point to 
89f0: 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61  aErr[], or it ma
8a00: 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  y point to some 
8a10: 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73  static storage s
8a20: 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20  omewhere. .  ** 
8a30: 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
8a40: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
8a50: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50  m provides the P
8a60: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20  OSIX version of 
8a70: 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  .  ** strerror_r
8a80: 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73  (), which always
8a90: 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72   writes an error
8aa0: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45   message into aE
8ab0: 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rr[]..  **.  ** 
8ac0: 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f  If the code inco
8ad0: 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20  rrectly assumes 
8ae0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50  that it is the P
8af0: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61  OSIX version tha
8b00: 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  t is.  ** availa
8b10: 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d  ble, the error m
8b20: 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65  essage will ofte
8b30: 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  n be an empty st
8b40: 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a  ring. Not a.  **
8b50: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49   huge problem. I
8b60: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c  ncorrectly concl
8b70: 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47  uding that the G
8b80: 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  NU version is av
8b90: 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  ailable .  ** co
8ba0: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65  uld lead to a se
8bb0: 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20  gfault though.. 
8bc0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
8bd0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
8be0: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  P) || defined(__
8bf0: 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20  USE_GNU).  zErr 
8c00: 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72  = .# endif.  str
8c10: 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20  error_r(iErrno, 
8c20: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
8c30: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
8c40: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
8c50: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
8c60: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
8c70: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
8c80: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
8c90: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
8ca0: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
8cb0: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
8cc0: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
8cd0: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
8ce0: 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f   strerror(iErrno
8cf0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
8d00: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51  ert( errcode!=SQ
8d10: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
8d20: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
8d30: 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65  h = "";.  sqlite
8d40: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
8d50: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
8d60: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
8d70: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
8d80: 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e  ne, iErrno, zFun
8d90: 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20  c, zPath, zErr. 
8da0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
8db0: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
8dc0: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  Close a file des
8dd0: 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  criptor..**.** W
8de0: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c  e assume that cl
8df0: 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77  ose() almost alw
8e00: 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65  ays works, since
8e10: 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61   it is only in a
8e20: 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70  .** very sick ap
8e30: 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20  plication or on 
8e40: 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74  a very sick plat
8e50: 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67  form that it mig
8e60: 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69  ht fail..** If i
8e70: 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d  t does fail, sim
8e80: 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ply leak the fil
8e90: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75  e descriptor, bu
8ea0: 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20  t do log the.** 
8eb0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  error..**.** Not
8ec0: 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
8ed0: 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63   safe to retry c
8ee0: 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e  lose() after EIN
8ef0: 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  TR since the.** 
8f00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
8f10: 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61  might have alrea
8f20: 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62  dy been reused b
8f30: 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  y another thread
8f40: 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74  ..** So we don't
8f50: 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63   even try to rec
8f60: 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e  over from an EIN
8f70: 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68  TR.  Just log th
8f80: 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d  e error.** and m
8f90: 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ove on..*/.stati
8fa0: 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c  c void robust_cl
8fb0: 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ose(unixFile *pF
8fc0: 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20  ile, int h, int 
8fd0: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f  lineno){.  if( o
8fe0: 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20  sClose(h) ){.   
8ff0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9000: 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ine(SQLITE_IOERR
9010: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
9020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9030: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20          pFile ? 
9040: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30  pFile->zPath : 0
9050: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d  , lineno);.  }.}
9060: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
9070: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
9080: 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e  rs accumuated in
9090: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
90a0: 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  fo->pUnused list
90b0: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
90c0: 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64  d closePendingFd
90d0: 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
90e0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
90f0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
9100: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
9110: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a  nixUnusedFd *p;.
9120: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
9130: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
9140: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
9150: 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
9160: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
9170: 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  t;.    robust_cl
9180: 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64  ose(pFile, p->fd
9190: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
91a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
91b0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e  ;.  }.  pInode->
91c0: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
91d0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
91e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
91f0: 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73  ructure previous
9200: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
9210: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
9220: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
9230: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
9240: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
9250: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
9260: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
9270: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
9280: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
9290: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
92a0: 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46  eInodeInfo(unixF
92b0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
92c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
92d0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
92e0: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
92f0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
9300: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
9310: 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70  pInode) ){.    p
9320: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Inode->nRef--;. 
9330: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
9340: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
9350: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
9360: 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20  pShmNode==0 );. 
9370: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
9380: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
9390: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
93a0: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
93b0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
93c0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49  pPrev->pNext==pI
93d0: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
93e0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
93f0: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
9400: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
9410: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
9420: 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49  t( inodeList==pI
9430: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
9440: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
9450: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
9460: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e   }.      if( pIn
9470: 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ode->pNext ){.  
9480: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
9490: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
94a0: 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  ev==pInode );.  
94b0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e        pInode->pN
94c0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ext->pPrev = pIn
94d0: 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ode->pPrev;.    
94e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
94f0: 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a  3_free(pInode);.
9500: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9510: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
9520: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
9530: 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  te the unixInode
9540: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
9550: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
9560: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
9570: 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  or.  Create a ne
9580: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
9590: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
95a0: 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62  rn value might b
95b0: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
95c0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
95d0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  rs..**.** The mu
95e0: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
95f0: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
9600: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
9610: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
9620: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
9630: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
9640: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70  .** Return an ap
9650: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
9660: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
9670: 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  int findInodeInf
9680: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
9690: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
96a0: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
96b0: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
96c0: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
96d0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
96e0: 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20  fo **ppInode    
96f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
9700: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
9710: 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29  object here */.)
9720: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c     /* System cal
9750: 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  l return code */
9760: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
9790: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69  scriptor for pFi
97a0: 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  le */.  struct u
97b0: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
97c0: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
97d0: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
97e0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20  xInodeInfo */.  
97f0: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
9800: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  buf;           /
9810: 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
9820: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
9830: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9840: 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20  *pInode = 0;    
9850: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
9860: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
9870: 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ct */..  assert(
9880: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
9890: 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f   );..  /* Get lo
98a0: 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74  w-level informat
98b0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69  ion about the fi
98c0: 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75  le that we can u
98d0: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61  sed to.  ** crea
98e0: 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65  te a unique name
98f0: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20   for the file.. 
9900: 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65   */.  fd = pFile
9910: 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  ->h;.  rc = osFs
9920: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
9930: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
9940: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
9950: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
9960: 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57  #ifdef EOVERFLOW
9970: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
9980: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
9990: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
99a0: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
99b0: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
99c0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
99d0: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
99e0: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
99f0: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
9a00: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
9a10: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
9a20: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
9a30: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
9a40: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
9a50: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
9a60: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
9a70: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
9a80: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
9a90: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
9aa0: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
9ab0: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
9ac0: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
9ad0: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
9ae0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
9af0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
9b00: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
9b10: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
9b20: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
9b30: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
9b40: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
9b50: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
9b60: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
9b70: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
9b80: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
9b90: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
9ba0: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
9bb0: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
9bc0: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
9bd0: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
9be0: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
9bf0: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
9c00: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
9c10: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
9c20: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
9c30: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
9c40: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
9c50: 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65  ize==0 && (pFile
9c60: 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  ->fsFlags & SQLI
9c70: 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
9c80: 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64  DOS)!=0 ){.    d
9c90: 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28  o{ rc = osWrite(
9ca0: 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68  fd, "S", 1); }wh
9cb0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
9cc0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
9cd0: 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20   if( rc!=1 ){.  
9ce0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
9cf0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
9d00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9d10: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
9d20: 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
9d30: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
9d40: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
9d50: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
9d60: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
9d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9d80: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
9d90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
9da0: 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30  emset(&fileId, 0
9db0: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
9dc0: 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20  );.  fileId.dev 
9dd0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
9de0: 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
9df0: 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20  .  fileId.pId = 
9e00: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
9e10: 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d  e.  fileId.ino =
9e20: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
9e30: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65  .#endif.  pInode
9e40: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
9e50: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
9e60: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
9e70: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
9e80: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
9e90: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
9ea0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
9eb0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
9ec0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
9ed0: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
9ee0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e  loc( sizeof(*pIn
9ef0: 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ode) );.    if( 
9f00: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
9f10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9f20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
9f30: 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c    memset(pInode,
9f40: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f   0, sizeof(*pIno
9f50: 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  de));.    memcpy
9f60: 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  (&pInode->fileId
9f70: 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  , &fileId, sizeo
9f80: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20  f(fileId));.    
9f90: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31  pInode->nRef = 1
9fa0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e  ;.    pInode->pN
9fb0: 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ext = inodeList;
9fc0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72  .    pInode->pPr
9fd0: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
9fe0: 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64  inodeList ) inod
9ff0: 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  eList->pPrev = p
a000: 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65  Inode;.    inode
a010: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  List = pInode;. 
a020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f   }else{.    pIno
a030: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  de->nRef++;.  }.
a040: 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e    *ppInode = pIn
a050: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
a060: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
a070: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a080: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
a090: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
a0a0: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
a0b0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
a0c0: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
a0d0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
a0e0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
a0f0: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
a100: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
a110: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
a120: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
a130: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
a140: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
a150: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
a160: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
a170: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
a180: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
a190: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
a1a0: 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52  c int unixCheckR
a1b0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
a1c0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
a1d0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
a1e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a1f0: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
a200: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
a210: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
a220: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
a230: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
a240: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
a250: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
a260: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
a270: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e  t( pFile );.  un
a280: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
a290: 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
a2a0: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
a2b0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
a2c0: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
a2d0: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
a2e0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
a2f0: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
a300: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
a310: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
a320: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
a330: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
a340: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65  ;.  }..  /* Othe
a350: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
a360: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
a370: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23  holds it..  */.#
a380: 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  ifndef __DJGPP__
a390: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
a3a0: 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f   && !pFile->pIno
a3b0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
a3c0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
a3d0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c  lock lock;.    l
a3e0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
a3f0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
a400: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
a410: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c  RVED_BYTE;.    l
a420: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
a430: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
a440: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66   F_WRLCK;.    if
a450: 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  ( osFcntl(pFile-
a460: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
a470: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ck) ){.      rc 
a480: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
a490: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
a4a0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
a4b0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
a4c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
a4d0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
a4e0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
a4f0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
a500: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
a510: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
a520: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
a530: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
a540: 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22   %d %d (unix)\n"
a550: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
a560: 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
a570: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
a580: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
a590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
a5a0: 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65  t to set a syste
a5b0: 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  m-lock on the fi
a5c0: 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c  le pFile.  The l
a5d0: 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72  ock is .** descr
a5e0: 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a  ibed by pLock..*
a5f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c  *.** If the pFil
a600: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
a610: 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69  d/write from uni
a620: 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65  x-excl, then the
a630: 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76   only lock.** ev
a640: 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61  er obtained is a
a650: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
a660: 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61  , and it is obta
a670: 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  ined exactly onc
a680: 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  e.** the first t
a690: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
a6a0: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20  attempted.  All 
a6b0: 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65  subsequent syste
a6c0: 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65  m locking.** ope
a6d0: 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e  rations become n
a6e0: 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20  o-ops.  Locking 
a6f0: 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c  operations still
a700: 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c   happen internal
a710: 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ly,.** in order 
a720: 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63  to coordinate ac
a730: 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70  cess between sep
a740: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63  arate database c
a750: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69  onnections.** wi
a760: 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  thin this proces
a770: 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68  s, but all of th
a780: 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  at is handled in
a790: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a   memory and the.
a7a0: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
a7b0: 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72  tem does not par
a7c0: 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ticipate..**.** 
a7d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
a7e0: 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20   a pass-through 
a7f0: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
a800: 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73  ) if pFile is us
a810: 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f  ing.** any VFS o
a820: 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d  ther than "unix-
a830: 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c  excl" or if pFil
a840: 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22  e is opened on "
a850: 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e  unix-excl".** an
a860: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  d is read-only..
a870: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
a880: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61  turned if the ca
a890: 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  ll completes suc
a8a0: 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31  cessfully, or -1
a8b0: 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f   if a call.** to
a8c0: 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20   fcntl() fails. 
a8d0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72  In this case, er
a8e0: 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f  rno is set appro
a8f0: 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e  priately (by fcn
a900: 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tl())..*/.static
a910: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63   int unixFileLoc
a920: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
a930: 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  e, struct flock 
a940: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
a950: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
a960: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
a970: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
a980: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
a990: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
a9a0: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
a9b0: 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63    if( ((pFile->c
a9c0: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
a9d0: 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20  ILE_EXCL)!=0 || 
a9e0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
a9f0: 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46  Lock).   && ((pF
aa00: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
aa10: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
aa20: 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69  )==0).  ){.    i
aa30: 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
aa40: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
aa50: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
aa60: 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73   lock;.      ass
aa70: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
aa80: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c  ck==0 );.      l
aa90: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
aaa0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
aab0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
aac0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
aad0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
aae0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
aaf0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
ab00: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_WRLCK;.      r
ab10: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
ab20: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
ab30: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  lock);.      if(
ab40: 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72   rc<0 ) return r
ab50: 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  c;.      pInode-
ab60: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20  >bProcessLock = 
ab70: 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  1;.      pInode-
ab80: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65  >nLock++;.    }e
ab90: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
aba0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
abb0: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
abc0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
abd0: 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20  ETLK, pLock);.  
abe0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
abf0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
ac00: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
ac10: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
ac20: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
ac30: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
ac40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
ac50: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
ac60: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
ac70: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
ac80: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
ac90: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
aca0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
acb0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
acc0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
acd0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
ace0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
acf0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
ad00: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
ad10: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
ad20: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
ad30: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
ad40: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
ad50: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
ad60: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
ad70: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
ad80: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
ad90: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
ada0: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
adb0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
adc0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
add0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
ade0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
adf0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
ae00: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
ae10: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
ae20: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
ae30: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
ae40: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
ae50: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
ae60: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
ae70: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
ae80: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
ae90: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
aea0: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
aeb0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
aec0: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
aed0: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
aee0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
aef0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
af00: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
af10: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
af20: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
af30: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
af40: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
af50: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
af60: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
af70: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
af80: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
af90: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
afa0: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
afb0: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
afc0: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
afd0: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
afe0: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
aff0: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
b000: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
b010: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
b020: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
b030: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
b040: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
b050: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
b060: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
b070: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
b080: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
b090: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
b0a0: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
b0b0: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
b0c0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
b0d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
b0e0: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
b0f0: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
b100: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
b110: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
b120: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
b130: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
b140: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
b150: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
b160: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
b170: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
b180: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
b190: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
b1a0: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
b1b0: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
b1c0: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
b1d0: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
b1e0: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
b1f0: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
b200: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
b210: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
b220: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
b230: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
b240: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
b250: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
b260: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
b270: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
b280: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
b290: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
b2a0: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
b2b0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
b2c0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
b2d0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
b2e0: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
b2f0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
b300: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
b310: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
b320: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
b330: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
b340: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
b350: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
b360: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
b370: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
b380: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
b390: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
b3a0: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
b3b0: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
b3c0: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
b3d0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
b3e0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
b3f0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
b400: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
b410: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
b420: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
b430: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
b440: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
b450: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
b460: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
b470: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
b480: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
b490: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
b4a0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b4b0: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
b4c0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
b4d0: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
b4e0: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
b4f0: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
b500: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
b510: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
b520: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
b530: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
b540: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
b550: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
b560: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
b570: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
b580: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
b590: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
b5a0: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
b5b0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
b5c0: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
b5d0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
b5e0: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
b5f0: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
b600: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
b610: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
b620: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
b630: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
b640: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
b650: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
b660: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
b670: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
b680: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
b690: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
b6a0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
b6b0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
b6c0: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
b6d0: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
b6e0: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
b6f0: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
b700: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
b710: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
b720: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
b730: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
b740: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
b750: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
b760: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
b770: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
b780: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
b790: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b7a0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
b7b0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
b7c0: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
b7d0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
b7e0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  e->pInode;.  str
b7f0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
b800: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30    int tErrno = 0
b810: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
b820: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
b830: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
b840: 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
b850: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
b860: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
b870: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
b880: 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
b890: 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
b8a0: 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ck),.      azFil
b8b0: 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
b8c0: 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
b8d0: 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
b8e0: 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
b8f0: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
b900: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
b910: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
b920: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
b930: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
b940: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
b950: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
b960: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
b970: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
b980: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
b990: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
b9a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
b9b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
b9c0: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
b9d0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
b9e0: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
b9f0: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
ba00: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
ba10: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
ba20: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
ba30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ba40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
ba50: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
ba60: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
ba70: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
ba80: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
ba90: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
baa0: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
bab0: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
bac0: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
bad0: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
bae0: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
baf0: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
bb00: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
bb10: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
bb20: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
bb30: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
bb40: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
bb50: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
bb60: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
bb70: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
bb80: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
bb90: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
bba0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
bbb0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
bbc0: 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
bbd0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
bbe0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
bbf0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
bc00: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
bc10: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
bc20: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
bc30: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
bc40: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
bc50: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
bc60: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
bc70: 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
bc80: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
bc90: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
bca0: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
bcb0: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
bcc0: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
bcd0: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
bce0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
bcf0: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
bd00: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
bd10: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
bd20: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
bd30: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
bd40: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
bd50: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
bd60: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
bd70: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
bd80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
bd90: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
bda0: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
bdb0: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
bdc0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
bdd0: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
bde0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
bdf0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
be00: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
be10: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
be20: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
be30: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
be40: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
be50: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
be60: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
be70: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
be80: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
be90: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
bea0: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
beb0: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
bec0: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
bed0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
bee0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
bef0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
bf00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
bf10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
bf20: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
bf30: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
bf40: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
bf50: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
bf60: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
bf70: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
bf80: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
bf90: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
bfa0: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
bfb0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
bfc0: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
bfd0: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
bfe0: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
bff0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
c000: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
c010: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
c020: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
c030: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
c040: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
c050: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
c060: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c070: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
c080: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c090: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
c0a0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c0b0: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
c0c0: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
c0d0: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
c0e0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
c0f0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c100: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
c110: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
c120: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c130: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
c140: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
c150: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
c160: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
c170: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
c180: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
c190: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
c1a0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
c1b0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
c1c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
c1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
c1e0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c1f0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
c200: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
c210: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
c220: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
c230: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
c240: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
c250: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
c260: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
c270: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
c280: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
c290: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
c2a0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
c2b0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c2c0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c2d0: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
c2e0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
c2f0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
c300: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
c310: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
c320: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
c330: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
c340: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
c350: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
c360: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
c370: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c380: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
c390: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
c3a0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
c3b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c3c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
c3d0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
c3e0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
c3f0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
c400: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
c410: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
c420: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
c430: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c440: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
c450: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c460: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
c470: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c480: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
c490: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
c4a0: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
c4b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
c4c0: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
c4d0: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
c4e0: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
c4f0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c500: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c510: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
c520: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
c530: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  c ){.      if( r
c540: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
c550: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
c560: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
c570: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
c580: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c5a0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c5b0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c5c0: 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
c5d0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
c5e0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
c5f0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
c600: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
c610: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c620: 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
c630: 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
c640: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
c650: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
c660: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
c670: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
c680: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
c690: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
c6a0: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
c6b0: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
c6c0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
c6d0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
c6e0: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
c6f0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
c700: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
c710: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
c720: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
c730: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
c740: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
c750: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
c760: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
c770: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
c780: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
c790: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
c7a0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20   = F_WRLCK;..   
c7b0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
c7c0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
c7d0: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
c7e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
c7f0: 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  ;.    if( eFileL
c800: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
c810: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
c820: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
c830: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
c840: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
c850: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c860: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c870: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
c880: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
c890: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
c8a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e     }..    if( un
c8b0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
c8c0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
c8d0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
c8e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c8f0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
c900: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
c910: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
c920: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
c930: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
c940: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
c950: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
c960: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
c970: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66  .  }.  ..#ifndef
c980: 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74   NDEBUG.  /* Set
c990: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
c9a0: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
c9b0: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
c9c0: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
c9d0: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
c9e0: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
c9f0: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
ca00: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
ca10: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
ca20: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
ca30: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
ca40: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
ca50: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
ca60: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
ca70: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
ca80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ca90: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
caa0: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
cab0: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
cac0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
cad0: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
cae0: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
caf0: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
cb00: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
cb10: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
cb20: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
cb30: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
cb40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cb50: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
cb60: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
cb70: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
cb80: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
cb90: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
cba0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
cbb0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
cbc0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
cbd0: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
cbe0: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
cbf0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
cc00: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
cc10: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
cc20: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
cc30: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
cc40: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
cc50: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
cc60: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
cc70: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
cc80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
cc90: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
cca0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ccb0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
ccc0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
ccd0: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
cce0: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
ccf0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
cd00: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
cd10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
cd20: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
cd30: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
cd40: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
cd50: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
cd60: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
cd70: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
cd80: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
cd90: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
cda0: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
cdb0: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
cdc0: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
cdd0: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
cde0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
cdf0: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
ce00: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
ce10: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
ce20: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
ce30: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
ce40: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
ce50: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
ce60: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
ce70: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
ce80: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
ce90: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
cea0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
ceb0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
cec0: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
ced0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
cee0: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
cef0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
cf00: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
cf10: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
cf20: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
cf30: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
cf40: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
cf50: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
cf60: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
cf70: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
cf80: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
cf90: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
cfa0: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
cfb0: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
cfc0: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
cfd0: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
cfe0: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
cff0: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
d000: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
d010: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
d020: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
d030: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
d040: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
d050: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
d060: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
d070: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
d080: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
d090: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
d0a0: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
d0b0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d0c0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d0d0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d0e0: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
d0f0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d100: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d110: 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  OK;.  int h;..  
d120: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
d130: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
d140: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
d150: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
d160: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
d170: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
d180: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
d190: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
d1a0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
d1b0: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
d1c0: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
d1d0: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
d1e0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
d1f0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
d200: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
d210: 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
d220: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
d230: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d240: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
d250: 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d  ();.  h = pFile-
d260: 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  >h;.  pInode = p
d270: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
d280: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d290: 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
d2a0: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d2b0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
d2c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d2d0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d2e0: 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
d2f0: 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
d300: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
d310: 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
d320: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
d330: 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
d340: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
d350: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
d360: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
d370: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
d380: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
d390: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
d3a0: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
d3b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d3c0: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
d3d0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
d3e0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
d3f0: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
d400: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
d410: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
d420: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
d430: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
d440: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
d450: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
d460: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
d470: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
d480: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
d490: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
d4a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
d4b0: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
d4c0: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
d4d0: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
d4e0: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
d4f0: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
d500: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
d510: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
d520: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
d530: 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20 61    */.#if 0.    a
d540: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
d550: 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
d560: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
d570: 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
d580: 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
d590: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
d5a0: 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1 );.#endif.    
d5b0: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
d5c0: 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
d5d0: 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
d5e0: 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
d5f0: 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
d600: 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
d610: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
d620: 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
d630: 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
d640: 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
d650: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
d660: 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
d670: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
d680: 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
d690: 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
d6a0: 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
d6b0: 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
d6c0: 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
d6d0: 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
d6e0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
d6f0: 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
d700: 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
d710: 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
d720: 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
d730: 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
d740: 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
d750: 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
d760: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
d770: 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e  K ){..#if !defin
d780: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
d790: 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
d7a0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
d7b0: 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65      (void)handle
d7c0: 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  NFSUnlock;.     
d7d0: 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e   assert( handleN
d7e0: 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23  FSUnlock==0 );.#
d7f0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d800: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
d810: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
d820: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
d830: 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55    if( handleNFSU
d840: 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
d850: 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20   int tErrno;    
d860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
d870: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
d880: 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
d890: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
d8a0: 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52  t divSize = SHAR
d8b0: 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20  ED_SIZE - 1;.   
d8c0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f       .        lo
d8d0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
d8e0: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
d8f0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d900: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
d910: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
d920: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
d930: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
d940: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
d950: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
d960: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
d970: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
d980: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d990: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
d9a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
d9b0: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
d9c0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
d9d0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
d9e0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
d9f0: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
da00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
da10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
da20: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
da30: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
da40: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
da50: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
da60: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
da70: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
da80: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
da90: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
daa0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
dab0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
dac0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
dad0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
dae0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
daf0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
db00: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
db10: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
db20: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
db30: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
db40: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
db50: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
db60: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
db70: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
db80: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
db90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dba0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
dbb0: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
dbc0: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
dbd0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
dbe0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
dbf0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
dc00: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
dc10: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
dc20: 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b  D_FIRST+divSize;
dc30: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
dc40: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
dc50: 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  E-divSize;.     
dc60: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
dc70: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
dc80: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
dc90: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
dca0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
dcb0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
dcc0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
dcd0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
dce0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
dcf0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
dd00: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
dd10: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
dd20: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
dd30: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
dd40: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
dd50: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
dd60: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
dd70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
dd80: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20  CKING_STYLE */. 
dd90: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c       {.        l
dda0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
ddb0: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
ddc0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ddd0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
dde0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ddf0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
de00: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
de10: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
de20: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
de30: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
de40: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 20  lock) ){.       
de50: 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
de60: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69   the call to uni
de70: 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e  xFileLock() cann
de80: 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65 20  ot fail because 
de90: 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  another.        
dea0: 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20    ** process is 
deb0: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d  holding an incom
dec0: 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66  patible lock. If
ded0: 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a   it does, this .
dee0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
def0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
df00: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
df10: 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
df20: 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20  he locking.     
df30: 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c       ** protocol
df40: 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
df50: 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
df60: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52  _IOERR_RDLOCK. R
df70: 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
df80: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
df90: 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20  Y would confuse 
dfa0: 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
dfb0: 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20  (in practice it 
dfc0: 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20 20  causes .        
dfd0: 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74    ** an assert t
dfe0: 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20  o fail). */ .   
dff0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e000: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
e010: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
e020: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
e030: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rno;.          g
e040: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
e050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e060: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
e070: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
e080: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
e090: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e0a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
e0b0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
e0c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
e0d0: 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
e0e0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
e0f0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
e100: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
e110: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
e120: 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
e130: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e140: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
e150: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e160: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e170: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
e180: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e190: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e1a0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
e1b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
e1c0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
e1d0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
e1e0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
e1f0: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
e200: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
e210: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
e220: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
e230: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
e240: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
e250: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
e260: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
e270: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
e280: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
e290: 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
e2a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
e2b0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
e2c0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
e2d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
e2e0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
e2f0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
e300: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
e310: 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75  = 0L;.      Simu
e320: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
e330: 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
e340: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
e350: 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
e360: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
e370: 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
e380: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e390: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
e3a0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
e3b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
e3c0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
e3d0: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
e3e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
e3f0: 4f 43 4b 3b 0a 09 70 46 69 6c 65 2d 3e 6c 61 73  OCK;..pFile->las
e400: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e410: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
e420: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
e430: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
e440: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e450: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
e460: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
e470: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
e480: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
e490: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
e4a0: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
e4b0: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
e4c0: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
e4d0: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
e4e0: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
e4f0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
e500: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
e510: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
e520: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
e530: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
e540: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
e550: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
e560: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
e570: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
e580: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
e590: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
e5a0: 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e    }.  }...end_un
e5b0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
e5c0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
e5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
e5e0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e5f0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
e600: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e610: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
e620: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
e630: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
e640: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
e650: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
e660: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
e670: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
e680: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
e690: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e6a0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
e6b0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
e6c0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
e6d0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
e6e0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
e6f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e700: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
e710: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
e720: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
e730: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
e740: 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
e750: 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
e760: 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
e770: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e780: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
e790: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
e7a0: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
e7b0: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
e7c0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
e7d0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
e7e0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
e7f0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
e800: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
e810: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
e820: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
e830: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
e840: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
e850: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
e860: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
e870: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
e880: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
e890: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
e8a0: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
e8b0: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
e8c0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
e8d0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
e8e0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
e8f0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
e900: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
e910: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
e920: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
e930: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
e940: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
e950: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
e960: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  d>=0 ){.    robu
e970: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
e980: 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 20 5f 5f  pFile->dirfd, __
e990: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69  LINE__);.    pFi
e9a0: 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20  le->dirfd=-1;.  
e9b0: 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  }.  if( pFile->h
e9c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73  >=0 ){.    robus
e9d0: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
e9e0: 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
e9f0: 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  _);.    pFile->h
ea00: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f   = -1;.  }.#if O
ea10: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
ea20: 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
ea30: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44    if( pFile->isD
ea40: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 75  elete ){.      u
ea50: 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
ea60: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
ea70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
ea80: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
ea90: 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
eaa0: 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
eab0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
eac0: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
ead0: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
eae0: 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
eaf0: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
eb00: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
eb10: 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
eb20: 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
eb30: 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
eb40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eb50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
eb60: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
eb70: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
eb80: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
eb90: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
eba0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
ebb0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
ebc0: 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
ebd0: 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
ebe0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
ebf0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
ec00: 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
ec10: 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
ec20: 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
ec30: 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
ec40: 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
ec50: 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
ec60: 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
ec70: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
ec80: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
ec90: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
eca0: 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
ecb0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
ecc0: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
ecd0: 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65  if( ALWAYS(pFile
ece0: 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69  ->pInode) && pFi
ecf0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
ed00: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
ed10: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
ed20: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
ed30: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
ed40: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
ed50: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
ed60: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
ed70: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
ed80: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
ed90: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
eda0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
edb0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
edc0: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
edd0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
ede0: 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sed .    ** when
edf0: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
ee00: 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
ee10: 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
ee20: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
ee30: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
ee40: 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  o(pFile);.  rc =
ee50: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
ee60: 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
ee70: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
ee80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
ee90: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
eea0: 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
eeb0: 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
eec0: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
eed0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
eee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef20: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
efa0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
efb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
efc0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
efd0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
efe0: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
eff0: 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
f000: 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
f010: 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
f020: 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
f030: 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
f040: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
f050: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
f060: 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
f070: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
f080: 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
f090: 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
f0a0: 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
f0b0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
f0c0: 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
f0d0: 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
f0e0: 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
f0f0: 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
f100: 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
f110: 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
f120: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
f130: 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
f140: 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
f150: 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
f160: 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
f170: 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
f180: 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
f190: 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
f1a0: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
f1b0: 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
f1c0: 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
f1d0: 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
f1e0: 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
f1f0: 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
f200: 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
f210: 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
f220: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f230: 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
f240: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
f250: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
f260: 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
f270: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
f280: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
f290: 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
f2a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
f2b0: 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
f2c0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
f2d0: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
f2e0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
f2f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
f300: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
f310: 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
f320: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f330: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f340: 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
f350: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
f360: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
f370: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
f380: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
f390: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
f3a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
f3b0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
f3c0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f3d0: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
f3e0: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
f3f0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
f400: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
f410: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f420: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
f430: 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
f440: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f450: 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
f460: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
f470: 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
f480: 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
f490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
f4a0: 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
f4b0: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
f4c0: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f520: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
f530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f590: 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
f5a0: 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
f5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
f5d0: 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
f5e0: 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
f5f0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
f600: 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stance of separa
f610: 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
f620: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
f630: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
f640: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
f650: 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74  is works on just
f660: 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20  .** about every 
f670: 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
f680: 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
f690: 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
f6a0: 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
f6b0: 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
f6c0: 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
f6d0: 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
f6e0: 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
f6f0: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
f700: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
f710: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
f720: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
f730: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
f740: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
f750: 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
f760: 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
f770: 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
f780: 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
f790: 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
f7a0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
f7b0: 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
f7c0: 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
f7d0: 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
f7e0: 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
f7f0: 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
f800: 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
f810: 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
f820: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
f830: 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
f840: 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
f850: 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68  ing a file in th
f860: 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
f870: 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   as the.** datab
f880: 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
f890: 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
f8a0: 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
f8b0: 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
f8c0: 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
f8d0: 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69  of a lock file i
f8e0: 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
f8f0: 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
f900: 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70  ther lock.** typ
f910: 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
f920: 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
f930: 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
f940: 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
f950: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
f960: 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
f970: 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
f980: 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
f990: 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
f9a0: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ck file..*/.#def
f9b0: 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
f9c0: 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
f9d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
f9e0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
f9f0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
fa00: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
fa10: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
fa20: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
fa30: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
fa40: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
fa50: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
fa60: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
fa70: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
fa80: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
fa90: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
faa0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
fab0: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
fac0: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
fad0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
fae0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
faf0: 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
fb00: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
fb10: 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
fb20: 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
fb30: 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
fb40: 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
fb50: 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
fb60: 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
fb70: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
fb80: 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
fb90: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
fba0: 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
fbb0: 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
fbc0: 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
fbd0: 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
fbe0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
fbf0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
fc00: 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
fc10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
fc20: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
fc30: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
fc40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fc50: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
fc60: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
fc70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
fc80: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
fc90: 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
fca0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
fcb0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
fcc0: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
fcd0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
fce0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
fcf0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
fd00: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
fd10: 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
fd20: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
fd30: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  or some other co
fd40: 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nnection in the 
fd50: 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20  same process.   
fd60: 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b   ** holds a lock
fd70: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e   on the file.  N
fd80: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
fd90: 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
fda0: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
fdb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
fdc0: 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69  e lock is held i
fdd0: 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68  f and only if th
fde0: 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74  e lockfile exist
fdf0: 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  s */.    const c
fe00: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
fe10: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46   (const char*)pF
fe20: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
fe30: 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65  ext;.    reserve
fe40: 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f  d = osAccess(zLo
fe50: 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
fe60: 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
fe70: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
fe80: 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
fe90: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
fea0: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
feb0: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
fec0: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
fed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
fee0: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
fef0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
ff00: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
ff10: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
ff20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
ff30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
ff40: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
ff50: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
ff60: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
ff70: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
ff80: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
ff90: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
ffa0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
ffb0: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
ffc0: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
ffd0: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
ffe0: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
fff0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
10000 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
10010 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
10020 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
10030 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
10040 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
10050 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
10060 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
10070 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
10080 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
10090 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
100a0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
100b0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
100c0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
100d0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
100e0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
100f0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
10100 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
10110 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
10120 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
10130 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
10140 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
10150 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
10160 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
10170 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
10180 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
10190 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
101a0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
101b0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
101c0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
101d0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
101e0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
101f0 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
10200 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
10210 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
10220 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
10230 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
10240 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
10250 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
10260 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
10270 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
10280 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
10290 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
102a0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
102b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
102c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
102d0 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
102e0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
102f0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
10300 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
10310 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10320 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
10330 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
10340 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
10350 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
10360 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
10370 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
10380 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
10390 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
103a0 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
103b0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
103c0 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
103d0 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
103e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
103f0 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21 4f 53  ileLock;.#if !OS
10400 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20  _VXWORKS.    /* 
10410 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
10420 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
10430 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20  he old file */. 
10440 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
10450 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
10460 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
10470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10480 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
10490 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
104a0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
104b0 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44  n(zLockFile,O_RD
104c0 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  ONLY|O_CREAT|O_E
104d0 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28  XCL,0600);.  if(
104e0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   fd<0 ){.    /* 
104f0 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
10500 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20  reate the file, 
10510 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79  someone else may
10520 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65   have stolen the
10530 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
10540 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10550 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
10560 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
10570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
10580 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
10590 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
105a0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
105b0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
105c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
105d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
105e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
105f0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
10600 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10610 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
10620 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
10630 3b 0a 20 20 7d 20 0a 20 20 72 6f 62 75 73 74 5f  ;.  } .  robust_
10640 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
10650 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20   __LINE__);.  . 
10660 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
10670 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10680 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
10690 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
106a0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
106b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
106c0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
106d0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
106e0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
106f0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
10700 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
10710 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
10720 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
10730 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
10740 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
10750 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
10760 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10770 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10780 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10790 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
107a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
107b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
107c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
107d0 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
107e0 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
107f0 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
10800 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
10810 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10820 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
10830 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
10840 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
10850 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
10860 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
10870 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
10880 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
10890 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
108a0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
108b0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
108c0 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c   %d pid=%d (dotl
108d0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
108e0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20  h, eFileLock,.. 
108f0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10900 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
10910 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
10920 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
10930 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
10940 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
10950 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
10960 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
10970 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
10980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10990 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
109a0 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
109b0 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
109c0 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
109d0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
109e0 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
109f0 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
10a00 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
10a10 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
10a20 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
10a30 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
10a40 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10a50 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
10a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10a70 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
10a80 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
10a90 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
10aa0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
10ab0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
10ac0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
10ad0 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a 4c  .  if( unlink(zL
10ae0 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  ockFile) ){.    
10af0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20 20  int rc = 0;.    
10b00 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10b10 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45  no;.    if( ENOE
10b20 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
10b30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10b40 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
10b50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
10b60 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10b70 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10b80 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
10b90 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
10ba0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
10bb0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10bc0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
10bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10be0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10bf0 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
10c00 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
10c10 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
10c20 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
10c30 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10c40 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
10c50 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
10c60 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29  t rc;.  if( id )
10c70 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
10c80 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10c90 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
10ca0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
10cb0 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
10cc0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
10cd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
10ce0 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65    }.  rc = close
10cf0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
10d00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
10d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d20 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
10d30 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
10d40 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
10d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
10e20 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10e50 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
10e60 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
10e70 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
10e80 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
10e90 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
10ea0 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
10eb0 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
10ec0 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
10ed0 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
10ee0 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
10ef0 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
10f00 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
10f10 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
10f20 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
10f30 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
10f40 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
10f50 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
10f60 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
10f70 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
10f80 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
10f90 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
10fa0 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
10fb0 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
10fc0 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
10fd0 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
10fe0 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
10ff0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
11000 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
11010 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
11020 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
11030 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11040 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
11050 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20  ed off or if.** 
11060 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58  compiling for VX
11070 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51  WORKS..*/.#if SQ
11080 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11090 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
110a0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
110b0 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
110c0 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
110d0 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
110e0 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
110f0 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
11100 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
11110 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
11120 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
11130 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
11140 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
11150 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
11160 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
11170 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
11180 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
11190 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
111a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
111b0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
111c0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
111d0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
111e0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
111f0 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11200 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11210 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11220 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11230 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11240 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11250 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11260 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
11270 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
11280 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
11290 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
112a0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
112b0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
112c0 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
112d0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
112e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
112f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11300 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
11310 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11320 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11330 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11340 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11350 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
11360 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11370 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
11380 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
11390 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
113a0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
113b0 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
113c0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
113d0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
113e0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
113f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11400 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
11410 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
11420 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
11430 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
11440 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
11450 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
11460 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
11470 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
11480 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
11490 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
114a0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
114b0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
114c0 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
114d0 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
114e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
114f0 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
11500 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
11510 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
11520 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11530 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
11540 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
11550 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11560 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
11570 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
11580 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
11590 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
115a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
115b0 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
115c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
115d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
115e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
115f0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
11600 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
11610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11620 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11630 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11640 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
11650 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
11660 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
11670 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
11680 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
11690 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
116a0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
116b0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
116c0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
116d0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
116e0 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
116f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11700 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11710 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
11720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11730 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
11740 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11750 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
11760 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
11770 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
11780 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
11790 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
117a0 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
117b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
117c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
117d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
117e0 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
117f0 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
11800 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
11810 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
11820 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
11830 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
11840 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11850 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
11860 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
11870 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
11880 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
11890 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
118a0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
118b0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
118c0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
118d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
118e0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
118f0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
11900 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
11910 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
11920 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
11930 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
11940 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11950 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11960 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11970 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11980 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
11990 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
119a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
119b0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
119c0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
119d0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
119e0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
119f0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
11a00 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
11a10 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
11a20 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
11a30 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
11a40 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
11a50 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
11a60 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
11a70 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
11a80 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
11a90 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
11aa0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
11ab0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
11ac0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
11ad0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11ae0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
11af0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
11b00 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
11b10 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
11b20 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
11b30 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
11b40 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
11b50 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
11b60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
11b70 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
11b80 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
11b90 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
11ba0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
11bb0 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
11bc0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
11bd0 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
11be0 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
11bf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11c00 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11c10 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11c20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11c30 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11c40 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11c50 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
11c60 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
11c70 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11c80 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11c90 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
11ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11cb0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11cc0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
11cd0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11ce0 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
11cf0 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
11d00 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
11d10 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
11d20 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
11d30 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
11d40 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
11d50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11d60 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
11d70 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11d80 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11d90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11da0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11db0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11dc0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
11dd0 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
11de0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11df0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
11e00 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
11e10 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
11e20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
11e30 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
11e40 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11e50 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11e60 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11e70 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
11e80 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11e90 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
11ea0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11eb0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11ec0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
11ed0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
11ee0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
11ef0 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
11f00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
11f10 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
11f20 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
11f30 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
11f40 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
11f50 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
11f60 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
11f70 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
11f80 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
11f90 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
11fa0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
11fb0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
11fc0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
11fd0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
11fe0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
11ff0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
12000 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
12010 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12020 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
12030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12040 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12050 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12060 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
12070 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
12080 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
12090 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
120a0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
120b0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
120c0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
120d0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
120e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
120f0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
12100 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
12110 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
12120 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
12130 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12140 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12150 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
12160 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
12170 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
12180 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12190 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
121a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
121b0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
121c0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
121d0 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
121e0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
121f0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
12200 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
12210 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
12220 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
12230 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
12240 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
12250 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12260 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
12270 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
12280 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
12290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
122a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
122b0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
122c0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
122d0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
122e0 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
122f0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
12300 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
12310 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12320 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12340 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12350 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
12360 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
12370 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
12380 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
12390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
123a0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
123b0 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
123c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
123d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
123e0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
123f0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
12400 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12410 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
12420 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
12430 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12440 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
12450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
12460 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
12470 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12480 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
12490 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
124a0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
124b0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
124c0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
124d0 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
124e0 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
124f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12500 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12510 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12520 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
12540 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
12550 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12570 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125c0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
125d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12630 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
12640 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
12670 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
12680 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
12690 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
126a0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
126b0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
126c0 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
126d0 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
126e0 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
126f0 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
12700 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
12710 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
12720 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
12730 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
12740 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
12750 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
12760 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
12770 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
12780 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
12790 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
127a0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
127b0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
127c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
127d0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
127e0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
127f0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
12800 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
12810 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
12820 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
12830 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
12840 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
12850 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
12860 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
12870 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
12880 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
12890 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
128a0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
128b0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
128c0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
128d0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
128e0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
128f0 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b  tic int semCheck
12900 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
12910 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12920 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
12930 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12940 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12950 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12960 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12970 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
12980 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
129a0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
129b0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
129c0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
129d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
129e0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
129f0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12a00 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12a10 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12a20 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
12a30 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12a40 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12a50 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12a60 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12a70 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12a80 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12a90 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
12aa0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
12ab0 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20  node->pSem;.    
12ac0 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
12ad0 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Buf;..    if( se
12ae0 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
12af0 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
12b00 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12b10 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
12b20 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
12b30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12b40 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12b50 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12b60 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
12b70 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
12b80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12b90 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12ba0 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
12bb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
12bc0 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
12bd0 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
12be0 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
12bf0 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
12c00 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65   = (pFile->eFile
12c10 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f  Lock < SHARED_LO
12c20 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
12c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12c40 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
12c50 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
12c60 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73  */.      sem_pos
12c70 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  t(pSem);.    }. 
12c80 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
12c90 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12ca0 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d %d (sem)\n", p
12cb0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
12cc0 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
12cd0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
12ce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12cf0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12d00 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12d10 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12d20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12d30 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12d40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12d50 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12d60 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
12d70 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
12d80 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
12d90 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
12da0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
12db0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12dc0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
12dd0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
12de0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
12df0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
12e00 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
12e10 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
12e20 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
12e30 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
12e40 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
12e50 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
12e60 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
12e70 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
12e80 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
12e90 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
12ea0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
12eb0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
12ec0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
12ed0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
12ee0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
12ef0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
12f00 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
12f10 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
12f20 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12f30 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
12f40 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
12f50 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12f60 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
12f70 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
12f80 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
12f90 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
12fa0 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
12fb0 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
12fc0 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
12fd0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
12fe0 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
12ff0 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
13000 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
13010 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
13020 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
13030 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
13040 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
13050 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
13060 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
13070 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
13080 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
13090 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
130a0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
130b0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
130c0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
130d0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
130e0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
130f0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
13100 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
13110 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c   int semLock(sql
13120 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13130 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13140 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13150 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13160 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73  d;.  int fd;.  s
13170 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
13180 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
13190 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
131a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
131b0 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
131c0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
131d0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
131e0 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
131f0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
13200 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
13210 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
13220 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
13230 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13240 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
13250 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
13260 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
13270 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
13280 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
13290 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
132a0 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
132b0 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
132c0 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
132d0 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
132e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
132f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
13300 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
13310 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
13320 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
13330 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
13340 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13350 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
13360 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
13370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13380 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
13390 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
133a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
133b0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
133c0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
133d0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
133e0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
133f0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
13400 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
13410 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
13420 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
13430 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
13440 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
13450 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
13460 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
13470 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
13480 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f  atic int semUnlo
13490 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
134a0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
134b0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
134c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
134d0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
134e0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
134f0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
13500 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
13520 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13530 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
13540 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
13550 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13560 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70  eFileLock,..   p
13570 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
13580 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
13590 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
135a0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
135b0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
135c0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
135d0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
135e0 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
135f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13610 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
13620 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
13630 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
13640 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
13650 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
13660 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
13670 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
13680 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13690 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
136a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
136b0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
136c0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
136d0 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
136e0 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
136f0 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
13700 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
13710 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13720 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13730 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
13740 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
13750 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
13760 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
13770 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
13780 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
13790 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
137a0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
137b0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
137c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
137d0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
137e0 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
137f0 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
13800 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
13810 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
13820 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
13830 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13840 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
13850 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13860 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13870 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
13880 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
13890 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
138a0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
138b0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
138c0 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
138d0 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
138e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
138f0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
13900 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
13910 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
13920 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
13930 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
13940 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
13950 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13960 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
13970 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
13980 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
13990 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
139a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139e0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
139f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a50 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
13a60 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
13a90 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
13aa0 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
13ab0 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
13ac0 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
13ad0 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
13ae0 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
13af0 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
13b00 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
13b10 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
13b20 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
13b30 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
13b40 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
13b50 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
13b60 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
13b70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
13b80 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
13b90 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
13ba0 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
13bb0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13bc0 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
13bd0 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
13be0 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
13bf0 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
13c00 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
13c10 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
13c20 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
13c30 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
13c40 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
13c50 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
13c60 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
13c70 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13c80 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
13c90 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
13ca0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
13cb0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13cc0 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
13cd0 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
13ce0 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
13cf0 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
13d00 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
13d10 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
13d20 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
13d30 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
13d40 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
13d50 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
13d60 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
13d70 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
13d80 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
13d90 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
13da0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
13db0 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
13dc0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
13dd0 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
13de0 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
13df0 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
13e00 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
13e10 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
13e40 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
13e50 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
13e60 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
13e70 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
13e80 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
13e90 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
13ea0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
13eb0 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
13ec0 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
13ed0 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
13ee0 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
13ef0 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
13f00 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
13f10 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
13f20 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
13f30 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
13f40 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
13f50 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
13f60 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
13f70 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
13f80 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
13f90 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
13fa0 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
13fb0 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
13fc0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
13fd0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
13fe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
13ff0 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
14000 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
14010 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
14020 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
14030 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
14040 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
14050 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
14060 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
14070 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
14080 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
14090 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
140a0 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
140b0 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
140c0 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
140d0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
140e0 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
140f0 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
14100 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
14110 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
14120 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
14130 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
14140 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
14150 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
14160 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
14170 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
14180 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
14190 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
141a0 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
141b0 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
141c0 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
141d0 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
141e0 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
141f0 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
14200 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
14210 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
14220 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
14230 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
14240 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
14250 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14260 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
14270 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14280 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
14290 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
142a0 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
142b0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
142c0 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
142d0 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
142e0 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
142f0 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
14300 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
14310 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
14320 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
14330 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14340 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14360 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
14370 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
14380 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
14390 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
143a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
143b0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
143c0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
143d0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
143e0 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
143f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
14400 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
14410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
14420 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
14430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14450 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
14460 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
14470 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
14480 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
14490 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
144a0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
144b0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
144c0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
144d0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
144e0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
144f0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
14500 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
14510 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
14520 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
14530 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
14540 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
14550 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
14560 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
14570 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
14580 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
14590 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
145a0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
145b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
145c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
145d0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
145e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
145f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14600 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
14610 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
14620 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
14630 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
14640 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
14650 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  le );.  afpLocki
14660 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
14670 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
14680 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
14690 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
146a0 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d  ;.  if( context-
146b0 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  >reserved ){.   
146c0 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20   *pResOut = 1;. 
146d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
146e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
146f0 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
14700 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
14710 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
14720 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
14730 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  /.  .  /* Check 
14740 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
14750 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
14760 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
14770 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
14780 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
14790 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
147a0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
147b0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
147c0 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
147d0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
147e0 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
147f0 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
14800 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
14810 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
14820 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
14830 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
14840 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
14850 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
14860 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
14870 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
14880 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
14890 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
148a0 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
148b0 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
148c0 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
148d0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
148e0 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
148f0 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70  .      lrc = afp
14900 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
14910 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
14920 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
14930 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
14940 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
14950 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
14960 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
14970 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
14980 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
14990 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
149a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
149b0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
149c0 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
149d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
149e0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
149f0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
14a00 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
14a10 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %d (afp)\n", pF
14a20 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
14a30 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52  rved));.  .  *pR
14a40 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
14a50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14a60 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
14a70 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
14a80 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
14a90 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
14aa0 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
14ab0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
14ac0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
14ad0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
14ae0 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
14af0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
14b00 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
14b10 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
14b20 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
14b30 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
14b40 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
14b50 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
14b60 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
14b70 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
14b80 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
14b90 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
14ba0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
14bb0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
14bc0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
14bd0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
14be0 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
14bf0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
14c00 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
14c10 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
14c20 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
14c30 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
14c40 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
14c50 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
14c60 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
14c70 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
14c80 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
14c90 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14ca0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
14cb0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
14cc0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14cd0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
14ce0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
14cf0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
14d00 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
14d10 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
14d20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
14d30 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
14d40 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
14d50 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
14d60 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14d70 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14d80 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14d90 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33   afpLock(sqlite3
14da0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14db0 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  FileLock){.  int
14dc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14dd0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
14de0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14df0 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
14e00 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
14e10 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
14e20 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14e30 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
14e40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
14e50 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
14e60 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73  Context;.  .  as
14e70 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14e80 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
14e90 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
14ea0 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %s,%d) pid=%d (a
14eb0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
14ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
14ed0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
14ee0 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
14ef0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
14f00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
14f10 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e  ileLock(pInode->
14f20 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f  eFileLock), pIno
14f30 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65  de->nShared , ge
14f40 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
14f50 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
14f60 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
14f70 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
14f80 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
14f90 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
14fa0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
14fb0 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
14fc0 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
14fd0 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
14fe0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
14ff0 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
15000 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
15010 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15020 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
15030 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
15040 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
15050 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61  already held) (a
15060 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
15080 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
15090 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
150a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
150b0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
150c0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
150d0 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
150e0 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
150f0 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
15100 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
15110 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
15120 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
15130 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
15140 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
15150 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
15160 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
15170 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
15180 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
15190 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
151a0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
151b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
151c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
151d0 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
151e0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
151f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
15200 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
15210 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
15220 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
15230 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
15240 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
15250 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
15260 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74    .  /* This mut
15270 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
15280 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
15290 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
152a0 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
152b0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
152c0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
152d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
152e0 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
152f0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
15300 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
15310 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
15320 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
15330 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
15340 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
15350 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
15360 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
15370 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15380 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
15390 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28  ock && .       (
153a0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
153b0 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
153c0 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
153d0 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20  RED_LOCK)).     
153e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
153f0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
15400 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
15410 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61    }.  .  /* If a
15420 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
15430 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
15440 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
15450 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
15460 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
15470 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
15480 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
15490 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
154a0 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
154b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
154c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
154d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
154e0 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e  CK && .     (pIn
154f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
15500 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
15510 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
15520 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
15530 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15540 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15550 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
15560 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
15570 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
15580 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
15590 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
155a0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
155b0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
155c0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
155d0 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
155e0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
155f0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
15600 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20  ock;.  }.    .  
15610 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
15620 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
15630 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
15640 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
15650 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
15660 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
15670 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
15680 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
15690 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
156a0 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
156b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
156c0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
156d0 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
156e0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
156f0 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
15700 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
15710 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
15720 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20     int failed;. 
15730 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
15740 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15750 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
15760 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
15770 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
15780 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
15790 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67   failed;.      g
157a0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
157b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
157c0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
157d0 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
157e0 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
157f0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
15800 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
15810 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
15820 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
15830 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
15840 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15850 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15860 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20  int lrc1, lrc2, 
15870 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 6c  lrc1Errno;.    l
15880 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20  ong lk, mask;.  
15890 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
158a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
158b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
158c0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
158d0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ck==0 );.       
158e0 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69   .    mask = (si
158f0 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f  zeof(long)==8) ?
15900 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a   LARGEST_INT64 :
15910 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
15920 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
15930 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
15940 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
15950 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
15960 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
15970 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
15980 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
15990 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
159a0 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f  dom(); .    pIno
159b0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d  de->sharedByte =
159c0 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48   (lk & mask)%(SH
159d0 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
159e0 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
159f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
15a00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
15a10 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
15a20 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
15a30 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b  aredByte, 1, 1);
15a40 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
15a50 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a  _ERROR(lrc1) ){.
15a60 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20        lrc1Errno 
15a70 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
15a80 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
15a90 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
15aa0 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
15ab0 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61   */.    lrc2 = a
15ac0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15ad0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15ae0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
15af0 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20  1, 0);.    .    
15b00 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15b10 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20  R(lrc1) ) {.    
15b20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
15b30 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a  no = lrc1Errno;.
15b40 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
15b50 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
15b60 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
15b70 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b  else if( IS_LOCK
15b80 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a  _ERROR(lrc2) ){.
15b90 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b        rc = lrc2;
15ba0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
15bb0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
15bc0 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d  else if( lrc1 !=
15bd0 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20   SQLITE_OK ) {. 
15be0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
15bf0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
15c00 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15c10 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
15c20 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
15c30 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
15c40 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
15c50 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
15c60 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
15c70 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
15c80 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
15c90 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
15ca0 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
15cb0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
15cc0 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
15cd0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
15ce0 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
15cf0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
15d00 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
15d10 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
15d20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
15d30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
15d40 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
15d50 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
15d60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
15d70 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
15d80 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
15d90 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
15da0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
15db0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
15dc0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
15dd0 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
15de0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
15df0 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
15e00 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46  ck );.    if (eF
15e10 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52  ileLock >= RESER
15e20 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
15e30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52  e->eFileLock < R
15e40 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
15e50 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
15e60 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
15e70 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
15e80 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
15e90 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15ea0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
15eb0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20  ED_BYTE, 1,1);. 
15ec0 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64       if( !failed
15ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
15ee0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
15ef0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
15f00 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
15f10 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d   && eFileLock ==
15f20 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
15f30 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
15f40 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
15f50 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
15f60 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
15f70 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
15f80 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
15f90 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
15fa0 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
15fb0 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
15fc0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
15fd0 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
15fe0 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
15ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16000 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
16010 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16020 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16030 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
16060 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
16070 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
16080 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
16090 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
160a0 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
160b0 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
160c0 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
160d0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
160e0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
160f0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16100 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
16110 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16130 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
16140 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
16150 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
16160 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
16170 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16180 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
161b0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
161c0 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20  te, 1, 1)) ){.  
161d0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74          /* Can't
161e0 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
161f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53   shared lock.  S
16200 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c  qlite can't deal
16210 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  , this is.      
16220 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61      ** a critica
16230 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20  l I/O error.    
16240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16250 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64     rc = ((failed
16260 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
16270 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
16280 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20  ) ? failed2 : . 
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
162a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
162b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
162c0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
162d0 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
162e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
162f0 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20   = failed; .    
16300 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16310 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ( failed ){.    
16320 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
16330 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66     }.  }.  .  if
16340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16350 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
16360 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
16370 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
16380 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
16390 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
163a0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
163b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
163c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
163d0 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
163e0 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
163f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
16400 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
16410 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a    .afp_end_lock:
16420 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
16430 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
16440 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
16450 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  s (afp)\n", pFil
16460 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
16470 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
16480 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
16490 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
164a0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
164b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
164c0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
164d0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
164e0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
164f0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
16500 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
16510 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
16520 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
16530 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
16540 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
16550 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
16560 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
16570 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
16580 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
16590 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
165a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
165b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
165c0 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
165d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
165e0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
165f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16600 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
16610 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16620 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
16630 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
16640 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
16650 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
16660 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
16670 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
16680 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
16690 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20   int skipShared 
166a0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
166b0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20  TE_TEST.  int h 
166c0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64  = pFile->h;.#end
166d0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
166e0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
166f0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
16700 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
16710 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
16720 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
16730 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
16740 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16750 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
16760 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
16770 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
16780 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67  ed,.           g
16790 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
167a0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
167b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
167c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
167d0 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
167e0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
167f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16800 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16810 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
16820 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
16830 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
16840 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
16850 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16860 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
16870 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16880 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16890 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
168a0 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  ck );.    Simula
168b0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
168c0 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  1);.    Simulate
168d0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
168e0 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ).    SimulateIO
168f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16900 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44 45      .#ifndef NDE
16910 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  BUG.    /* When 
16920 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20  reducing a lock 
16930 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20  such that other 
16940 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74  processes can st
16950 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  art.    ** readi
16960 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
16970 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65  file again, make
16980 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20   sure that the. 
16990 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
169a0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  n counter was up
169b0 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72  dated if any par
169c0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
169d0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68  e.    ** file ch
169e0 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
169f0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
16a00 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65  er is not update
16a10 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  d,.    ** other 
16a20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
16a30 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67  he same file mig
16a40 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  ht not realize t
16a50 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  hat.    ** the f
16a60 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
16a70 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
16a80 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
16a90 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63  h their.    ** c
16aa0 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f  ache.  The use o
16ab0 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20  f a stale cache 
16ac0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
16ad0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
16ae0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
16af0 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
16b00 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
16b10 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
16b20 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20  >dbUpdate==0.   
16b30 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
16b40 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
16b50 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
16b60 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
16b70 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a   0;.#endif.    .
16b80 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65      if( pFile->e
16b90 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
16ba0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
16bb0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
16bc0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16bd0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
16be0 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
16bf0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  IZE, 0);.      i
16c00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16c10 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
16c20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
16c30 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
16c40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16c50 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73  only re-establis
16c60 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
16c70 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  k if necessary *
16c80 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68  /.        int sh
16c90 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
16ca0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
16cb0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
16cc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
16cd0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16ce0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16cf0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
16d00 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65  1, 1);.      } e
16d10 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b  lse {.        sk
16d20 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  ipShared = 1;.  
16d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16d40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16d50 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
16d60 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
16d70 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
16d80 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16d90 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16da0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16db0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
16dc0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16dd0 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
16de0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45  >eFileLock>=RESE
16df0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e  RVED_LOCK && con
16e00 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
16e10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
16e20 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16e30 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16e40 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
16e50 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
16e60 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20  !rc ){ .        
16e70 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
16e80 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a  d = 0; .      }.
16e90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
16ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
16eb0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16ec0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
16ed0 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20  ->nShared>1)){. 
16ee0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
16ef0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
16f00 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
16f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16f20 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  _OK && eFileLock
16f30 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20  ==NO_LOCK ){..  
16f40 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
16f50 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
16f60 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
16f70 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
16f80 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
16f90 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
16fa0 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
16fb0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
16fc0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
16fd0 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
16fe0 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
16ff0 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
17000 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
17010 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
17020 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
17030 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
17040 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
17050 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
17060 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
17070 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
17080 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
17090 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
170a0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
170b0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
170c0 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70  .      if( !skip
170d0 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  Shared ){.      
170e0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
170f0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17100 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
17110 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b  LockByte, 1, 0);
17120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17130 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
17140 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
17150 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
17160 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
17170 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
17180 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
17190 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
171a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
171b0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
171c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
171d0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
171e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
171f0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
17200 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65  .        closePe
17210 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
17220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17230 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
17240 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
17250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
17260 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17270 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
17280 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17290 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
172a0 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73   & cleanup AFP s
172b0 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20  pecific locking 
172c0 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74  context .*/.stat
172d0 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28  ic int afpClose(
172e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
172f0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
17300 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
17310 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
17320 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17330 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61  xFile*)id;.    a
17340 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
17350 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
17360 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
17370 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
17380 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e  de && pFile->pIn
17390 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
173a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
173b0 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
173c0 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
173d0 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
173e0 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20   file just.     
173f0 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
17400 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
17410 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
17420 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
17430 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
17440 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
17450 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
17460 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
17470 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
17480 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hen.      ** the
17490 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
174a0 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
174b0 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
174c0 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
174d0 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
174e0 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
174f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17500 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
17510 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  text);.    rc = 
17520 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
17530 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
17540 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72  Mutex();.  }.  r
17550 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
17560 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
17570 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
17580 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
17590 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
175a0 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
175b0 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   is the AFP lock
175c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
175d0 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
175e0 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
175f0 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
17600 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
17610 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
17620 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
17630 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
17640 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f   If you don't co
17650 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c  mpile for a mac,
17660 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d   then the "unix-
17670 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e  afp".** VFS is n
17680 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ot available..**
17690 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
176a0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
176b0 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
176c0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
176d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
176e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
176f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
17730 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
17740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17780 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
17790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
177a0 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20  gin NFS Locking 
177b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
177d0 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
177e0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
177f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
17800 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20  NG_STYLE./*. ** 
17810 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
17820 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
17830 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
17840 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
17850 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75  eFileLock. ** mu
17860 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
17870 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
17880 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20  OCK.. **. ** If 
17890 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
178a0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
178b0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
178c0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
178d0 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
178e0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
178f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17900 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74   a no-op.. */.st
17910 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f  atic int nfsUnlo
17920 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
17930 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
17940 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
17950 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
17960 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a  ileLock, 1);.}..
17970 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
17980 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
17990 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
179a0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
179b0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
179c0 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c  ove is the NFS l
179d0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
179e0 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
179f0 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
17a00 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
17a10 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
17a20 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
17a30 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
17a40 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
17a50 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  e.  .**.********
17a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
17a70 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63  d of the NFS loc
17a80 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
17a90 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
17aa0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
17ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17af0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
17b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
17b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f  ********* Non-lo
17b60 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69  cking sqlite3_fi
17b70 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le methods *****
17b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b90 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
17ba0 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e  he next division
17bb0 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d   contains implem
17bc0 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c  entations for al
17bd0 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  l methods of the
17be0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c   .** sqlite3_fil
17bf0 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74  e object other t
17c00 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  han the locking 
17c10 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f  methods.  The lo
17c20 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73  cking.** methods
17c30 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e   were defined in
17c40 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65   divisions above
17c50 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65   (one locking me
17c60 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69  thod per.** divi
17c70 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65  sion).  Those me
17c80 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63  thods that are c
17c90 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
17ca0 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72  king modes.** ar
17cb0 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65  e gather togethe
17cc0 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69  r into this divi
17cd0 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  sion..*/../*.** 
17ce0 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
17cf0 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  et passed as the
17d00 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17d10 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  , then read cnt 
17d20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70  .** bytes into p
17d30 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20  Buf. Return the 
17d40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17d50 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a  actually read..*
17d60 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75  *.** NB:  If you
17d70 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
17d80 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34  D or USE_PREAD64
17d90 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
17da0 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73  also.** be neces
17db0 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f  sary to define _
17dc0 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20  XOPEN_SOURCE to 
17dd0 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61  be 500.  This va
17de0 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65  ries from.** one
17df0 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68   system to anoth
17e00 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74  er.  Since SQLit
17e10 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e  e does not defin
17e20 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61  e USE_PREAD.** a
17e30 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64  ny any form by d
17e40 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20  efault, we will 
17e50 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64  not attempt to d
17e60 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
17e70 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b  RCE..** See tick
17e80 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32  ets #2741 and #2
17e90 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  681..**.** To av
17ea0 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
17eb0 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
17ec0 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68  a failed read th
17ed0 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
17ee0 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
17ef0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
17f00 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
17f10 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65  AndRead(unixFile
17f20 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
17f30 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64  t64 offset, void
17f40 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
17f50 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66  {.  int got;.#if
17f60 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
17f70 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
17f80 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
17f90 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
17fa0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
17fb0 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
17fc0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
17fd0 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65 61  do{ got = osPrea
17fe0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
17ff0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
18000 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
18010 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
18020 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18030 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
18040 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
18050 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f  READ64).  do{ go
18060 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64  t = osPread64(id
18070 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
18080 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28  offset); }while(
18090 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
180a0 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75 6c  =EINTR);.  Simul
180b0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
180c0 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
180d0 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
180e0 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
180f0 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69   SEEK_SET);.  Si
18100 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
18110 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
18120 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
18130 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28  ffset ){.    if(
18140 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
18150 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78   ){.      ((unix
18160 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18170 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28    }else{.      (
18190 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
181a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09  lastErrno = 0;..
181b0 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ..    }.    retu
181c0 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f 7b  rn -1;.  }.  do{
181d0 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64   got = osRead(id
181e0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
181f0 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
18200 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
18210 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
18220 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
18230 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
18240 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18250 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
18260 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
18270 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
18280 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
18290 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
182a0 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
182b0 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
182c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
182d0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
182e0 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
182f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18300 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
18310 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
18320 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
18330 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
18340 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18350 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
18360 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
18370 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
18380 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
18390 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
183a0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
183b0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
183c0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
183d0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f  e *)id;.  int go
183e0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
183f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
18400 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
18410 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
18420 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
18430 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
18440 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
18450 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
18460 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
18470 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
18480 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
18490 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
184a0 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
184b0 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
184c0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
184d0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
184e0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
184f0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
18500 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
18510 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
18520 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
18530 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
18540 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18550 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
18560 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
18570 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
18580 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
18590 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
185a0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
185b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
185c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
185d0 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
185e0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
185f0 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
18600 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
18610 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
18620 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
18630 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
18640 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
18650 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
18660 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
18670 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
18680 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
18690 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
186a0 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
186b0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
186c0 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
186d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
186e0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
186f0 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
18700 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
18710 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
18720 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
18730 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
18740 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
18750 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
18760 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
18770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
18780 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
18790 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
187a0 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
187b0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
187c0 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28    int got;.#if (
187d0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
187e0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
187f0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
18800 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
18810 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
18820 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
18830 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f  (USE_PREAD).  do
18840 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65  { got = osPwrite
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 20 7d 77 68 69  t, offset); }whi
18870 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
18880 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#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 64 6f 7b 20 67 6f  READ64).  do{ go
188b0 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69  t = osPwrite64(i
188c0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
188d0 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28   offset);}while(
188e0 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
188f0 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20  =EINTR);.#else. 
18900 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
18910 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
18920 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53  , SEEK_SET);.  S
18930 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18940 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
18950 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
18960 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
18970 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
18980 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
18990 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
189a0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
189b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189c0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
189d0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
189e0 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
189f0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f  urn -1;.  }.  do
18a00 7b 20 67 6f 74 20 3d 20 6f 73 57 72 69 74 65 28  { got = osWrite(
18a10 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18a20 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
18a30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
18a40 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d   );.#endif.  TIM
18a50 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
18a60 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
18a70 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18a80 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18a90 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
18aa0 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
18ab0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
18ac0 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
18ad0 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
18ae0 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
18af0 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
18b00 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
18b10 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
18b20 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
18b30 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
18b40 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
18b50 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
18b60 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
18b70 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
18b80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18b90 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
18ba0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
18bb0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
18bc0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
18bd0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
18be0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
18bf0 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
18c00 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
18c10 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
18c20 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
18c30 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
18c40 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
18c50 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
18c60 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
18c70 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
18c80 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
18c90 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
18ca0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
18cb0 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
18cc0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
18cd0 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
18ce0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
18cf0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
18d00 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
18d10 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
18d20 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
18d30 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
18d40 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
18d50 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
18d60 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
18d70 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
18d80 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
18d90 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
18da0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
18db0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
18dc0 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
18dd0 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
18de0 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
18df0 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
18e00 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
18e10 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
18e20 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
18e30 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
18e40 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
18e50 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
18e60 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
18e70 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
18e80 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
18e90 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
18ea0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
18eb0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
18ec0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
18ed0 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
18ee0 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
18ef0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
18f00 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
18f10 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
18f20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18f30 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
18f40 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
18f50 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
18f60 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
18f70 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18f80 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
18f90 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
18fa0 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
18fb0 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
18fc0 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
18fd0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
18fe0 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
18ff0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
19000 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
19010 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
19020 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
19030 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d  dif..  while( am
19040 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
19050 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
19060 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
19070 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
19080 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
19090 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
190a0 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
190b0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
190c0 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
190d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
190e0 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
190f0 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
19100 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
19110 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
19120 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ..  if( amt>0 ){
19130 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
19140 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45   && pFile->lastE
19150 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a  rrno!=ENOSPC ){.
19160 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72        /* lastErr
19170 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
19180 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
19190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
191a0 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
191b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
191c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  e->lastErrno = 0
191d0 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65  ; /* not a syste
191e0 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  m error */.     
191f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
19200 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
19210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19220 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
19230 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
19240 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
19250 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
19260 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
19270 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
19280 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
19290 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
192a0 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20  s are occurring 
192b0 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
192c0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
192d0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
192e0 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
192f0 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
19300 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
19310 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74   We do not trust
19320 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76   systems to prov
19330 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64  ide a working fd
19340 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65  atasync().  Some
19350 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64   do..** Others d
19360 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66  o no.  To be saf
19370 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b  e, we will stick
19380 20 77 69 74 68 20 74 68 65 20 28 73 6c 6f 77 65   with the (slowe
19390 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49  r) fsync()..** I
193a0 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20  f you know that 
193b0 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73  your system does
193c0 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79   support fdatasy
193d0 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a  nc() correctly,.
193e0 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63  ** then simply c
193f0 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64  ompile with -Dfd
19400 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e  atasync=fdatasyn
19410 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  c.*/.#if !define
19420 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20  d(fdatasync) && 
19430 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78  !defined(__linux
19440 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61  __).# define fda
19450 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
19460 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
19470 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
19480 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
19490 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
194a0 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
194b0 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
194c0 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
194d0 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
194e0 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
194f0 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
19500 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
19510 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
19520 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
19530 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
19540 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
19550 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
19560 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
19570 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
19580 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
19590 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
195a0 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
195b0 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
195c0 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
195d0 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
195e0 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
195f0 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
19600 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
19610 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
19620 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
19630 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
19640 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
19650 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
19660 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
19670 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
19680 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
19690 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
196a0 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
196b0 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
196c0 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
196d0 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
196e0 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
196f0 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
19700 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
19710 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
19720 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
19730 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
19740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19750 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  e..**.** SQLite 
19760 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c  sets the dataOnl
19770 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69  y flag if the si
19780 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
19790 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  s unchanged..** 
197a0 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20  The idea behind 
197b0 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74  dataOnly is that
197c0 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20   it should only 
197d0 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63  write the file c
197e0 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73  ontent.** to dis
197f0 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65  k, not the inode
19800 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64  .  We only set d
19810 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66  ataOnly if the f
19820 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20  ile size is .** 
19830 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  unchanged since 
19840 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
19850 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f   part of the ino
19860 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a  de.  However, .*
19870 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73  * Ted Ts'o tells
19880 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79   us that fdatasy
19890 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77  nc() will also w
198a0 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69  rite the inode i
198b0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69  f the.** file si
198c0 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ze has changed. 
198d0 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64   The only real d
198e0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
198f0 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a  n fdatasync().**
19900 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65   and fsync(), Te
19910 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74  d tells us, is t
19920 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
19930 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74  will not flush t
19940 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74  he.** inode if t
19950 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65  he mtime or owne
19960 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65  r or other inode
19970 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65   attributes have
19980 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20   changed..** We 
19990 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
199a0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e  the file size, n
199b0 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c  ot the other fil
199c0 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f  e attributes, so
199d0 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51  .** as far as SQ
199e0 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65  Lite is concerne
199f0 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28  d, an fdatasync(
19a00 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71  ) is always adeq
19a10 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20  uate..** So, we 
19a20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61  always use fdata
19a30 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20  sync() if it is 
19a40 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72  available, regar
19a50 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20  dless of.** the 
19a60 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
19a70 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73  aOnly flag..*/.s
19a80 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
19a90 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
19aa0 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
19ab0 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
19ac0 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  rc;..  /* The fo
19ad0 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65  llowing "ifdef/e
19ae0 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b  lif/else/" block
19af0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74   has the same st
19b00 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20  ructure as.  ** 
19b10 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49  the one below. I
19b20 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20  t is replicated 
19b30 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61  here solely to a
19b40 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20  void cluttering 
19b50 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61  .  ** up the rea
19b60 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20  l code with the 
19b70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19b80 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a  () macros..  */.
19b90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
19ba0 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  _SYNC.  UNUSED_P
19bb0 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
19bc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19bd0 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
19be0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
19bf0 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20  ataOnly);.#elif 
19c00 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
19c10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19c20 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
19c30 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
19c40 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
19c50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19c60 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
19c70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f  endif..  /* Reco
19c80 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
19c90 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64   times that we d
19ca0 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63  o a normal fsync
19cb0 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c  () and .  ** FUL
19cc0 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20  LSYNC.  This is 
19cd0 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74  used during test
19ce0 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
19cf0 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  at this procedur
19d00 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c  e.  ** gets call
19d10 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  ed with the corr
19d20 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ect arguments.. 
19d30 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
19d40 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c  E_TEST.  if( ful
19d50 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f  lSync ) sqlite3_
19d60 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
19d70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  ;.  sqlite3_sync
19d80 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
19d90 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
19da0 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
19db0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
19dc0 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
19dd0 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
19de0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
19df0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63  ITE_NO_SYNC.  rc
19e00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
19e10 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
19e20 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
19e30 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c ){.    rc = os
19e40 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
19e50 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
19e60 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
19e70 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
19e80 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
19e90 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
19ea0 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
19eb0 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
19ec0 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
19ed0 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
19ee0 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
19ef0 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
19f00 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
19f10 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
19f20 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
19f30 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
19f40 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
19f50 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
19f60 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
19f70 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
19f80 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
19f90 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
19fa0 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
19fb0 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
19fc0 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
19fd0 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
19fe0 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
19ff0 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1a000 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1a010 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1a020 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1a030 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1a040 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1a050 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1a060 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1a070 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1a080 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1a090 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1a0a0 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1a0b0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1a0c0 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1a0d0 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1a0e0 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1a0f0 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1a100 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1a110 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1a120 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1a130 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1a140 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1a150 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1a160 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1a170 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1a180 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1a190 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1a1a0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1a1b0 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1a1c0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1a1d0 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1a1e0 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1a1f0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1a200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a210 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
1a220 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
1a230 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
1a240 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
1a250 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
1a260 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
1a270 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
1a280 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
1a290 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
1a2a0 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
1a2b0 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
1a2c0 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
1a2d0 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
1a2e0 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
1a2f0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
1a300 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
1a310 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1a320 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
1a330 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
1a340 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
1a350 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
1a360 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
1a370 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1a380 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
1a390 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
1a3a0 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
1a3b0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
1a3c0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
1a3d0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
1a3e0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
1a3f0 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
1a400 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
1a410 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
1a420 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
1a430 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
1a440 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
1a450 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
1a460 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
1a470 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1a480 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
1a490 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
1a4a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1a4b0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
1a4c0 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
1a4d0 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
1a4e0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
1a4f0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1a500 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
1a510 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
1a520 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
1a530 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1a540 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1a550 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c  .  int isDataOnl
1a560 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54  y = (flags&SQLIT
1a570 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29  E_SYNC_DATAONLY)
1a580 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79  ;.  int isFullsy
1a590 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46  nc = (flags&0x0F
1a5a0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1a5b0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ULL;..  /* Check
1a5c0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
1a5d0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
1a5e0 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
1a5f0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
1a600 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1a610 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
1a620 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
1a630 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1a640 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
1a650 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
1a660 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
1a670 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1a680 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
1a690 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
1a6a0 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
1a6b0 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
1a6c0 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
1a6d0 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
1a6e0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1a6f0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1a700 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61  ITE_FULL );..  a
1a710 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1a720 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
1a730 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69      %-3d\n", pFi
1a740 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20  le->h));.  rc = 
1a750 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
1a760 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
1a770 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
1a780 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1a790 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1a7a0 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
1a7b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a7c0 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  o;.    return un
1a7d0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1a7e0 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
1a7f0 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
1a800 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
1a810 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
1a820 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  fd>=0 ){.    OST
1a830 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25  RACE(("DIRSYNC %
1a840 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73  -3d (have_fullfs
1a850 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1a860 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  %d)\n", pFile->d
1a870 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  irfd,.          
1a880 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1a890 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
1a8a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1a8b0 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
1a8c0 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
1a8d0 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79  ory sync is only
1a8e0 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75   attempted if fu
1a8f0 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20  ll_fsync is.    
1a900 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72  ** turned off or
1a910 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49   unavailable.  I
1a920 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f  f a full_fsync o
1a930 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20  ccurred above,. 
1a940 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64     ** then the d
1a950 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
1a960 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20   superfluous..  
1a970 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48    */.    if( (!H
1a980 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c  AVE_FULLFSYNC ||
1a990 20 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26   !isFullsync) &&
1a9a0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
1a9b0 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b  e->dirfd,0,0) ){
1a9c0 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20  .       /*.     
1a9d0 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63    ** We have rec
1a9e0 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72  eived multiple r
1a9f0 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28  eports of fsync(
1aa00 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  ) returning.    
1aa10 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65     ** errors whe
1aa20 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72  n applied to dir
1aa30 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74  ectories on cert
1aa40 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ain file systems
1aa50 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61  ..       ** A fa
1aa60 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73  iled directory s
1aa70 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67  ync is not a big
1aa80 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65   deal.  So it se
1aa90 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65  ems.       ** be
1aaa0 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74  tter to ignore t
1aab0 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65  he error.  Ticke
1aac0 74 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a  t #1657.       *
1aad0 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c  /.       /* pFil
1aae0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1aaf0 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20  rrno; */.       
1ab00 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  /* return SQLITE
1ab10 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d  _IOERR; */.    }
1ab20 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 4f  .#endif.    /* O
1ab30 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63  nly need to sync
1ab40 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20   once, so close 
1ab50 74 68 65 20 20 64 69 72 65 63 74 6f 72 79 20 77  the  directory w
1ab60 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 20  hen we are done 
1ab70 2a 2f 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  */.    robust_cl
1ab80 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
1ab90 2d 3e 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ->dirfd, __LINE_
1aba0 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64  _);.    pFile->d
1abb0 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  irfd = -1;.  }. 
1abc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1abd0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
1abe0 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
1abf0 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
1ac00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1ac10 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
1ac20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1ac30 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69  nByte){.  unixFi
1ac40 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1ac50 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1ac60 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1ac70 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
1ac80 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1ac90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1aca0 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f  TRUNCATE );..  /
1acb0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
1acc0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
1acd0 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
1ace0 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
1acf0 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
1ad00 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
1ad10 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
1ad20 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
1ad30 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
1ad40 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
1ad50 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
1ad60 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
1ad70 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
1ad80 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
1ad90 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
1ada0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b  File->szChunk ){
1adb0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
1adc0 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
1add0 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
1ade0 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
1adf0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
1ae00 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f  ..  rc = robust_
1ae10 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1ae20 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65  >h, (off_t)nByte
1ae30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1ae40 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1ae50 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1ae60 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1ae70 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1ae80 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
1ae90 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
1aea0 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
1aeb0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1aec0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1aed0 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
1aee0 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
1aef0 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
1af00 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64  osed to.    ** d
1af10 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1af20 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1af30 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1af40 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1af50 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64  .    ** normal d
1af60 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e  atabase file) an
1af70 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68  d we truncate th
1af80 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
1af90 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68  ength,.    ** th
1afa0 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75  at effectively u
1afb0 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1afc0 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  e counter.  This
1afd0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20   might happen.  
1afe0 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72    ** when restor
1aff0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75  ing a database u
1b000 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  sing the backup 
1b010 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  API from a zero-
1b020 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f  length.    ** so
1b030 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  urce..    */.   
1b040 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
1b050 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79  rmalWrite && nBy
1b060 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  te==0 ){.      p
1b070 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1b080 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  hng = 1;.    }.#
1b090 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72  endif..    retur
1b0a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b0b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
1b0c0 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
1b0d0 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
1b0e0 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
1b0f0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69  c int unixFileSi
1b100 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1b110 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  *id, i64 *pSize)
1b120 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
1b130 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
1b140 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1b150 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28   rc = osFstat(((
1b160 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
1b170 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
1b180 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1b190 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
1b1a0 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
1b1b0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
1b1c0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
1b1d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b1e0 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
1b1f0 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
1b200 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
1b210 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
1b220 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
1b230 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
1b240 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
1b250 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
1b260 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
1b270 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
1b280 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
1b290 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
1b2a0 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
1b2b0 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
1b2c0 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
1b2d0 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
1b2e0 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
1b2f0 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
1b300 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
1b310 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
1b320 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
1b330 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
1b340 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
1b350 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
1b360 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
1b370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b380 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1b390 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1b3a0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1b3b0 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
1b3c0 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
1b3d0 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
1b3e0 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
1b3f0 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
1b400 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
1b410 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
1b420 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1b430 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
1b440 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1b450 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
1b460 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
1b470 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1b480 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c  o handle the SQL
1b490 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1b4a0 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e  INT .** file-con
1b4b0 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  trol operation..
1b4c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  **.** If the use
1b4d0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1b4e0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1b4f0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 69 74 20  r this file, it 
1b500 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68 61 74  could be.** that
1b510 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73 20   the file needs 
1b520 74 6f 20 62 65 20 65 78 74 65 6e 64 65 64 20 61  to be extended a
1b530 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 4f 74  t this point. Ot
1b540 68 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a 20  herwise, the.** 
1b550 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1b560 45 5f 48 49 4e 54 20 6f 70 65 72 61 74 69 6f 6e  E_HINT operation
1b570 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
1b580 55 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Unix..*/.static 
1b590 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  int fcntlSizeHin
1b5a0 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1b5b0 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  e, i64 nByte){. 
1b5c0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1b5d0 75 6e 6b 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  unk ){.    i64 n
1b5e0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1b5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1b600 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1b610 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
1b620 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  t buf;          
1b630 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68      /* Used to h
1b640 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65  old return value
1b650 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a  s of fstat() */.
1b660 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73     .    if( osFs
1b670 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
1b680 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  uf) ) return SQL
1b690 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1b6a0 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
1b6b0 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
1b6c0 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
1b6d0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1b6e0 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
1b6f0 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
1b700 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
1b710 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
1b720 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
1b730 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
1b740 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
1b750 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
1b760 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
1b770 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
1b780 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
1b790 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
1b7a0 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
1b7b0 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
1b7c0 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
1b7d0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
1b7e0 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
1b7f0 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
1b800 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
1b810 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
1b820 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
1b830 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
1b840 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
1b850 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
1b860 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
1b870 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
1b880 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
1b890 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
1b8a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
1b8b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b8c0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
1b8d0 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
1b8e0 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
1b8f0 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
1b900 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
1b910 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20   First use.     
1b920 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20   ** ftruncate() 
1b930 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20  to set the file 
1b940 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65  size, then write
1b950 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
1b960 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  o.      ** the l
1b970 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68  ast byte in each
1b980 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68   block within th
1b990 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1b9a0 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a  n. This.      **
1b9b0 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63   is the same tec
1b9c0 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67  hnique used by g
1b9d0 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  libc to implemen
1b9e0 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  t posix_fallocat
1b9f0 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  e().      ** on 
1ba00 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20  systems that do 
1ba10 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1ba20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74  fallocate() syst
1ba30 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  em call..      *
1ba40 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1ba50 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1ba60 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1ba70 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1ba80 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1ba90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1baa0 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1bab0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1bac0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75  ..      if( robu
1bad0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1bae0 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b  le->h, nSize) ){
1baf0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1bb00 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1bb10 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
1bb20 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1bb30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1bb40 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1bb50 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1bb60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bb70 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73  iWrite = ((buf.s
1bb80 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20  t_size + 2*nBlk 
1bb90 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d  - 1)/nBlk)*nBlk-
1bba0 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
1bbb0 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a  iWrite<nSize ){.
1bbc0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69          int nWri
1bbd0 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1bbe0 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c  e(pFile, iWrite,
1bbf0 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   "", 1);.       
1bc00 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29   if( nWrite!=1 )
1bc10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1bc20 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1bc30 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42      iWrite += nB
1bc40 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  lk;.      }.#end
1bc50 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
1bc60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bc70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  ;.}../*.** Infor
1bc80 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72  mation and contr
1bc90 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69  ol of an open fi
1bca0 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
1bcb0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1bcc0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1bcd0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
1bce0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1bcf0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1bd00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bd10 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1bd20 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1bd30 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c  pArg = ((unixFil
1bd40 65 2a 29 69 64 29 2d 3e 65 46 69 6c 65 4c 6f 63  e*)id)->eFileLoc
1bd50 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
1bd60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1bd70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bd80 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
1bd90 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1bda0 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
1bdb0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  d)->lastErrno;. 
1bdc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bdd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1bde0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1bdf0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
1be00 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
1be10 65 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20  e*)id)->szChunk 
1be20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
1be30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1be40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1be50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1be60 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
1be70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 63  .      return fc
1be80 6e 74 6c 53 69 7a 65 48 69 6e 74 28 28 75 6e 69  ntlSizeHint((uni
1be90 78 46 69 6c 65 20 2a 29 69 64 2c 20 2a 28 69 36  xFile *)id, *(i6
1bea0 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 7d  4 *)pArg);.    }
1beb0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1bec0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1bed0 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1bee0 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1bef0 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1bf00 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1bf10 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1bf20 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1bf30 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1bf40 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1bf50 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1bf60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1bf70 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1bf80 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1bf90 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1bfa0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1bfb0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1bfc0 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1bfd0 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1bfe0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1bff0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c000 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1c010 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c020 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1c030 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c040 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1c050 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
1c060 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1c070 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
1c080 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
1c090 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
1c0a0 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
1c0b0 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
1c0c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1c0d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1c0e0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1c0f0 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61  PLE__) */.    ca
1c100 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1c110 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a  SYNC_OMITTED: {.
1c120 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c130 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f  ITE_OK;  /* A no
1c140 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  -op */.    }.  }
1c150 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c160 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1c170 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1c180 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1c190 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1c1a0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1c1b0 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1c1c0 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1c1d0 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1c1e0 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1c1f0 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1c200 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1c210 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1c220 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1c230 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1c240 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1c250 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1c260 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1c270 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1c280 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1c290 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1c2a0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1c2b0 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1c2c0 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1c2d0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1c2e0 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1c2f0 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1c300 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1c310 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1c320 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1c330 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c340 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1c350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
1c360 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1c370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c380 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
1c390 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
1c3a0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
1c3b0 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20  is always 0 for 
1c3c0 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
1c3d0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
1c3e0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1c3f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1c400 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1c410 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1c420 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1c430 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c440 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
1c450 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1c460 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
1c470 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
1c480 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
1c490 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1c4a0 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
1c4b0 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
1c4c0 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
1c4d0 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
1c4e0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
1c4f0 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
1c500 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1c510 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
1c520 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1c530 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
1c540 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
1c550 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
1c560 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
1c570 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1c580 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
1c590 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
1c5a0 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
1c5b0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1c5c0 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
1c5d0 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
1c5e0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
1c5f0 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
1c600 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
1c610 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
1c620 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1c630 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
1c640 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
1c650 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
1c660 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
1c670 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
1c680 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
1c690 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
1c6a0 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
1c6b0 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
1c6c0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1c6d0 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1c6e0 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
1c6f0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1c700 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1c710 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
1c720 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
1c730 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1c740 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
1c750 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
1c760 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
1c770 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
1c780 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1c790 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1c7a0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
1c7b0 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
1c7c0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1c7d0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1c7e0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1c7f0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
1c800 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1c810 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1c820 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
1c830 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1c840 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
1c850 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
1c860 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
1c870 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1c880 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1c890 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1c8a0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1c8b0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1c8c0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1c8d0 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
1c8e0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1c8f0 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
1c900 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
1c910 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
1c920 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1c930 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
1c940 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
1c950 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
1c960 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1c970 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1c980 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
1c990 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
1c9c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1c9d0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9f0 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
1ca00 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1ca10 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca30 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
1ca40 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  pRegion */.  cha
1ca50 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1ca60 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1ca70 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1ca80 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1ca90 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1cac0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1cad0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1cae0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1caf0 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1cb00 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1cb10 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1cb20 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1cb30 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1cb40 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1cb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1cb60 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1cb70 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1cb80 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1cb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1cba0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1cbb0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1cbc0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1cbd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1cbe0 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1cbf0 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1cc00 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1cc10 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1cc20 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1cc30 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1cc40 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1cc50 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1cc60 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1cc70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1cc80 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1cc90 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1cca0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1ccb0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1ccc0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1ccd0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1cce0 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1ccf0 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1cd00 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1cd10 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1cd20 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1cd30 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1cd40 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1cd50 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1cd60 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1cd70 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1cd80 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1cd90 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1cda0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1cdb0 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1cdc0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1cdd0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1cde0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1cdf0 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1ce00 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1ce10 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1ce20 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1ce30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ce40 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1ce50 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1ce60 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
1ce70 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1ce80 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1ce90 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1cea0 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1ceb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1cec0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1ced0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1cee0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1cef0 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1cf20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1cf30 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
1cf40 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1cf50 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1cf60 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1cf70 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
1cf80 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
1cf90 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
1cfa0 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
1cfb0 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
1cfc0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
1cfd0 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
1cfe0 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
1cff0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
1d000 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
1d010 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
1d020 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1d030 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
1d040 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
1d050 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
1d060 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
1d070 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
1d080 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
1d090 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
1d0a0 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
1d0b0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1d0c0 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
1d0d0 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  emLock(.  unixSh
1d0e0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c  mNode *pShmNode,
1d0f0 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
1d100 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
1d110 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1d120 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
1d130 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Type,          /
1d140 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c  * F_UNLCK, F_RDL
1d150 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a  CK, or F_WRLCK *
1d160 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1d170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1d180 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
1d190 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f  locking range */
1d1a0 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
1d1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d1c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1d1d0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
1d1e0 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
1d1f0 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
1d200 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
1d210 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1d220 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d230 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  OK;   /* Result 
1d240 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
1d250 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
1d260 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
1d270 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1d280 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1d290 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1d2a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d2b0 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
1d2c0 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d  ->mutex) || pShm
1d2d0 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  Node->nRef==0 );
1d2e0 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
1d2f0 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
1d300 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
1d310 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
1d320 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
1d330 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
1d340 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
1d350 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
1d360 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
1d370 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1d380 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1d390 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
1d3a0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1d3b0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
1d3c0 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  eters */.    mem
1d3d0 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
1d3e0 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74  f(f));.    f.l_t
1d3f0 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
1d400 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
1d410 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
1d420 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
1d430 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
1d440 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ;..    rc = osFc
1d450 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
1d460 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20   F_SETLK, &f);. 
1d470 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31     rc = (rc!=(-1
1d480 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
1d490 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d4a0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1d4b0 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
1d4c0 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
1d4d0 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
1d4e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d4f0 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20  .  { u16 mask;. 
1d500 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1d510 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20  OCK "));.  mask 
1d520 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
1d530 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
1d540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d550 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
1d560 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
1d570 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d580 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
1d590 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
1d5a0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1d5b0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1d5c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
1d5d0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1d5e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
1d5f0 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
1d600 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1d610 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
1d620 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d630 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d640 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1d650 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d660 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
1d670 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
1d680 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
1d690 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
1d6a0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1d6b0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
1d6c0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d6d0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d6e0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
1d6f0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
1d700 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
1d710 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
1d720 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
1d730 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
1d740 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1d750 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
1d760 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
1d770 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
1d780 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
1d790 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
1d7a0 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
1d7b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d7c0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
1d7d0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
1d7e0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d7f0 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
1d800 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
1d810 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
1d820 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
1d830 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
1d840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
1d850 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1d860 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
1d870 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
1d880 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1d890 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a  ;        .}.../*
1d8a0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
1d8b0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
1d8c0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
1d8d0 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
1d8e0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1d8f0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1d900 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1d910 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1d920 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1d930 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1d940 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1d950 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1d960 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
1d970 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
1d980 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
1d990 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
1d9a0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
1d9b0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
1d9c0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
1d9d0 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
1d9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
1d9f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1da00 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
1da10 6e 6f 64 65 20 29 3b 0a 20 20 20 20 69 66 28 20  node );.    if( 
1da20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74  p->mutex ) sqlit
1da30 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1da40 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
1da50 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
1da60 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
1da70 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1da80 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d         munmap(p-
1da90 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
1daa0 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
1dab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dac0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1dad0 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20  >apRegion[i]);. 
1dae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1daf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1db00 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
1db10 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1db20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1db30 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c  e(pFd, p->h, __L
1db40 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d  INE__);.      p-
1db50 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  >h = -1;.    }. 
1db60 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
1db70 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
1db80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1db90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
1dba0 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
1dbb0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
1dbc0 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74  ed with open dat
1dbd0 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
1dbe0 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74  .  .** This part
1dbf0 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74  icular implement
1dc00 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70  ation uses mmapp
1dc10 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
1dc20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  The file used to
1dc30 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65   implement share
1dc40 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74  d-memory is in t
1dc50 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
1dc60 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e  y.** as the open
1dc70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1dc80 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
1dc90 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e  name as the open
1dca0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1dcb0 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d  e with the "-shm
1dcc0 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20  " suffix added. 
1dcd0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1dce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dcf0 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f  le.** is "/home/
1dd00 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22  user1/config.db"
1dd10 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74   then the file t
1dd20 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61  hat is created a
1dd30 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f  nd mmapped.** fo
1dd40 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
1dd50 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22  will be called "
1dd60 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
1dd70 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a  ig.db-shm".  .**
1dd80 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72  .** Another appr
1dd90 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73  oach to is to us
1dda0 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f  e files in /dev/
1ddb0 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20  shm or /dev/tmp 
1ddc0 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74  or an.** some ot
1ddd0 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e  her tmpfs mount.
1dde0 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69   But if a file i
1ddf0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
1de00 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20  rectory.** from 
1de10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1de20 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  e is used, then 
1de30 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73  differing access
1de40 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
1de50 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69  or a chroot() mi
1de60 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69  ght cause two di
1de70 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65  fferent processe
1de80 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
1de90 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64   database to end
1dea0 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72   up using differ
1deb0 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68  ent files for sh
1dec0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a  ared memory - .*
1ded0 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  * meaning that t
1dee0 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c  heir memory woul
1def0 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  d not really be 
1df00 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69  shared - resulti
1df10 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  ng.** in databas
1df20 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e  e corruption.  N
1df30 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69  evertheless, thi
1df40 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61  s tmpfs file usa
1df50 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61  ge.** can be ena
1df60 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
1df70 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c  time using -DSQL
1df80 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1df90 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20  Y="/dev/shm".** 
1dfa0 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
1dfb0 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74  t.  The use of t
1dfc0 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
1dfd0 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
1dfe0 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72  time.** option r
1dff0 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63  esults in an inc
1e000 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20  ompatible build 
1e010 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c  of SQLite;  buil
1e020 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20  ds of SQLite.** 
1e030 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72  that with differ
1e040 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  ing SQLITE_SHM_D
1e050 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67  IRECTORY setting
1e060 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  s attempt to use
1e070 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74   the.** same dat
1e080 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
1e090 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74  e same time, dat
1e0a0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e0b0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
1e0c0 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49  result. The SQLI
1e0d0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1e0e0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1e0f0 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  tion is consider
1e100 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74  ed.** "unsupport
1e110 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61  ed" and may go a
1e120 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20  way in a future 
1e130 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a  SQLite release..
1e140 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
1e150 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
1e160 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
1e170 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
1e180 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
1e190 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
1e1a0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
1e1b0 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
1e1c0 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
1e1d0 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
1e1e0 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
1e1f0 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
1e200 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
1e210 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  er cleared..**.*
1e220 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
1e230 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
1e240 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67  (pDbFd) is using
1e250 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22   the "unix-excl"
1e260 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61   VFS.** that mea
1e270 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75  ns that an exclu
1e280 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c  sive lock is hel
1e290 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1e2a0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
1e2b0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1e2c0 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74  esses are able t
1e2d0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1e2e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1e2f0 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20  n.** that case, 
1e300 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  we do not really
1e310 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d   need shared mem
1e320 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20  ory.  No shared 
1e330 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69  memory.** file i
1e340 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
1e350 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
1e360 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20  ll be simulated 
1e370 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79  with heap memory
1e380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e390 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
1e3a0 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  mory(unixFile *p
1e3b0 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
1e3c0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20  unixShm *p = 0; 
1e3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e3e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1e3f0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
1e400 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1e410 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  *pShmNode;   /* 
1e420 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1e430 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1e440 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e460 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1e470 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
1e480 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
1e490 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64       /* The inod
1e4a0 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61  e of fd */.  cha
1e4b0 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  r *zShmFilename;
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e4d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1e4e0 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
1e4f0 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
1e500 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1e510 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1e520 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
1e530 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
1e540 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1e550 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
1e560 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
1e570 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
1e580 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
1e590 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1e5a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e5b0 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
1e5c0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
1e5d0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1e5e0 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
1e5f0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1e600 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
1e610 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
1e620 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e  exists. Reuse an
1e630 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
1e640 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43  ne if present. C
1e650 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
1e660 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
1e670 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
1e680 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
1e690 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
1e6a0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
1e6b0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
1e6c0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
1e6d0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
1e6e0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1e700 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
1e710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e720 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73  ..    /* Call fs
1e730 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  tat() to figure 
1e740 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69  out the permissi
1e750 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ons on the datab
1e760 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20  ase file. If.   
1e770 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20   ** a new *-shm 
1e780 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
1e790 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c   an attempt will
1e7a0 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61   be made to crea
1e7b0 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74  te it.    ** wit
1e7c0 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  h the same permi
1e7d0 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75  ssions. The actu
1e7e0 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74  al permissions t
1e7f0 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  he file is creat
1e800 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  ed.    ** with a
1e810 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  re subject to th
1e820 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20  e current umask 
1e830 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1e840 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
1e850 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
1e860 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72  ) && pInode->bPr
1e870 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
1e880 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e890 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1e8a0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1e8b0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23  en_err;.    }..#
1e8c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
1e8d0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e  _DIRECTORY.    n
1e8e0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69  ShmFilename = si
1e8f0 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f  zeof(SQLITE_SHM_
1e900 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30 3b  DIRECTORY) + 30;
1e910 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46  .#else.    nShmF
1e920 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69  ilename = 5 + (i
1e930 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d  nt)strlen(pDbFd-
1e940 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
1e950 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73      pShmNode = s
1e960 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
1e970 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1e980 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
1e990 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1e9a0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
1e9b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1e9c0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1e9d0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1e9e0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
1e9f0 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
1ea00 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20 20  (*pShmNode));.  
1ea10 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    zShmFilename =
1ea20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
1ea30 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
1ea40 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
1ea50 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
1ea60 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
1ea70 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
1ea80 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
1ea90 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ilename, .      
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1eab0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1eac0 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
1ead0 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
1eaf0 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
1eb00 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
1eb10 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
1eb20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1eb30 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
1eb40 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  hmFilename, "%s-
1eb50 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
1eb60 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
1eb70 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31  pShmNode->h = -1
1eb80 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e  ;.    pDbFd->pIn
1eb90 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
1eba0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53  pShmNode;.    pS
1ebb0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d  hmNode->pInode =
1ebc0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
1ebd0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
1ebe0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1ebf0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1ec00 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
1ec10 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1ec20 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
1ec30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1ec40 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1ec50 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1ec60 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e    }..    if( pIn
1ec70 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
1ec80 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53  k==0 ){.      pS
1ec90 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75  hmNode->h = robu
1eca0 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65  st_open(zShmFile
1ecb0 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  name, O_RDWR|O_C
1ecc0 52 45 41 54 2c 0a 20 20 20 20 20 20 20 20 20 20  REAT,.          
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 20 20 20 20 20 28 73 53 74 61 74 2e 73 74 5f 6d       (sStat.st_m
1ecf0 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a 20 20  ode & 0777));.  
1ed00 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1ed10 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ->h<0 ){.       
1ed20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
1ed30 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
1ed40 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
1ed50 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
1ed60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1ed70 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
1ed80 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43   }.  .      /* C
1ed90 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1eda0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
1edb0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
1edc0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
1edd0 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
1ede0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1edf0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1ee00 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1ee10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ee20 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
1ee30 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1ee40 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
1ee50 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
1ee60 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1ee70 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
1ee80 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
1ee90 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
1eea0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
1eeb0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1eec0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
1eed0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
1eee0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
1eef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ef00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ef10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ef20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
1ef30 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1ef40 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  de, F_RDLCK, UNI
1ef50 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
1ef60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ef70 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1ef80 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
1ef90 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
1efa0 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
1efb0 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
1efc0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
1efd0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
1efe0 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
1eff0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
1f000 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
1f010 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
1f020 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
1f030 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
1f040 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e  ->pShm = p;.  un
1f050 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1f060 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
1f070 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
1f080 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
1f090 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
1f0a0 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
1f0b0 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75  e cover of the u
1f0c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
1f0d0 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1f0e0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1f0f0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1f100 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20  unixShm) object 
1f110 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
1f120 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
1f130 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
1f140 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
1f150 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
1f160 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
1f170 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
1f180 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
1f190 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
1f1a0 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
1f1b0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1f1c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1f1d0 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
1f1e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1f1f0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1f200 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
1f210 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
1f220 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
1f230 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1f240 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f250 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1f260 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1f270 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1f280 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
1f290 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
1f2a0 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69  _open_err:.  uni
1f2b0 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
1f2c0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ;       /* This 
1f2d0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1f2e0 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1f2f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1f300 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  e(p);.  unixLeav
1f310 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1f320 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f330 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f340 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1f350 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
1f360 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
1f370 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
1f380 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
1f390 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1f3a0 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
1f3b0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1f3c0 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
1f3d0 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
1f3e0 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
1f3f0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1f400 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
1f410 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
1f420 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1f430 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
1f440 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f450 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
1f460 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
1f470 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1f480 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72   the bExtend par
1f490 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
1f4a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
1f4b0 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
1f4c0 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
1f4d0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
1f4e0 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
1f4f0 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
1f500 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
1f510 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
1f520 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
1f530 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1f540 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
1f550 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20   .** bExtend is 
1f560 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
1f570 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1f580 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1f590 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
1f5a0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1f5b0 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1f5c0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1f5d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1f5e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1f5f0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1f600 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1f610 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1f620 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1f630 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1f640 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1f650 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1f660 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
1f670 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
1f680 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1f690 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
1f6a0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
1f6b0 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
1f6c0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1f6d0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1f6e0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70  c int unixShmMap
1f6f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1f700 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
1f710 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
1f720 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
1f730 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
1f740 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1f750 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1f760 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
1f770 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
1f780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f790 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1f7a0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1f7b0 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20  bExtend,        
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f7d0 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
1f7e0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
1f7f0 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
1f800 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
1f810 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
1f820 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
1f830 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1f840 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
1f850 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
1f860 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
1f870 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
1f880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f890 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
1f8a0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1f8b0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1f8c0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
1f8d0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
1f8e0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
1f8f0 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
1f900 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1f910 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
1f920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1f940 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
1f950 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
1f960 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
1f970 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1f980 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1f990 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
1f9a0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
1f9b0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
1f9c0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1f9d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1f9e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
1f9f0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
1fa00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
1fa10 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
1fa20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
1fa30 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
1fa40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
1fa50 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
1fa60 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
1fa70 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
1fa80 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1fa90 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
1faa0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
1fab0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
1fac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1fad0 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
1fae0 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
1faf0 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
1fb00 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
1fb10 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
1fb20 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1fb30 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
1fb40 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
1fb50 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
1fb60 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
1fb70 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1fb80 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
1fb90 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1fba0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1fbb0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1fbc0 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
1fbd0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1fbe0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
1fbf0 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
1fc00 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1fc10 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
1fc20 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
1fc30 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
1fc40 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
1fc50 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1fc60 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
1fc70 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
1fc80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1fc90 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
1fca0 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
1fcb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1fcc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
1fcd0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
1fce0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1fcf0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
1fd00 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
1fd10 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
1fd20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1fd30 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1fd40 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
1fd50 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
1fd60 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
1fd70 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
1fd80 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
1fd90 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1fda0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1fdb0 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ned..        **.
1fdc0 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72          ** Alter
1fdd0 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78  natively, if bEx
1fde0 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73  tend is true, us
1fdf0 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
1fe00 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
1fe10 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
1fe20 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1fe30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1fe40 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
1fe50 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  d ) goto shmpage
1fe60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66  _out;.        if
1fe70 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
1fe80 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
1fe90 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
1fea0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
1feb0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1fec0 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72  RR_SHMSIZE, "ftr
1fed0 75 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20  uncate",.       
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
1ff00 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
1ff10 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1ff20 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
1ff30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ff40 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
1ff50 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1ff60 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
1ff70 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1ff80 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
1ff90 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   apNew = (char *
1ffa0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1ffb0 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
1ffc0 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28  ode->apRegion, (
1ffd0 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
1ffe0 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
1fff0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
20000 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20010 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20020 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
20030 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
20040 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
20050 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
20060 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f      while(pShmNo
20070 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
20080 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69  gion){.      voi
20090 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  d *pMem;.      i
200a0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
200b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 ){.        pMe
200c0 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65  m = mmap(0, szRe
200d0 67 69 6f 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c  gion, PROT_READ|
200e0 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20  PROT_WRITE, .   
200f0 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41           MAP_SHA
20100 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  RED, pShmNode->h
20110 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
20120 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20  ion*szRegion.   
20130 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
20140 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41  if( pMem==MAP_FA
20150 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
20160 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
20170 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
20180 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c  _SHMMAP, "mmap",
20190 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
201a0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
201b0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
201c0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
201d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
201e0 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33    pMem = sqlite3
201f0 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e  _malloc(szRegion
20200 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
20210 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
20220 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20230 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
20240 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
20250 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
20260 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
20270 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
20280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
20290 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
202a0 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
202b0 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20  on] = pMem;.    
202c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
202d0 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ion++;.    }.  }
202e0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
202f0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
20300 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
20310 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
20320 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
20330 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
20340 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
20350 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
20360 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
20370 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
20380 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20390 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
203a0 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
203b0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
203c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  nt..**.** Note t
203d0 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  hat the relation
203e0 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41  ship between SHA
203f0 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56  REd and EXCLUSIV
20400 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74  E locks is a lit
20410 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  tle.** different
20420 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f   here than in po
20430 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63  six.  In xShmLoc
20440 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20  k(), one can go 
20450 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a  from unlocked.**
20460 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62   to shared and b
20470 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f  ack or from unlo
20480 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  cked to exclusiv
20490 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74  e and back.  But
204a0 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   one may.** not 
204b0 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74  go from shared t
204c0 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66  o exclusive or f
204d0 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f  rom exclusive to
204e0 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74   shared..*/.stat
204f0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f  ic int unixShmLo
20500 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
20510 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
20520 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
20530 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
20540 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
20550 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
20560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20570 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
20580 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
20590 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
205c0 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
205d0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
205e0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
205f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
20600 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
20610 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
20620 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
20630 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20  unixFile*)fd;   
20640 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
20650 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
20660 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78  memory */.  unix
20670 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
20680 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
20690 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
206a0 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
206b0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ked */.  unixShm
206c0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
206e0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
206f0 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
20700 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
20710 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
20720 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68  pShmNode;  /* Th
20730 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  e underlying fil
20740 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  e iNode */.  int
20750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20770 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
20780 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
207b0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
207c0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
207d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
207e0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
207f0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
20800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
20810 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
20820 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
20830 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
20840 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
20850 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
20860 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
20870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
20880 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
20890 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
208a0 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
208b0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
208c0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
208d0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
208e0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
208f0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
20900 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
20910 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
20920 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
20930 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
20940 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
20950 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
20960 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
20970 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
20980 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
20990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
209a0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
209b0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
209c0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
209d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
209e0 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
209f0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
20a00 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
20a10 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
20a20 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
20a30 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  t);.  assert( n>
20a40 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
20a50 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
20a60 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
20a70 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
20a80 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
20a90 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
20aa0 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
20ab0 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
20ac0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
20ad0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
20ae0 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
20af0 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
20b00 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
20b10 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
20b20 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
20b30 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
20b40 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
20b50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20b60 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
20b70 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
20b80 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
20b90 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
20ba0 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
20bb0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
20bc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
20bd0 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
20be0 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
20bf0 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
20c00 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
20c10 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
20c20 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
20c30 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  e, F_UNLCK, ofst
20c40 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
20c50 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
20c60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20c70 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
20c80 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
20c90 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
20ca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20cb0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
20cc0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
20cd0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
20ce0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
20cf0 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
20d00 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
20d10 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
20d20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
20d30 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
20d40 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
20d50 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
20d60 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
20d70 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
20d80 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
20d90 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
20da0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
20db0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
20dc0 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
20dd0 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
20de0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
20df0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
20e00 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
20e10 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
20e20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
20e30 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
20e40 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
20e50 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
20e60 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
20e70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
20e80 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
20e90 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
20eb0 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
20ec0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
20ed0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
20ee0 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
20ef0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
20f00 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
20f10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20f20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
20f30 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
20f40 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
20f50 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
20f60 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
20f70 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73  de, F_RDLCK, ofs
20f80 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
20f90 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
20fa0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
20fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
20fc0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
20fd0 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
20fe0 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
20ff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
21010 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
21020 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
21030 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
21040 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
21050 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
21060 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
21070 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
21080 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
21090 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
210a0 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
210b0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
210c0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
210d0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
210e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
210f0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
21100 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
21110 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
21120 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
21130 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21140 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
21150 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
21160 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47     }.  .    /* G
21170 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
21180 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
21190 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
211a0 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
211b0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
211c0 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
211d0 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
211e0 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
211f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
21210 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
21220 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
21230 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  WRLCK, ofst+UNIX
21240 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
21250 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21270 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
21280 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
21290 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
212a0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
212b0 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
212c0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
212d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
212e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
212f0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
21300 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64  CK shmid-%d, pid
21310 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33  -%d got %03x,%03
21320 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
21330 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29   p->id, getpid()
21340 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
21350 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a   p->exclMask));.
21360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21370 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
21380 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
21390 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
213a0 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
213b0 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
213c0 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
213d0 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
213e0 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
213f0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
21400 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
21410 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
21420 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
21430 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
21440 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
21450 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21470 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
21480 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
21490 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
214a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
214b0 28 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  (fd);.  unixEnte
214c0 72 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78  rMutex();.  unix
214d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
214e0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
214f0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
21500 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
21510 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
21520 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
21530 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
21540 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
21550 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65  here is no share
21560 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
21570 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ted with the con
21580 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69  nection then thi
21590 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
215a0 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
215b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
215c0 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20  unixShmUnmap(.  
215d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
215e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
215f0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
21600 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
21610 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
21620 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
21630 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73       /* Delete s
21640 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20  hared-memory if 
21650 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  true */.){.  uni
21660 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  xShm *p;        
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21680 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
21690 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
216a0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
216b0 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
216c0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
216d0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
216e0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
216f0 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
21700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
21710 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
21720 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
21730 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ns */.  unixFile
21740 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20   *pDbFd;        
21750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
21760 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
21770 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44  se file */..  pD
21780 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
21790 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
217a0 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
217b0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
217c0 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
217d0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
217e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
217f0 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
21800 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
21810 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
21820 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
21830 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20  Fd->pInode );.. 
21840 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
21850 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
21860 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
21870 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
21880 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
21890 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
218a0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
218b0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
218c0 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
218d0 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
218e0 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
218f0 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
21900 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
21910 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
21920 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
21930 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
21940 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
21950 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
21960 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
21970 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
21980 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
21990 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
219a0 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
219b0 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
219c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
219d0 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45  , too */.  unixE
219e0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
219f0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
21a00 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68  >nRef>0 );.  pSh
21a10 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  mNode->nRef--;. 
21a20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
21a30 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref==0 ){.    if
21a40 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20  ( deleteFlag && 
21a50 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
21a60 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65   unlink(pShmNode
21a70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
21a80 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
21a90 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  DbFd);.  }.  uni
21aa0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
21ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21ac0 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  OK;.}...#else.# 
21ad0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61  define unixShmMa
21ae0 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
21af0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20   unixShmLock    
21b00 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
21b10 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
21b20 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61  fine unixShmUnma
21b30 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
21b40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21b50 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
21b60 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
21b70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
21b80 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
21b90 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
21ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21bb0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
21bc0 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
21bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
21bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
21c40 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  /*.** This divis
21c50 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  ion contains def
21c60 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69  initions of sqli
21c70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
21c80 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69  bjects that.** i
21c90 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73  mplement various
21ca0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74   file locking st
21cb0 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c  rategies.  It al
21cc0 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  so contains defi
21cd0 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66  nitions.** of "f
21ce0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
21cf0 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63  .  A finder-func
21d00 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
21d10 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f  locate the appro
21d20 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65  priate.** sqlite
21d30 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
21d40 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63  ect for a partic
21d50 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69  ular database fi
21d60 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  le.  The pAppDat
21d70 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  a.** field of th
21d80 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46  e sqlite3_vfs VF
21d90 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e  S objects are in
21da0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20  itialized to be 
21db0 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74  pointers to.** t
21dc0 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65  he correct finde
21dd0 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74  r-function for t
21de0 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d  hat VFS..**.** M
21df0 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74  ost finder funct
21e00 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f  ions return a po
21e10 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
21e20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21e30 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  ods.** object.  
21e40 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73  The only interes
21e50 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63  ting finder-func
21e60 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b  tion is autolock
21e70 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a  IoFinder, which.
21e80 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  ** looks at the 
21e90 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
21ea0 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65  and tries to gue
21eb0 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ss the best lock
21ec0 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20  ing.** strategy 
21ed0 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  from that..**.**
21ee0 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74   For finder-funt
21ef0 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63  ion F, two objec
21f00 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a  ts are created:.
21f10 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65  **.**    (1) The
21f20 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e   real finder-fun
21f30 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d  ction named "FIm
21f40 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pt()"..**.**    
21f50 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70  (2) A constant p
21f60 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66  ointer to this f
21f70 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75  unction named ju
21f80 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  st "F"..**.**.**
21f90 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
21fa0 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75  e F pointer is u
21fb0 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44  sed as the pAppD
21fc0 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46  ata value for VF
21fd0 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57  S.** objects.  W
21fe0 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
21ff0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  s instead of let
22000 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f  ting pAppData po
22010 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20  int.** directly 
22020 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75  at the finder-fu
22030 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30  nction since C90
22040 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61   rules prevent a
22050 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62   void*.** from b
22060 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75  e cast into a fu
22070 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a  nction pointer..
22080 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  **.**.** Each in
22090 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d  stance of this m
220a0 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74  acro generates t
220b0 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a  wo objects:.**.*
220c0 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e  *   *  A constan
220d0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
220e0 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c  hods object call
220f0 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73   METHOD that has
22100 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
22110 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20   methods CLOSE, 
22120 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
22130 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20  RESLOCK..**.**  
22140 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f   *  An I/O metho
22150 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
22160 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20  n called FINDER 
22170 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70  that returns a p
22180 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74  ointer.**      t
22190 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a  o the METHOD obj
221a0 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ect in the previ
221b0 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23  ous bullet..*/.#
221c0 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53  define IOMETHODS
221d0 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c  (FINDER, METHOD,
221e0 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c   VERSION, CLOSE,
221f0 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
22200 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74  KLOCK)      \.st
22210 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
22220 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
22230 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
22260 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
22270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
22280 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
222b0 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
222c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
222d0 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
22300 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
22310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
22320 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
22350 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
22360 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
22370 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
223a0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
223b0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
223c0 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223e0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
223f0 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
22400 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
22410 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22430 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
22440 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
22450 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
22460 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22480 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224f0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
22500 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22520 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22540 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
22550 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22570 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
22580 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
22590 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
225a0 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
225d0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
225e0 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
225f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22610 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
22620 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
22630 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
22640 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22660 20 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20     unixShmMap,  
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22680 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20  * xShmMap */    
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
226b0 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20    unixShmLock,  
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
226d0 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20   xShmLock */    
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
22700 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c   unixShmBarrier,
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22720 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20  xShmBarrier */  
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
22750 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20  unixShmUnmap    
22760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22770 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20  ShmUnmap */     
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20            \.};  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227e0 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
227f0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
22800 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44  io_methods *FIND
22810 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63  ER##Impl(const c
22820 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65  har *z, unixFile
22830 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53   *p){   \.  UNUS
22840 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b  ED_PARAMETER(z);
22850 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22860 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  R(p);           
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72         \.  retur
22890 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20  n &METHOD;      
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228d0 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20        \.}       
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22920 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
22930 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
22940 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20  ethods *(*const 
22950 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68  FINDER)(const ch
22960 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29  ar*,unixFile *p)
22970 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44      \.    = FIND
22980 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a  ER##Impl;../*.**
22990 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66   Here are all of
229a0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
229b0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
229c0 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
229d0 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  ** locking strat
229e0 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e  egies.  Function
229f0 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f  s that return po
22a00 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20  inters to these 
22a10 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61  methods.** are a
22a20 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  lso created..*/.
22a30 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73  IOMETHODS(.  pos
22a40 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ixIoFinder,     
22a50 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
22a60 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
22a70 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f  /.  posixIoMetho
22a80 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
22a90 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22aa0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
22ab0 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20  */.  2,         
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ad0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
22ae0 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
22af0 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
22b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
22b10 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
22b20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
22b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
22b40 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
22b50 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
22b60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
22b70 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
22b80 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
22b90 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68  dLock     /* xCh
22ba0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
22bb0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
22bc0 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
22bd0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
22be0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
22bf0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
22c00 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
22c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
22c20 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
22c30 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
22c40 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
22c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
22c60 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
22c70 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  isabled */.  nol
22c80 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
22c90 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
22ca0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
22cb0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
22cc0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
22cd0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
22ce0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
22cf0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
22d00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
22d10 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
22d20 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b  Lock   /* xCheck
22d30 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
22d40 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
22d50 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  DS(.  dotlockIoF
22d60 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
22d70 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
22d80 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  on name */.  dot
22d90 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
22da0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
22db0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
22dc0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
22df0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
22e00 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  bled */.  dotloc
22e10 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
22e20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
22e30 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
22e40 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
22e50 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
22e60 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
22e70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
22e80 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
22e90 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
22ea0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
22eb0 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ck  /* xCheckRes
22ec0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
22ed0 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
22ee0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
22ef0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
22f00 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
22f10 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  .  flockIoFinder
22f20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
22f30 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
22f40 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49  name */.  flockI
22f50 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
22f60 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
22f70 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
22f80 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
22fb0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
22fc0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73  d */.  flockClos
22fd0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22fe0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
22ff0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  d */.  flockLock
23000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23010 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
23020 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   */.  flockUnloc
23030 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23040 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
23050 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63  d */.  flockChec
23060 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
23070 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
23080 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
23090 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
230a0 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
230b0 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
230c0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
230d0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
230e0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
230f0 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
23100 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
23110 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
23120 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
23130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23140 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
23150 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
23160 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c  abled */.  semCl
23170 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
23180 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
23190 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f  ethod */.  semLo
231a0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
231b0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
231c0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c  thod */.  semUnl
231d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
231e0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
231f0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68  ethod */.  semCh
23200 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
23210 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
23220 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
23230 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
23240 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
23250 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
23260 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
23270 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
23280 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
23290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
232a0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
232b0 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
232c0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
232d0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
232e0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
232f0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
23320 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
23330 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
23360 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23380 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
23390 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
233b0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
233c0 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
233d0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
233e0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
233f0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
23400 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
23410 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  The proxy lockin
23420 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73  g method is a "s
23430 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20  uper-method" in 
23440 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
23450 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e  t.** opens secon
23460 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  dary file descri
23470 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f  ptors for the co
23480 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c  nch and lock fil
23490 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65  es and.** it use
234a0 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c  s proxy, dot-fil
234b0 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63  e, AFP, and floc
234c0 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  k() locking meth
234d0 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20  ods on those.** 
234e0 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e  secondary files.
234f0 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
23500 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
23510 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  that implements.
23520 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** proxy locking
23530 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68   is located much
23540 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e   further down in
23550 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20   the file.  But 
23560 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f  we need.** to go
23570 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e   ahead and defin
23580 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  e the sqlite3_io
23590 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e  _methods and fin
235a0 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  der function.** 
235b0 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
235c0 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66  g here.  So we f
235d0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74  orward declare t
235e0 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a  he I/O methods..
235f0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
23600 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
23610 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
23620 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20  NG_STYLE.static 
23630 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
23640 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
23650 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
23660 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
23670 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
23680 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
23690 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
236a0 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
236b0 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
236c0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
236d0 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d  ile*, int*);.IOM
236e0 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49  ETHODS(.  proxyI
236f0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
23700 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
23710 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
23720 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c   proxyIoMethods,
23730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
23740 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23750 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
23760 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
23770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23780 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
23790 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72  disabled */.  pr
237a0 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
237b0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
237c0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
237d0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
237e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
237f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
23800 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
23810 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
23820 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
23830 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
23840 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
23850 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
23860 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
23870 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
23880 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
23890 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
238a0 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
238b0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
238c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
238d0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
238e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
238f0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
23900 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23920 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
23930 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
23940 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
23950 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23960 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23970 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
239a0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
239b0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
239c0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
239d0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
239e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
239f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
23a00 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
23a10 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
23a20 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
23a30 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
23a40 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
23a50 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
23a60 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
23a70 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
23a80 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
23a90 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
23aa0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
23ab0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
23ac0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
23ad0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
23ae0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
23af0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
23b00 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
23b10 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
23b20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23b30 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
23b40 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
23b50 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
23b60 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
23b70 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
23b80 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
23b90 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
23ba0 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
23bb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
23bc0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23bd0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
23be0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
23bf0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
23c00 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
23c10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
23c20 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
23c30 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
23c40 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
23c50 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
23c60 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
23c70 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
23c80 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
23c90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
23ca0 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
23cb0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
23cc0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
23cd0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
23ce0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
23cf0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
23d00 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
23d10 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
23d20 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
23d30 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
23d40 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
23d50 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
23d60 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
23d70 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
23d80 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
23d90 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
23da0 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
23db0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
23dc0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
23dd0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
23de0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
23df0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
23e00 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
23e10 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
23e20 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
23e30 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
23e40 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
23e50 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
23e60 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
23e70 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
23e80 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
23e90 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
23ea0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
23eb0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
23ec0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
23ed0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
23ee0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
23ef0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
23f00 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
23f10 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
23f20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
23f30 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
23f40 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
23f50 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
23f60 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
23f70 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
23f80 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
23f90 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
23fa0 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
23fb0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
23fc0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
23fd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
23fe0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
23ff0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
24000 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
24010 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
24020 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
24030 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
24040 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
24050 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
24060 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
24070 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
24080 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
24090 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
240a0 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
240b0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
240c0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
240d0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
240e0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
240f0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
24100 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
24110 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
24120 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
24130 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
24140 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
24150 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
24160 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24170 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
24180 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
24190 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
241a0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
241b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
241c0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
241d0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
241e0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
241f0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
24200 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
24210 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
24220 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
24230 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
24240 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
24250 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
24260 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
24270 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
24280 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
24290 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
242a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
242b0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
242c0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
242d0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
242e0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
242f0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
24300 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
24310 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24320 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
24330 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
24340 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
24350 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
24360 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
24370 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
24380 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
24390 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
243a0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
243b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
243c0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
243d0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
243e0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
243f0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
24400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24410 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
24420 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
24430 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
24440 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
24450 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
24460 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
24470 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
24480 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
24490 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
244a0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
244b0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
244c0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
244d0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
244e0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
244f0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
24500 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
24510 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
24520 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
24530 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
24540 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
24550 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
24560 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
24570 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
24580 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
24590 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
245a0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
245b0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
245c0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
245d0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
245e0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
245f0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
24600 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
24610 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
24620 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
24630 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
24640 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
24650 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
24660 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
24670 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
24680 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
24690 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
246a0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
246b0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
246c0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
246d0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
246e0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
246f0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
24700 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
24710 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
24720 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
24730 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
24740 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
24750 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
24760 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
24770 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
24780 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
24790 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
247a0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
247b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
247c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
247d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
247e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
247f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
24800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24810 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
24820 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
24830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24840 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
24850 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
24860 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
24870 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
24880 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
24890 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
248a0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
248b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
248c0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
248d0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
248e0 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
248f0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
24900 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
24910 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
24920 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
24930 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
24940 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
24950 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
24960 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
24970 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
24980 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ened */.  int di
24990 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  rfd,            
249a0 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
249b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
249c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
249d0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
249e0 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
249f0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
24a00 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
24a10 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
24a20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
24a30 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
24a40 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  d */.  int noLoc
24a50 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
24a60 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69  * Omit locking i
24a70 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
24a80 69 73 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  isDelete,       
24a90 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
24aa0 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
24ab0 2f 0a 20 20 69 6e 74 20 69 73 52 65 61 64 4f 6e  /.  int isReadOn
24ac0 6c 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ly          /* T
24ad0 72 75 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  rue if the file 
24ae0 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
24af0 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  nly */.){.  cons
24b00 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
24b10 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
24b20 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
24b30 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
24b40 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
24b50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
24b60 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
24b70 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
24b80 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20  .  /* Parameter 
24b90 69 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79  isDelete is only
24ba0 20 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73   used on vxworks
24bb0 2e 20 45 78 70 72 65 73 73 20 74 68 69 73 20 65  . Express this e
24bc0 78 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20  xplicitly .  ** 
24bd0 68 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20  here to prevent 
24be0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
24bf0 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70  s about unused p
24c00 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
24c10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
24c20 45 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20  ER(isDelete);.. 
24c30 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20   /* Usually the 
24c40 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73  path zFilename s
24c50 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72  hould not be a r
24c60 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
24c70 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70  . The.  ** excep
24c80 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65  tion is when ope
24c90 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22  ning the proxy "
24ca0 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62  conch" file in b
24cb0 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20  uilds that.  ** 
24cc0 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63  include the spec
24cd0 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e  ial Apple lockin
24ce0 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23  g styles..  */.#
24cf0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
24d00 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
24d10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
24d20 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a  TYLE.  assert( z
24d30 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
24d40 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
24d50 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70   .    || pVfs->p
24d60 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29  AppData==(void*)
24d70 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  &autolockIoFinde
24d80 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73  r );.#else.  ass
24d90 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
24da0 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
24db0 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66  ]=='/' );.#endif
24dc0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
24dd0 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
24de0 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  , h, zFilename))
24df0 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
24e00 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
24e10 20 64 69 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e   dirfd;.  pNew->
24e20 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  zPath = zFilenam
24e30 65 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  e;.  if( memcmp(
24e40 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69  pVfs->zName,"uni
24e50 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29  x-excl",10)==0 )
24e60 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
24e70 46 6c 61 67 73 20 3d 20 55 4e 49 58 46 49 4c 45  Flags = UNIXFILE
24e80 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _EXCL;.  }else{.
24e90 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
24ea0 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ags = 0;.  }.  i
24eb0 66 28 20 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b  f( isReadOnly ){
24ec0 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
24ed0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
24ee0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 23 69  _RDONLY;.  }..#i
24ef0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
24f00 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
24f10 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
24f20 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
24f30 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
24f40 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20     noLock = 1;. 
24f50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
24f60 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
24f70 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29  ..  if( noLock )
24f80 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
24f90 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  yle = &nolockIoM
24fa0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
24fb0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
24fc0 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f  le = (**(finder_
24fd0 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70  type*)pVfs->pApp
24fe0 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c  Data)(zFilename,
24ff0 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49   pNew);.#if SQLI
25000 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25010 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
25020 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
25030 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
25040 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
25050 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
25060 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
25070 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
25080 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
25090 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
250a0 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
250b0 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
250c0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
250d0 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
250e0 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
250f0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
25100 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
25110 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
25120 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
25130 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
25140 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
25150 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ds.#if defined(_
25160 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
25170 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25180 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20  NG_STYLE.    || 
25190 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
251a0 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23   &nfsIoMethods.#
251b0 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75  endif.  ){.    u
251c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
251d0 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
251e0 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
251f0 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
25200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
25220 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
25230 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65  red in findInode
25240 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68  Info(), close th
25250 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
25260 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  r.      ** immed
25270 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72  iately, before r
25280 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74  eleasing the mut
25290 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  ex. findInodeInf
252a0 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20  o() may fail.   
252b0 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65     ** in two sce
252c0 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a  narios:.      **
252d0 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20  .      **   (a) 
252e0 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28  A call to fstat(
252f0 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  ) failed..      
25300 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f  **   (b) A mallo
25310 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  c failed..      
25320 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e  **.      ** Scen
25330 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c  ario (b) may onl
25340 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70  y occur if the p
25350 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
25360 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20  g no other.     
25370 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
25380 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  tors open on the
25390 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74   same file. If t
253a0 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20  here were other 
253b0 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
253c0 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69  scriptors on thi
253d0 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  s file, then no 
253e0 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20  malloc would be 
253f0 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
25400 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e    ** findInodeIn
25410 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73  fo(). If this is
25420 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73   the case, it is
25430 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63   quite safe to c
25440 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  lose.      ** ha
25450 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69  ndle h - as it i
25460 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
25470 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73  t no posix locks
25480 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65   will be release
25490 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f  d.      ** by do
254a0 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a  ing so..      **
254b0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65  .      ** If sce
254c0 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64  nario (a) caused
254d0 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20   the error then 
254e0 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73  things are not s
254f0 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20  o safe. The.    
25500 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73    ** implicit as
25510 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73  sumption here is
25520 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29   that if fstat()
25530 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61   fails, things a
25540 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73  re in.      ** s
25550 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68  uch bad shape th
25560 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f  at dropping a lo
25570 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27  ck or two doesn'
25580 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20  t matter much.. 
25590 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f       */.      ro
255a0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
255b0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
255c0 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
255d0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
255e0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
255f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
25600 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
25610 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
25620 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
25630 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
25640 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
25650 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
25660 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
25670 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
25680 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
25690 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
256a0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
256b0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
256c0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
256d0 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
256e0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
256f0 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
25700 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
25710 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66  *pCtx) );.    if
25720 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
25730 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
25740 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
25750 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
25760 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
25770 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
25780 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
25790 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
257a0 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
257b0 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
257c0 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
257d0 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
257e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
257f0 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
25800 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
25810 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
25820 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72  e;.      pCtx->r
25830 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20  eserved = 0;.   
25840 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
25850 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
25860 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
25870 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
25880 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
25890 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66  Inode);.      if
258a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
258b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
258c0 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f  e3_free(pNew->lo
258d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
258e0 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
258f0 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
25900 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20  INE__);.        
25910 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  h = -1;.      }.
25920 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
25930 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a  utex();        .
25940 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
25950 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ..  else if( pLo
25960 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64  ckingStyle == &d
25970 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  otlockIoMethods 
25980 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c  ){.    /* Dotfil
25990 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
259a0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
259b0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
259c0 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
259d0 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
259e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20  kingContext .   
259f0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
25a00 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74  ockFile;.    int
25a10 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   nFilename;.    
25a20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74  nFilename = (int
25a30 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d  )strlen(zFilenam
25a40 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63  e) + 6;.    zLoc
25a50 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
25a60 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
25a70 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
25a80 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
25a90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
25aa0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
25ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
25ac0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
25ad0 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
25ae0 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
25af0 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
25b00 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
25b10 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
25b20 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
25b30 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
25b40 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20  ORKS.  else if( 
25b50 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
25b60 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29   &semIoMethods )
25b70 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73  {.    /* Named s
25b80 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
25b90 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
25ba0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
25bb0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63  to be.    ** inc
25bc0 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d  luded in the sem
25bd0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
25be0 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e     */.    unixEn
25bf0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
25c00 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
25c10 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
25c20 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
25c30 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
25c40 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64   && (pNew->pInod
25c50 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  e->pSem==NULL) )
25c60 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
25c70 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
25c80 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b  Inode->aSemName;
25c90 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
25ca0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
25cb0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
25cc0 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25  E, zSemName, "/%
25cd0 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25cf0 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
25d00 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
25d10 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e   for( n=1; zSemN
25d20 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
25d30 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
25d40 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
25d50 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
25d60 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
25d70 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f  de->pSem = sem_o
25d80 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f  pen(zSemName, O_
25d90 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b  CREAT, 0666, 1);
25da0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
25db0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d  >pInode->pSem ==
25dc0 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
25dd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25de0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
25df0 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
25e00 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
25e10 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
25e20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
25e30 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
25e40 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61  if.  .  pNew->la
25e50 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66  stErrno = 0;.#if
25e60 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
25e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25e80 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
25e90 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
25ea0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
25eb0 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  );.    h = -1;. 
25ec0 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
25ed0 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65  ame);.    isDele
25ee0 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  te = 0;.  }.  pN
25ef0 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69  ew->isDelete = i
25f00 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a  sDelete;.#endif.
25f10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64  _OK ){.    if( d
25f30 69 72 66 64 3e 3d 30 20 29 20 72 6f 62 75 73 74  irfd>=0 ) robust
25f40 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 64 69 72  _close(pNew, dir
25f50 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
25f60 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
25f70 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
25f80 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
25f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
25fa0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
25fb0 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
25fc0 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
25fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
25ff0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
26000 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
26010 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
26020 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
26030 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
26040 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
26050 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
26060 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
26070 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
26080 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
26090 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
260a0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
260b0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
260c0 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
260d0 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
260e0 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
260f0 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
26100 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
26110 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
26120 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
26130 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
26140 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
26150 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
26160 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
26170 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
26180 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
26190 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
261a0 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
261b0 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
261c0 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
261d0 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
261e0 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
261f0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
26200 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
26210 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
26220 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
26230 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
26240 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61  ; ii>1 && zDirna
26250 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
26260 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
26270 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
26280 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
26290 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
262a0 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
262b0 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
262c0 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
262d0 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45  {.#ifdef FD_CLOE
262e0 58 45 43 0a 20 20 20 20 20 20 6f 73 46 63 6e 74  XEC.      osFcnt
262f0 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
26300 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
26310 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
26320 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  XEC);.#endif.   
26330 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
26340 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
26350 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b   fd, zDirname));
26360 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46  .    }.  }.  *pF
26370 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e  d = fd;.  return
26380 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f   (fd>=0?SQLITE_O
26390 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  K:unixLogError(S
263a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
263b0 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69  KPT, "open", zDi
263c0 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rname));.}../*.*
263d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
263e0 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
263f0 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74   in which to put
26400 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
26410 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  ..** If no suita
26420 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ble temporary fi
26430 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e  le directory can
26440 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
26450 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
26460 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
26470 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f  ixTempFileDir(vo
26480 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
26490 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
264a0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
264b0 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
264c0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
264d0 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
264e0 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20  tmp",.     0    
264f0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
26500 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20  inator */.  };. 
26510 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
26520 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
26530 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
26540 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61   *zDir = 0;..  a
26550 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
26560 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
26570 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  y;.  if( !azDirs
26580 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
26590 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
265a0 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
265b0 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
265c0 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
265d0 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69  ); zDir=azDirs[i
265e0 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  ++]){.    if( zD
265f0 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
26600 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74  ;.    if( osStat
26610 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63  (zDir, &buf) ) c
26620 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
26630 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
26640 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
26650 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63  e;.    if( osAcc
26660 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20  ess(zDir, 07) ) 
26670 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72  continue;.    br
26680 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
26690 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zDir;.}../*.**
266a0 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
266b0 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
266c0 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
266d0 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
266e0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
266f0 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
26700 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
26710 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
26720 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
26730 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
26740 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
26750 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
26760 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
26770 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
26780 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
26790 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
267a0 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
267b0 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
267c0 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
267d0 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
267e0 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75  0123456789";.  u
267f0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a  nsigned int i, j
26800 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
26810 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zDir;..  /* It's
26820 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
26830 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
26840 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
26850 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
26860 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
26870 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
26880 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
26890 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
268a0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
268b0 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
268c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
268d0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
268e0 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
268f0 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
26900 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69  Dir();.  if( zDi
26910 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e  r==0 ) zDir = ".
26920 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  ";..  /* Check t
26930 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
26940 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
26950 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
26960 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
26970 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
26980 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
26990 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
269a0 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
269b0 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
269c0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
269d0 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20  REFIX) + 17) >= 
269e0 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
269f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26a00 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
26a10 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
26a20 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
26a30 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
26a40 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
26a50 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
26a60 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
26a70 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
26a80 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
26a90 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
26aa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
26ab0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
26ac0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
26ad0 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
26ae0 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
26af0 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
26b00 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
26b10 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
26b20 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
26b30 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
26b40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26b50 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
26b60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
26b70 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
26b80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
26b90 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
26ba0 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
26bb0 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
26bc0 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
26bd0 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
26be0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
26bf0 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
26c00 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
26c10 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
26c20 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
26c30 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
26c40 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
26c50 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
26c60 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
26c70 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
26c80 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
26c90 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
26ca0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
26cb0 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
26cc0 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
26cd0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
26ce0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
26cf0 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
26d00 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
26d10 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
26d20 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
26d30 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
26d40 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
26d50 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
26d60 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
26d70 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
26d80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
26d90 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
26da0 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
26db0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
26dc0 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
26dd0 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
26de0 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
26df0 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
26e00 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
26e10 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
26e20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
26e30 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
26e40 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
26e50 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
26e60 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
26e70 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
26e80 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
26e90 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
26ea0 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
26eb0 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
26ec0 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
26ed0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
26ee0 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
26ef0 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
26f00 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
26f10 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
26f20 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
26f30 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
26f40 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
26f50 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
26f60 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
26f70 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
26f80 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
26f90 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
26fa0 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
26fb0 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
26fc0 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
26fd0 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
26fe0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
26ff0 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
27000 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
27010 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
27020 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
27030 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
27040 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
27050 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
27060 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
27070 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
27080 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
27090 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
270a0 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
270b0 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
270c0 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
270d0 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
270e0 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
270f0 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
27100 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
27110 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
27120 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
27130 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
27140 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
27150 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
27160 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
27170 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
27180 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
27190 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
271a0 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
271b0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
271c0 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
271d0 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
271e0 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
271f0 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
27200 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
27210 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
27220 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
27230 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
27240 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
27250 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
27260 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
27270 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
27280 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
27290 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
272a0 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
272b0 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
272c0 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
272d0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
272e0 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
272f0 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
27300 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
27310 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
27320 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
27330 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
27340 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
27350 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
27360 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
27370 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
27380 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74  if( 0==stat(zPat
27390 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
273a0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
273b0 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e  *pInode;..    un
273c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
273d0 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f      pInode = ino
273e0 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  deList;.    whil
273f0 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49  e( pInode && (pI
27400 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76  node->fileId.dev
27410 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20  !=sStat.st_dev. 
27420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27430 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66      || pInode->f
27440 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74  ileId.ino!=sStat
27450 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20  .st_ino) ){.    
27460 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
27470 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  de->pNext;.    }
27480 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20  .    if( pInode 
27490 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75  ){.      UnixUnu
274a0 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20  sedFd **pp;.    
274b0 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
274c0 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
274d0 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
274e0 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
274f0 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
27500 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
27510 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
27520 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
27530 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
27540 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
27550 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
27560 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
27570 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f  if    /* if !OS_
27580 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74  VXWORKS */.  ret
27590 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a  urn pUnused;.}..
275a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
275b0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
275c0 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64   unixOpen() to d
275d0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69  etermine the uni
275e0 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  x permissions.**
275f0 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66   to create new f
27600 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f  iles with. If no
27610 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
27620 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
27630 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
27640 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c   a value suitabl
27650 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73  e for passing as
27660 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
27670 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69  ent to open(2) i
27680 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20  s.** written to 
27690 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f  *pMode. If an IO
276a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
276b0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
276c0 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
276d0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
276e0 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e  e of *pMode is n
276f0 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ot modified..**.
27700 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 62  ** If the file b
27710 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
27720 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
27730 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 63 72   it is always cr
27740 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  eated with.** th
27750 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69  e octal permissi
27760 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64 2f 77  ons 0600 (read/w
27770 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72  ritable by owner
27780 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66   only). If the f
27790 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61  ile.** is a data
277a0 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a  base or master j
277b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20  ournal file, it 
277c0 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68 20  is created with 
277d0 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
277e0 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f  .** mask SQLITE_
277f0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
27800 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20  MISSIONS..**.** 
27810 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20  Finally, if the 
27820 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
27830 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65  d is a WAL or re
27840 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
27850 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  le, then .** thi
27860 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69  s function queri
27870 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  es the file-syst
27880 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69  em for the permi
27890 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a  ssions on the .*
278a0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
278b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
278c0 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  d sets *pMode to
278d0 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
278e0 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62  never .** possib
278f0 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72  le, WAL and jour
27900 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72  nal files are cr
27910 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
27920 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
27930 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f   .** as the asso
27940 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
27950 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
27960 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
27970 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
27980 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
27990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
279a0 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
279b0 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
279c0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
279d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
279e0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
279f0 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
27a00 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
27a10 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
27a20 70 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  pMode           
27a30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
27a40 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
27a50 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
27a60 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
27a70 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27a80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27a90 43 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 66 6c  Code */.  if( fl
27aa0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
27ab0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
27ac0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
27ad0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
27ae0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
27af0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
27b00 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
27b10 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
27b40 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
27b50 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
27b60 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
27b70 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
27b80 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
27b90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
27ba0 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
27bb0 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
27bc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
27bd0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
27be0 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
27bf0 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
27c00 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
27c10 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
27c20 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
27c30 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
27c40 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
27c50 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
27c60 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
27c70 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
27c80 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
27c90 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
27ca0 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
27cb0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
27cc0 75 72 6e 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20  urnal-NNNN".    
27cd0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
27ce0 62 3e 2d 77 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20  b>-wal-NNNN".   
27cf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
27d00 20 4e 4e 4e 4e 20 69 73 20 61 20 34 20 64 69 67   NNNN is a 4 dig
27d10 69 74 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65  it decimal numbe
27d20 72 2e 20 54 68 65 20 4e 4e 4e 4e 20 6e 61 6d 69  r. The NNNN nami
27d30 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a  ng schemes are .
27d40 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
27d50 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65  he test_multiple
27d60 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20  x.c module..    
27d70 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c  */.    nDb = sql
27d80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
27d90 74 68 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68  th) - 1; .    wh
27da0 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 7a 50  ile( nDb>0 && zP
27db0 61 74 68 5b 6e 44 62 5d 21 3d 27 6c 27 20 29 20  ath[nDb]!='l' ) 
27dc0 6e 44 62 2d 2d 3b 0a 20 20 20 20 6e 44 62 20 2d  nDb--;.    nDb -
27dd0 3d 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49  = ((flags & SQLI
27de0 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 3f 20 33  TE_OPEN_WAL) ? 3
27df0 20 3a 20 37 29 3b 0a 20 20 20 20 6d 65 6d 63 70   : 7);.    memcp
27e00 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
27e10 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
27e20 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66   = '\0';..    if
27e30 28 20 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26  ( 0==stat(zDb, &
27e40 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
27e50 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
27e60 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
27e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
27e90 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
27ea0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
27eb0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
27ec0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
27ed0 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
27ee0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
27ef0 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  *pMode = SQLITE_
27f00 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
27f10 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  MISSIONS;.  }.  
27f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27f30 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
27f40 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
27f50 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
27f60 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
27f70 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
27f80 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
27f90 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
27fa0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
27fb0 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
27fc0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
27fd0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
27fe0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
27ff0 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
28000 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
28010 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
28020 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
28030 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
28040 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
28050 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
28060 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
28070 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
28080 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
28090 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
280a0 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
280b0 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
280c0 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
280d0 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
280e0 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
280f0 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
28100 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
28110 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
28120 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
28130 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
28140 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
28150 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
28160 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
28170 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
28180 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
28190 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
281a0 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
281b0 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
281c0 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
281d0 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
281e0 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
281f0 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
28200 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
28210 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
28220 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
28230 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
28240 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
28250 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
28260 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
28270 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
28280 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
28290 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
282a0 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
282b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
282c0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
282d0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
282e0 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
282f0 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
28300 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
28310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28320 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
28330 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
28340 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
28350 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
28360 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
28370 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
28380 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
28390 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
283a0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
283b0 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
283c0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
283d0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
283e0 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
283f0 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
28400 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20  int dirfd = -1; 
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28420 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65  * Directory file
28430 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
28440 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
28450 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28460 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
28470 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   to open() */.  
28480 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
28490 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
284a0 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
284b0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
284c0 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  noLock;         
284d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
284e0 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69  ue to omit locki
284f0 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f  ng primitives */
28500 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28510 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
28520 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
28530 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20  turn Code */..  
28540 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
28550 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
28560 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
28570 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
28580 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
28590 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
285a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
285b0 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
285c0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
285d0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
285e0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
285f0 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
28600 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
28610 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
28620 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
28630 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
28640 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20  READWRITE);.#if 
28650 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
28660 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
28670 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d  t isAutoProxy  =
28680 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
28690 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
286a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
286b0 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
286c0 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
286d0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
286e0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
286f0 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
28700 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
28710 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
28720 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
28730 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
28740 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
28750 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
28760 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
28770 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
28780 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
28790 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
287a0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
287b0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
287c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
287d0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
287e0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
287f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
28800 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
28810 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
28820 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
28830 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
28840 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
28850 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
28860 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
28870 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
28880 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
28890 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
288a0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
288b0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
288c0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
288d0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
288e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
288f0 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
28900 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
28910 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
28920 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
28930 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
28940 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
28950 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
28960 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
28970 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
28980 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
28990 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
289a0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
289b0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
289c0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
289d0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
289e0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
289f0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
28a00 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
28a10 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
28a20 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
28a30 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
28a40 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
28a50 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
28a60 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
28a70 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
28a80 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
28a90 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
28aa0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
28ab0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
28ac0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
28ad0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
28ae0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
28af0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
28b00 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
28b10 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
28b20 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
28b30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
28b40 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
28b50 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
28b60 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
28b70 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
28b80 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
28b90 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
28ba0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
28bb0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
28bc0 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
28bd0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
28be0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
28bf0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
28c00 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
28c10 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
28c20 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
28c30 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
28c40 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
28c50 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
28c60 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
28c70 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
28c80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
28c90 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
28ca0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
28cb0 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
28cc0 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
28cd0 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
28ce0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
28cf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
28d00 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
28d10 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
28d20 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
28d30 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
28d40 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
28d50 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
28d60 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
28d70 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
28d80 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
28d90 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
28da0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
28db0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
28dc0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
28dd0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
28de0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
28df0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
28e00 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
28e10 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
28e20 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
28e30 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
28e40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
28e50 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
28e60 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
28e70 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
28e80 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
28e90 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
28ea0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
28eb0 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
28ec0 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
28ed0 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
28ee0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
28ef0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
28f00 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
28f10 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
28f20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28f30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
28f40 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
28f50 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
28f60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
28f70 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
28f80 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
28f90 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
28fa0 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
28fb0 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
28fc0 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
28fd0 65 20 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65  e && !isOpenDire
28fe0 63 74 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d  ctory);.    rc =
28ff0 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
29000 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c  (MAX_PATHNAME+1,
29010 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
29020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29030 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
29040 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
29050 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
29060 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
29070 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
29080 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  of the flags par
29090 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
290a0 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a   POSIX function.
290b0 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65    ** open(). The
290c0 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75  se must be calcu
290d0 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70  lated even if op
290e0 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  en() is not call
290f0 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79  ed, as.  ** they
29100 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
29110 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  s part of the fi
29120 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73  le handle and us
29130 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20  ed by the .  ** 
29140 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63  'conch file' loc
29150 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c  king functions l
29160 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ater on.  */.  i
29170 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
29180 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
29190 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
291a0 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e  ReadWrite ) open
291b0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b  Flags |= O_RDWR;
291c0 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
291d0 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  )    openFlags |
291e0 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
291f0 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
29200 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45  penFlags |= (O_E
29210 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b  XCL|O_NOFOLLOW);
29220 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  .  openFlags |= 
29230 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
29240 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66  INARY);..  if( f
29250 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
29260 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
29270 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
29280 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
29290 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
292a0 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61     rc = findCrea
292b0 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65  teFileMode(zName
292c0 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f  , flags, &openMo
292d0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
292e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
292f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
29300 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  pUnused );.     
29310 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
29320 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
29330 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29340 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
29350 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AL );.      retu
29360 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
29370 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
29380 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
29390 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
293a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
293b0 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
293c0 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
293d0 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20  openFlags));.   
293e0 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
293f0 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
29400 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
29410 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
29420 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
29430 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
29440 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
29450 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
29460 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61  ly. */.      fla
29470 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
29480 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
29490 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
294a0 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  );.      openFla
294b0 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
294c0 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66  _CREAT);.      f
294d0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
294e0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
294f0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
29500 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
29510 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
29520 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75  .      fd = robu
29530 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
29540 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
29550 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
29560 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
29570 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
29580 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
29590 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
295a0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
295b0 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
295c0 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  d;.    }.  }.  a
295d0 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a  ssert( fd>=0 );.
295e0 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
295f0 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
29600 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
29610 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64    if( p->pUnused
29620 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73   ){.    p->pUnus
29630 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20  ed->fd = fd;.   
29640 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61   p->pUnused->fla
29650 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
29660 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
29670 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
29680 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e  S.    zPath = zN
29690 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  ame;.#else.    u
296a0 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65  nlink(zName);.#e
296b0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c  ndif.  }.#if SQL
296c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
296d0 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b  NG_STYLE.  else{
296e0 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  .    p->openFlag
296f0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
29700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
29710 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
29720 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
29730 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
29740 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69  , &dirfd);.    i
29750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29760 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
29770 69 73 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  is safe to close
29780 20 66 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e   fd at this poin
29790 74 2c 20 62 65 63 61 75 73 65 20 69 74 20 69 73  t, because it is
297a0 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a   guaranteed not.
297b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f        ** to be o
297c0 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73  pen on a databas
297d0 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 77 65  e file. If it we
297e0 72 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74  re open on a dat
297f0 61 62 61 73 65 20 66 69 6c 65 2c 0a 20 20 20 20  abase file,.    
29800 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f    ** it would no
29810 74 20 62 65 20 73 61 66 65 20 74 6f 20 63 6c 6f  t be safe to clo
29820 73 65 20 61 73 20 74 68 69 73 20 77 6f 75 6c 64  se as this would
29830 20 72 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63   release any loc
29840 6b 73 20 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a  ks held.      **
29850 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 62 79 20   on the file by 
29860 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 2a  this process.  *
29870 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
29880 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
29890 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
298a0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
298b0 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
298c0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  );.      goto op
298d0 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
298e0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 46   }.  }..#ifdef F
298f0 44 5f 43 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63  D_CLOEXEC.  osFc
29900 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
29910 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
29920 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
29930 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
29940 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
29950 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
29960 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64  IN_DB;..  .#if d
29970 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
29980 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
29990 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
299a0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
299b0 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66 28 20 66   fsInfo;.  if( f
299c0 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e  statfs(fd, &fsIn
299d0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
299e0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
299f0 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  le)->lastErrno =
29a00 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
29a10 64 69 72 66 64 3e 3d 30 20 29 20 72 6f 62 75 73  dirfd>=0 ) robus
29a20 74 5f 63 6c 6f 73 65 28 70 2c 20 64 69 72 66 64  t_close(p, dirfd
29a30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
29a40 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
29a50 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
29a60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29a70 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
29a80 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
29a90 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
29aa0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
29ab0 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
29ac0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
29ad0 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
29ae0 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
29af0 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69  MSDOS;.  }.#endi
29b00 66 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.  .#if SQLITE_
29b10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29b20 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f  TYLE.#if SQLITE_
29b30 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
29b40 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f  KING.  isAutoPro
29b50 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  xy = 1;.#endif. 
29b60 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79   if( isAutoProxy
29b70 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c   && (zPath!=NULL
29b80 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26  ) && (!noLock) &
29b90 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b  & pVfs->xOpen ){
29ba0 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f  .    char *envfo
29bb0 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51  rce = getenv("SQ
29bc0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
29bd0 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20  _LOCKING");.    
29be0 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30  int useProxy = 0
29bf0 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ;..    /* SQLITE
29c00 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
29c10 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f  KING==1 means fo
29c20 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70  rce always use p
29c30 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20  roxy, 0 means . 
29c40 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20     ** never use 
29c50 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e  proxy, NULL mean
29c60 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20  s use proxy for 
29c70 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20  non-local files 
29c80 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  only.  */.    if
29c90 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c  ( envforce!=NULL
29ca0 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f   ){.      usePro
29cb0 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72  xy = atoi(envfor
29cc0 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ce)>0;.    }else
29cd0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
29ce0 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
29cf0 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a      if( statfs(z
29d00 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
29d10 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
29d20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
29d30 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c  e close(fd) call
29d40 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e   is sub-optimal.
29d50 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
29d60 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ned.        ** w
29d70 69 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61  ith fd is a data
29d80 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74  base file, and t
29d90 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63  here are other c
29da0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a  onnections open.
29db0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
29dc0 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
29dd0 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69   currently holdi
29de0 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ng advisory lock
29df0 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20  s on it,.       
29e00 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c   ** then the cal
29e10 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c  l to close() wil
29e20 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c  l cancel those l
29e30 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63  ocks. In practic
29e40 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  e,.        ** we
29e50 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61  're assuming tha
29e60 74 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e  t statfs() doesn
29e70 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74  't fail very oft
29e80 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20  en. At least.   
29e90 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c       ** not whil
29ea0 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  e other file des
29eb0 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
29ec0 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
29ed0 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ess on.        *
29ee0 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  * the same file 
29ef0 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f  are working.  */
29f00 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74  .        p->last
29f10 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
29f20 20 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64         if( dirfd
29f30 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
29f40 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
29f50 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
29f60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29f70 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
29f80 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(p, fd, __LINE_
29f90 5f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  _);.        rc =
29fa0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
29fb0 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67 6f  CESS;.        go
29fc0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
29fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29fe0 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49  useProxy = !(fsI
29ff0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
2a000 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  LOCAL);.    }.  
2a010 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29    if( useProxy )
2a020 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c  {.      rc = fil
2a030 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
2a040 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69  , fd, dirfd, pFi
2a050 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63  le, zPath, noLoc
2a060 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
2a070 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 44               isD
2a080 65 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c  elete, isReadonl
2a090 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
2a0a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a0b0 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
2a0c0 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2a0d0 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46  le((unixFile*)pF
2a0e0 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  ile, ":auto:");.
2a0f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2a100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a110 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e         /* Use un
2a120 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e  ixClose to clean
2a130 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65   up the resource
2a140 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49  s added in fillI
2a150 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20  nUnixFile .     
2a160 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61       ** and clea
2a170 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74  r all the struct
2a180 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73  ure's references
2a190 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
2a1a0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2a1b0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77  File->pMethods w
2a1c0 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73  ill be NULL so s
2a1d0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69  qlite3OsClose wi
2a1e0 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20  ll be a no-op . 
2a1f0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2a200 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28        unixClose(
2a210 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
2a220 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2a230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2a240 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2a250 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
2a260 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
2a270 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2a280 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72  le(pVfs, fd, dir
2a290 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
2a2a0 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  , noLock,.      
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2c0 69 73 44 65 6c 65 74 65 2c 20 69 73 52 65 61 64  isDelete, isRead
2a2d0 6f 6e 6c 79 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69  only);.open_fini
2a2e0 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  shed:.  if( rc!=
2a2f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a300 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
2a310 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  >pUnused);.  }. 
2a320 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2a330 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2a340 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
2a350 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
2a360 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
2a370 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
2a380 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
2a390 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
2a3a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a3b0 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
2a3c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2a3d0 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
2a3e0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
2a3f0 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
2a400 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
2a410 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2a420 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2a430 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
2a440 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
2a450 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
2a460 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
2a470 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
2a480 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
2a490 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
2a4a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a4b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2a4c0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
2a4d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
2a4e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2a4f0 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
2a500 28 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  ( unlink(zPath)=
2a510 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d  =(-1) && errno!=
2a520 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65  ENOENT ){.    re
2a530 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
2a540 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
2a550 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c  ELETE, "unlink",
2a560 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66   zPath);.  }.#if
2a570 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2a580 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66  BLE_DIRSYNC.  if
2a590 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20  ( dirSync ){.   
2a5a0 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
2a5b0 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
2a5c0 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
2a5d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a5e0 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  OK ){.#if OS_VXW
2a5f0 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66  ORKS.      if( f
2a600 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23  sync(fd)==-1 ).#
2a610 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66  else.      if( f
2a620 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69  sync(fd) ).#endi
2a630 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
2a640 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2a650 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
2a660 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79  _DIR_FSYNC, "fsy
2a670 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  nc", zPath);.   
2a680 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73     }.      robus
2a690 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
2a6a0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
2a6b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2a6c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a6d0 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 61   Test the exista
2a6e0 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
2a6f0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
2a700 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
2a710 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
2a720 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
2a730 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
2a740 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
2a750 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
2a760 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2a770 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
2a780 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2a790 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
2a7a0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2a7b0 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
2a7c0 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
2a7d0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2a7e0 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
2a7f0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
2a800 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
2a810 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2a820 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
2a830 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73   unixAccess(.  s
2a840 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2a850 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46  sed,   /* The VF
2a860 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
2a870 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64  s xAccess method
2a880 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2a890 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a   *zPath,      /*
2a8a0 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c   Path of the fil
2a8b0 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a  e to examine */.
2a8c0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2a8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
2a8e0 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  t do we want to 
2a8f0 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20  learn about the 
2a900 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20  zPath file? */. 
2a910 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
2a920 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2a930 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e  e result boolean
2a940 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2a950 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55  t amode = 0;.  U
2a960 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a970 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
2a980 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2a990 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2a9a0 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77  _ACCESS; );.  sw
2a9b0 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
2a9c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2a9d0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
2a9e0 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b      amode = F_OK
2a9f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2aa00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2aa10 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
2aa20 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57  .      amode = W
2aa30 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  _OK|R_OK;.      
2aa40 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2aa50 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2aa60 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  AD:.      amode 
2aa70 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = R_OK;.      br
2aa80 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
2aa90 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
2aaa0 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
2aab0 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
2aac0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73    *pResOut = (os
2aad0 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  Access(zPath, am
2aae0 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20  ode)==0);.  if( 
2aaf0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
2ab00 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a  CESS_EXISTS && *
2ab10 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73  pResOut ){.    s
2ab20 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2ab30 20 20 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28      if( 0==stat(
2ab40 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20  zPath, &buf) && 
2ab50 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29  buf.st_size==0 )
2ab60 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74  {.      *pResOut
2ab70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2ab80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ab90 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
2aba0 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
2abb0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
2abc0 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
2abd0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
2abe0 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
2abf0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
2ac00 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
2ac10 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
2ac20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
2ac30 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
2ac40 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
2ac50 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
2ac60 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
2ac70 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
2ac80 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
2ac90 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
2aca0 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
2acb0 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
2acc0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
2acd0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
2ace0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
2acf0 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
2ad00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2ad10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2ad20 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2ad30 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2ad40 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2ad50 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
2ad60 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
2ad70 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
2ad80 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
2ad90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2ada0 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
2adb0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
2adc0 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
2add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ade0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
2adf0 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  /.){..  /* It's 
2ae00 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2ae10 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2ae20 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2ae30 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2ae40 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2ae50 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2ae60 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2ae70 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2ae80 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2ae90 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
2aea0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
2aeb0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
2aec0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
2aed0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
2aee0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
2aef0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
2af00 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2af10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2af20 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72  RROR );..  asser
2af30 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
2af40 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d  ame==MAX_PATHNAM
2af50 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  E );.  UNUSED_PA
2af60 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
2af70 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d    zOut[nOut-1] =
2af80 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61   '\0';.  if( zPa
2af90 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[0]=='/' ){.  
2afa0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2afb0 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22  tf(nOut, zOut, "
2afc0 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
2afd0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
2afe0 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  wd;.    if( osGe
2aff0 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d  tcwd(zOut, nOut-
2b000 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
2b010 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
2b020 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2b030 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64  EN_BKPT, "getcwd
2b040 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
2b050 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74  .    nCwd = (int
2b060 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20  )strlen(zOut);. 
2b070 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2b080 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26  ntf(nOut-nCwd, &
2b090 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73  zOut[nCwd], "/%s
2b0a0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  ", zPath);.  }. 
2b0b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b0c0 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  K;.}...#ifndef S
2b0d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2b0e0 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
2b0f0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
2b100 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
2b110 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
2b120 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
2b130 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
2b140 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
2b150 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
2b160 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ed library..*/.#
2b170 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68  include <dlfcn.h
2b180 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  >.static void *u
2b190 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  nixDlOpen(sqlite
2b1a0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2b1b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2b1c0 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44  ename){.  UNUSED
2b1d0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2b1e0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c  ed);.  return dl
2b1f0 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
2b200 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f  RTLD_NOW | RTLD_
2b210 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  GLOBAL);.}../*.*
2b220 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  * SQLite calls t
2b230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d  his function imm
2b240 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61  ediately after a
2b250 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53   call to unixDlS
2b260 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44  ym() or.** unixD
2b270 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72  lOpen() fails (r
2b280 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f  eturns a null po
2b290 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72  inter). If a mor
2b2a0 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72  e detailed error
2b2b0 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61  .** message is a
2b2c0 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20  vailable, it is 
2b2d0 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f  written to zBufO
2b2e0 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ut. If no error 
2b2f0 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76  message.** is av
2b300 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74  ailable, zBufOut
2b310 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
2b320 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75  ied and SQLite u
2b330 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a  ses a default.**
2b340 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
2b350 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
2b360 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  nixDlError(sqlit
2b370 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2b380 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2b390 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e  *zBufOut){.  con
2b3a0 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
2b3b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b3c0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e  R(NotUsed);.  un
2b3d0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2b3e0 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72    zErr = dlerror
2b3f0 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  ();.  if( zErr )
2b400 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2b410 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
2b420 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72  fOut, "%s", zErr
2b430 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
2b440 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61  veMutex();.}.sta
2b450 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44  tic void (*unixD
2b460 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
2b470 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
2b480 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a  *p, const char*z
2b490 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f  Sym))(void){.  /
2b4a0 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68  * .  ** GCC with
2b4b0 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
2b4c0 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20  s says that C90 
2b4d0 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
2b4e0 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a   void* to be.  *
2b4f0 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f  * cast into a po
2b500 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2b510 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68  ion.  And yet th
2b520 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28  e library dlsym(
2b530 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72  ) routine.  ** r
2b540 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77  eturns a void* w
2b550 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61  hich is really a
2b560 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
2b570 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20  nction.  So how 
2b580 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64  do we.  ** use d
2b590 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64  lsym() with -ped
2b5a0 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20  antic-errors?.  
2b5b0 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65  **.  ** Variable
2b5c0 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69   x below is defi
2b5d0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e  ned to be a poin
2b5e0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2b5f0 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61  n taking.  ** pa
2b600 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61  rameters void* a
2b610 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61  nd const char* a
2b620 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70  nd returning a p
2b630 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
2b640 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e  tion..  ** We in
2b650 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73  itialize x by as
2b660 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69  signing it a poi
2b670 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79  nter to the dlsy
2b680 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  m() function..  
2b690 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d  ** (That assignm
2b6a0 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63  ent requires a c
2b6b0 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63  ast.)  Then we c
2b6c0 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  all the function
2b6d0 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69   that.  ** x poi
2b6e0 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20  nts to.  .  **. 
2b6f0 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72   ** This work-ar
2b700 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79  ound is unlikely
2b710 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74   to work correct
2b720 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d  ly on any system
2b730 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20   where.  ** you 
2b740 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61  really cannot ca
2b750 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  st a function po
2b760 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a  inter into void*
2b770 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20  .  But then, on 
2b780 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  the.  ** other h
2b790 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c  and, dlsym() wil
2b7a0 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75  l not work on su
2b7b0 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68  ch a system eith
2b7c0 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20  er, so we have. 
2b7d0 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c   ** not really l
2b7e0 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20  ost anything..  
2b7f0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29  */.  void (*(*x)
2b800 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
2b810 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e  r*))(void);.  UN
2b820 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2b830 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28  otUsed);.  x = (
2b840 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c  void(*(*)(void*,
2b850 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
2b860 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74  id))dlsym;.  ret
2b870 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d  urn (*x)(p, zSym
2b880 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2b890 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c   unixDlClose(sql
2b8a0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2b8b0 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  d, void *pHandle
2b8c0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2b8d0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2b8e0 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c    dlclose(pHandl
2b8f0 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
2b900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
2b910 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
2b920 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
2b930 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e  efine unixDlOpen
2b940 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
2b950 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  ixDlError 0.  #d
2b960 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20  efine unixDlSym 
2b970 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
2b980 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  ixDlClose 0.#end
2b990 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
2b9a0 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
2b9b0 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65  ndom data to the
2b9c0 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
2b9d0 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
2b9e0 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e   int unixRandomn
2b9f0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
2ba00 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
2ba10 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2ba20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2ba30 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2ba40 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e  assert((size_t)n
2ba50 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d  Buf>=(sizeof(tim
2ba60 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  e_t)+sizeof(int)
2ba70 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76  ));..  /* We hav
2ba80 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
2ba90 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20  zBuf to prevent 
2baa0 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65  valgrind from re
2bab0 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72  porting.  ** err
2bac0 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74  ors.  The report
2bad0 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67  s issued by valg
2bae0 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65  rind are incorre
2baf0 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20  ct - we would.  
2bb00 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74  ** prefer that t
2bb10 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65  he randomness be
2bb20 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61   increased by ma
2bb30 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a  king use of the.
2bb40 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
2bb50 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66  ed space in zBuf
2bb60 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20   - but valgrind 
2bb70 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77  errors tend to w
2bb80 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75  orry.  ** some u
2bb90 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68  sers.  Rather th
2bba0 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65  an argue, it see
2bbb0 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74  ms easier just t
2bbc0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  o initialize.  *
2bbd0 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61  * the whole arra
2bbe0 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61  y and silence va
2bbf0 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20  lgrind, even if 
2bc00 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20  that means less 
2bc10 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20  randomness.  ** 
2bc20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65  in the random se
2bc30 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ed..  **.  ** Wh
2bc40 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74  en testing, init
2bc50 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20  ializing zBuf[] 
2bc60 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77  to zero is all w
2bc70 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e  e do.  That mean
2bc80 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61  s.  ** that we a
2bc90 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
2bca0 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  me random number
2bcb0 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73   sequence.  This
2bcc0 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20   makes the.  ** 
2bcd0 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65  tests repeatable
2bce0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
2bcf0 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
2bd00 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2bd10 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20  ITE_TEST).  {.  
2bd20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20    int pid, fd;. 
2bd30 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2bd40 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
2bd50 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  m", O_RDONLY, 0)
2bd60 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
2bd70 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
2bd80 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
2bd90 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
2bda0 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
2bdb0 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  t));.      pid =
2bdc0 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
2bdd0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
2bde0 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
2bdf0 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
2be00 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
2be10 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64  of(t)+sizeof(pid
2be20 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
2be30 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
2be40 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
2be50 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c  of(pid);.    }el
2be60 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42  se{.      do{ nB
2be70 75 66 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20  uf = osRead(fd, 
2be80 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68  zBuf, nBuf); }wh
2be90 69 6c 65 28 20 6e 42 75 66 3c 30 20 26 26 20 65  ile( nBuf<0 && e
2bea0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
2beb0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
2bec0 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
2bed0 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  _);.    }.  }.#e
2bee0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42  ndif.  return nB
2bef0 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c  uf;.}.../*.** Sl
2bf00 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
2bf10 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
2bf20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
2bf30 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
2bf40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2bf50 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
2bf60 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
2bf70 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65  to sleep..** The
2bf80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2bf90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
2bfa0 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73  icroseconds of s
2bfb0 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  leep actually.**
2bfc0 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
2bfd0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
2bfe0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c  perating system,
2bff0 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a   a number which.
2c000 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61  ** might be grea
2c010 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
2c020 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e  l to the argumen
2c030 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a  t, but not less.
2c040 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75  ** than the argu
2c050 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
2c060 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71  int unixSleep(sq
2c070 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2c080 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  ed, int microsec
2c090 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58  onds){.#if OS_VX
2c0a0 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
2c0b0 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73  imespec sp;..  s
2c0c0 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f  p.tv_sec = micro
2c0d0 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30  seconds / 100000
2c0e0 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20  0;.  sp.tv_nsec 
2c0f0 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  = (microseconds 
2c100 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30  % 1000000) * 100
2c110 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26  0;.  nanosleep(&
2c120 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55  sp, NULL);.  UNU
2c130 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2c140 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
2c150 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
2c160 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  elif defined(HAV
2c170 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
2c180 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
2c190 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  p(microseconds);
2c1a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2c1b0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2c1c0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
2c1d0 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  nds;.#else.  int
2c1e0 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72   seconds = (micr
2c1f0 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29  oseconds+999999)
2c200 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65  /1000000;.  slee
2c210 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  p(seconds);.  UN
2c220 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2c230 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2c240 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
2c250 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
2c260 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2c270 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
2c280 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
2c290 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
2c2a0 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
2c2b0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
2c2c0 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
2c2d0 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
2c2e0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
2c2f0 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
2c300 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
2c310 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
2c320 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2c330 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
2c340 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
2c350 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
2c360 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
2c370 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
2c380 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
2c390 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
2c3a0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
2c3b0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
2c3c0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
2c3d0 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
2c3e0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2c3f0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2c400 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
2c410 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
2c420 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
2c430 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
2c440 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
2c450 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
2c460 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
2c470 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
2c480 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
2c490 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
2c4a0 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
2c4b0 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
2c4c0 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
2c4d0 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
2c4e0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20  cess, return 0. 
2c4f0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2c500 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
2c510 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
2c520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2c530 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
2c540 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
2c550 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33  NotUsed, sqlite3
2c560 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
2c570 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2c580 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
2c590 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
2c5a0 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
2c5b0 29 38 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65  )8640000;.#if de
2c5c0 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29  fined(NO_GETTOD)
2c5d0 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
2c5e0 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f  ime(&t);.  *piNo
2c5f0 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e  w = ((sqlite3_in
2c600 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e  t64)t)*1000 + un
2c610 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f  ixEpoch;.#elif O
2c620 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
2c630 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77  ct timespec sNow
2c640 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  ;.  clock_gettim
2c650 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45  e(CLOCK_REALTIME
2c660 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e  , &sNow);.  *piN
2c670 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
2c680 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
2c690 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
2c6a0 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f   + sNow.tv_nsec/
2c6b0 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20  1000000;.#else. 
2c6c0 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
2c6d0 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f  sNow;.  gettimeo
2c6e0 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a  fday(&sNow, 0);.
2c6f0 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
2c700 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
2c710 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
2c720 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
2c730 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64  _usec/1000;.#end
2c740 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
2c750 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
2c760 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2c770 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
2c780 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
2c790 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
2c7a0 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
2c7b0 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
2c7c0 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
2c7d0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c7e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2c7f0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2c800 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2c810 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2c820 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2c830 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
2c840 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2c850 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2c860 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
2c870 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
2c880 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
2c890 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2c8a0 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
2c8b0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2c8c0 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
2c8d0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
2c8e0 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
2c8f0 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
2c900 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55  3_int64 i;.  UNU
2c910 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2c920 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 43 75  tUsed);.  unixCu
2c930 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
2c940 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
2c950 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
2c960 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2c970 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68  *.** We added th
2c980 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
2c990 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68  ) method with th
2c9a0 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70  e intention of p
2c9b0 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74  roviding.** bett
2c9c0 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72  er low-level err
2c9d0 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e  or messages when
2c9e0 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65   operating-syste
2c9f0 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20  m problems come 
2ca00 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c  up.** during SQL
2ca10 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ite operation.  
2ca20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65  But so far, none
2ca30 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65   of that has bee
2ca40 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
2ca50 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53   in the core.  S
2ca60 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
2ca70 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
2ca80 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20   For now, it is 
2ca90 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63  merely.** a plac
2caa0 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61  e-holder..*/.sta
2cab0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
2cac0 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
2cad0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2cae0 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
2caf0 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
2cb00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2cb10 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
2cb20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2cb30 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
2cb40 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2cb50 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
2cb60 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  0;.}.../*.******
2cb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cb80 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65  ** End of sqlite
2cb90 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
2cba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cbb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2cbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cbd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cbe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cbf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc00 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
2cc10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2cc60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc70 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78  ***** Begin Prox
2cc80 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
2cc90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
2ccb0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2ccc0 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e  s a "uber-lockin
2ccd0 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69  g-method" in thi
2cce0 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65  s sense:  It use
2ccf0 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c  s the.** other l
2cd00 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
2cd10 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b  n secondary lock
2cd20 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c   files.  Proxy l
2cd30 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d  ocking is a.** m
2cd40 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74  eta-layer over t
2cd50 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74  op of the primit
2cd60 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ive locking impl
2cd70 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20  emented above.  
2cd80 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73  For.** this reas
2cd90 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
2cda0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2cdb0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
2cdc0 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a  g is deferred.**
2cdd0 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74   until late in t
2cde0 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61  he file (here) a
2cdf0 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
2ce00 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64  other I/O method
2ce10 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64  s have.** been d
2ce20 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74  efined - so that
2ce30 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
2ce40 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61  ocking methods a
2ce50 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  re available.** 
2ce60 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68  as services to h
2ce70 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70  elp with the imp
2ce80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  lementation of p
2ce90 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  roxy locking..**
2cea0 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  .****.**.** The 
2ceb0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20  default locking 
2cec0 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74  schemes in SQLit
2ced0 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65  e use byte-range
2cee0 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a   locks on the.**
2cef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2cf00 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66  o coordinate saf
2cf10 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63  e, concurrent ac
2cf20 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2cf30 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20   readers.** and 
2cf40 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f  writers [http://
2cf50 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69  sqlite.org/locki
2cf60 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65  ngv3.html].  The
2cf70 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69   five file locki
2cf80 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e  ng.** states (UN
2cf90 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c  LOCKED, PENDING,
2cfa0 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
2cfb0 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72  D, EXCLUSIVE) ar
2cfc0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  e implemented.**
2cfd0 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26   as POSIX read &
2cfe0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65   write locks ove
2cff0 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c  r fixed set of l
2d000 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73  ocations (via fs
2d010 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20  ctl),.** on AFP 
2d020 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63  and SMB only exc
2d030 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
2d040 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69  e locks are avai
2d050 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a  lable via fsctl.
2d060 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a  ** with _IOWR('z
2d070 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
2d080 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20  teRangeLockPB2) 
2d090 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d  to track the sam
2d0a0 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54  e 5 states..** T
2d0b0 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52  o simulate a F_R
2d0c0 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72  DLCK on the shar
2d0d0 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50  ed range, on AFP
2d0e0 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65   a randomly sele
2d0f0 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20  cted.** address 
2d100 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  in the shared ra
2d110 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
2d120 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
2d130 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68  the entire.** sh
2d140 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2d150 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55  ken for an EXCLU
2d160 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a  SIVE lock):.**.*
2d170 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  *      PENDING_B
2d180 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30  YTE        0x400
2d190 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20  00000..   ..**  
2d1a0 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54      RESERVED_BYT
2d1b0 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30  E       0x400000
2d1c0 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45  01.**      SHARE
2d1d0 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30  D_RANGE        0
2d1e0 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34  x40000002 -> 0x4
2d1f0 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68  0000200.**.** Th
2d200 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e  is works well on
2d210 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
2d220 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77  system, but show
2d230 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a  s a nearly 100x.
2d240 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72  ** slowdown in r
2d250 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ead performance 
2d260 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74  on AFP because t
2d270 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69  he AFP client di
2d280 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65  sables.** the re
2d290 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79  ad cache when by
2d2a0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2d2b0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61  re present.  Ena
2d2c0 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a  bling the read.*
2d2d0 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20  * cache exposes 
2d2e0 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  a cache coherenc
2d2f0 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69  y problem that i
2d300 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c  s present on all
2d310 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74   OS X.** support
2d320 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20  ed network file 
2d330 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e  systems.  NFS an
2d340 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72  d AFP both obser
2d350 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d  ve the.** close-
2d360 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63  to-open semantic
2d370 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63  s for ensuring c
2d380 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a  ache coherency.*
2d390 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f  * [http://nfs.so
2d3a0 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66  urceforge.net/#f
2d3b0 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f  aq_a8], which do
2d3c0 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65  es not effective
2d3d0 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68  ly.** address th
2d3e0 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66  e requirements f
2d3f0 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61  or concurrent da
2d400 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79  tabase access by
2d410 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61   multiple.** rea
2d420 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
2d430 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e  .** [http://www.
2d440 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74  nabble.com/SQLit
2d450 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63  e-on-NFS-cache-c
2d460 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35  oherency-td15655
2d470 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a  701.html]..**.**
2d480 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20   To address the 
2d490 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20  performance and 
2d4a0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2d4b0 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69  issues, proxy fi
2d4c0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68  le locking.** ch
2d4d0 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61  anges the way da
2d4e0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73  tabase access is
2d4f0 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c   controlled by l
2d500 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74  imiting access t
2d510 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f  o a.** single ho
2d520 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64  st at a time and
2d530 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63   moving file loc
2d540 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61  ks off of the da
2d550 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
2d560 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20  nd onto a proxy 
2d570 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  file on the loca
2d580 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20  l file system.  
2d590 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20  .**.**.** Using 
2d5a0 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d  proxy locks.** -
2d5b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d5c0 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a  .**.** C APIs.**
2d5d0 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2d5e0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2d5f0 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54  name, SQLITE_SET
2d600 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a  _LOCKPROXYFILE,.
2d610 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2d620 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f           <proxy_
2d630 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22  path> | ":auto:"
2d640 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  );.**  sqlite3_f
2d650 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
2d660 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47  dbname, SQLITE_G
2d670 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2d680 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29  , &<proxy_path>)
2d690 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
2d6a0 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
2d6b0 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
2d6c0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2d6d0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
2d6e0 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
2d6f0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
2d700 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
2d710 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
2d720 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
2d730 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
2d740 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
2d750 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
2d760 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
2d770 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
2d780 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
2d790 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
2d7a0 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
2d7b0 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
2d7c0 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
2d7d0 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
2d7e0 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
2d7f0 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
2d800 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
2d810 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
2d820 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
2d830 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
2d840 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
2d850 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
2d860 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
2d870 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
2d880 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
2d890 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
2d8a0 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
2d8b0 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
2d8c0 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
2d8d0 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
2d8e0 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
2d8f0 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
2d900 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
2d910 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
2d920 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
2d930 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
2d940 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
2d950 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
2d960 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
2d970 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
2d980 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
2d990 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
2d9a0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
2d9b0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
2d9c0 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
2d9d0 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
2d9e0 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
2d9f0 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
2da00 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
2da10 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
2da20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2da30 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
2da40 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
2da50 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
2da60 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
2da70 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
2da80 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
2da90 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
2daa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2dab0 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
2dac0 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
2dad0 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
2dae0 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
2daf0 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
2db00 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
2db10 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
2db20 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
2db30 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
2db40 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
2db50 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
2db60 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
2db70 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
2db80 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
2db90 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
2dba0 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
2dbb0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
2dbc0 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
2dbd0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
2dbe0 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
2dbf0 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
2dc00 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
2dc10 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
2dc20 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
2dc30 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
2dc40 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
2dc50 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
2dc60 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
2dc70 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
2dc80 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
2dc90 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
2dca0 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
2dcb0 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
2dcc0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2dcd0 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
2dce0 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
2dcf0 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
2dd00 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
2dd10 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27  ot exist, or it'
2dd20 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f  s contents do no
2dd30 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68  t match the.** h
2dd40 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72  ost ID and/or pr
2dd50 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74  oxy path, then t
2dd60 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c  he lock is escal
2dd70 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75  ated to an exclu
2dd80 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64  sive.** lock and
2dd90 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2dda0 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61  contents is upda
2ddb0 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73  ted with the hos
2ddc0 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a  t ID and proxy.*
2ddd0 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c  * path and the l
2dde0 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65  ock is downgrade
2ddf0 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  d to a shared lo
2de00 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68  ck again.  If th
2de10 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65  e conch.** is he
2de20 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72  ld by another pr
2de30 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68  ocess (with a sh
2de40 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20  ared lock), the 
2de50 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
2de60 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20  * will fail and 
2de70 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2de80 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2de90 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20  he proxy file - 
2dea0 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69  a single-byte fi
2deb0 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20  le used for all 
2dec0 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f  advisory file lo
2ded0 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  cks.** normally 
2dee0 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
2def0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68  abase file.   Th
2df00 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61  is allows for sa
2df10 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66  fe sharing.** of
2df20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2df30 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  le for multiple 
2df40 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
2df50 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ers on the same.
2df60 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e  ** host (the con
2df70 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ch ensures that 
2df80 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65  they all use the
2df90 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b   same local lock
2dfa0 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65   file)..**.** Re
2dfb0 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63  questing the loc
2dfc0 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74  k proxy does not
2dfd0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b   immediately tak
2dfe0 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20  e the conch, it 
2dff0 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e  is.** only taken
2e000 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
2e010 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20  request to lock 
2e020 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2e030 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73   made.  .** This
2e040 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d   matches the sem
2e050 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72  antics of the tr
2e060 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  aditional lockin
2e070 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72  g behavior, wher
2e080 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63  e.** opening a c
2e090 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
2e0a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
2e0b0 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63  s not take a loc
2e0c0 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20  k on it..** The 
2e0d0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
2e0e0 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73  an open file des
2e0f0 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e  criptor are main
2e100 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a  tained until .**
2e110 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2e120 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2e130 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a  is closed. .**.*
2e140 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
2e150 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69   and the lock fi
2e160 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c  le are never del
2e170 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c  eted so they onl
2e180 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
2e190 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73  created the firs
2e1a0 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20  t time they are 
2e1b0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66  used..**.** Conf
2e1c0 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2e1d0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
2e1e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2e1f0 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f    SQLITE_PREFER_
2e200 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  PROXY_LOCKING.**
2e210 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61  .**       Databa
2e220 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65  se files accesse
2e230 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66  d on non-local f
2e240 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a  ile systems are.
2e250 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74  **       automat
2e260 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65  ically configure
2e270 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  d for proxy lock
2e280 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20  ing, lock files 
2e290 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  are.**       nam
2e2a0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2e2b0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
2e2c0 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20  logic as.**     
2e2d0 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72    PRAGMA lock_pr
2e2e0 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a  oxy_file=":auto:
2e2f0 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c  ".**    .**  SQL
2e300 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
2e310 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62  **.**       Enab
2e320 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20  les the logging 
2e330 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  of error message
2e340 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64  s during host id
2e350 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72   file.**       r
2e360 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65  etrieval and cre
2e370 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
2e380 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
2e390 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
2e3a0 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
2e3b0 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
2e3c0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
2e3d0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
2e3e0 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
2e3f0 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
2e400 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
2e410 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
2e420 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
2e430 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
2e440 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
2e450 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
2e460 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
2e470 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
2e480 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
2e490 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
2e4a0 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
2e4b0 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
2e4c0 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
2e4d0 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
2e4e0 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
2e4f0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
2e500 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2e510 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
2e520 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
2e530 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
2e540 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2e550 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
2e560 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
2e570 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
2e580 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
2e590 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
2e5a0 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
2e5b0 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
2e5c0 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
2e5d0 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
2e5e0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
2e5f0 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
2e600 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68  icity calling th
2e610 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
2e620 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
2e630 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
2e640 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
2e650 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
2e660 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
2e670 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
2e680 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
2e690 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
2e6a0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
2e6b0 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
2e6c0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2e6d0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2e6e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
2e6f0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f  *.** The proxyLo
2e700 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73  ckingContext has
2e710 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69   the path and fi
2e720 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  le structures fo
2e730 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a  r the remote .**
2e740 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79   and local proxy
2e750 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a   files in it.*/.
2e760 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70  typedef struct p
2e770 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2e780 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  xt proxyLockingC
2e790 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70  ontext;.struct p
2e7a0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2e7b0 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt {.  unixFile 
2e7c0 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
2e7d0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63      /* Open conc
2e7e0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  h file */.  char
2e7f0 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b   *conchFilePath;
2e800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2e810 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
2e820 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2e830 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20   *lockProxy;    
2e840 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f       /* Open pro
2e850 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
2e860 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78    char *lockProx
2e870 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  yPath;         /
2e880 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
2e890 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
2e8a0 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  .  char *dbPath;
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
2e8d0 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  pen file */.  in
2e8e0 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20  t conchHeld;    
2e8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
2e900 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
2e910 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b  held, -1 if lock
2e920 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  less */.  void *
2e930 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
2e940 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  t;     /* Origin
2e950 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78  al lockingcontex
2e960 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20  t to restore on 
2e970 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  close */.  sqlit
2e980 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
2e990 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b  nst *pOldMethod;
2e9a0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2e9b0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72   I/O methods for
2e9c0 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   close */.};../*
2e9d0 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c   .** The proxy l
2e9e0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f  ock file path fo
2e9f0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
2ea00 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74  t dbPath is writ
2ea10 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20  ten into lPath, 
2ea20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70  .** which must p
2ea30 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77  oint to valid, w
2ea40 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c  ritable memory l
2ea50 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
2ea60 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a  a maxLen length.
2ea70 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a  ** file path. .*
2ea80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2ea90 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f  xyGetLockPath(co
2eaa0 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
2eab0 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73  , char *lPath, s
2eac0 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20  ize_t maxLen){. 
2ead0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20   int len;.  int 
2eae0 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  dbLen;.  int i;.
2eaf0 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58  .#ifdef LOCKPROX
2eb00 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72  YDIR.  len = str
2eb10 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b  lcpy(lPath, LOCK
2eb20 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e  PROXYDIR, maxLen
2eb30 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66  );.#else.# ifdef
2eb40 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52   _CS_DARWIN_USER
2eb50 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20  _TEMP_DIR.  {.  
2eb60 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f    if( !confstr(_
2eb70 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2eb80 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20  EMP_DIR, lPath, 
2eb90 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20  maxLen) ){.     
2eba0 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
2ebb0 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25  CKPATH  failed %
2ebc0 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25  s errno=%d pid=%
2ebd0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2ebe0 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e       lPath, errn
2ebf0 6f 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  o, getpid()));. 
2ec00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ec10 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
2ec20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73     }.    len = s
2ec30 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73  trlcat(lPath, "s
2ec40 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61  qliteplocks", ma
2ec50 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23  xLen);    .  }.#
2ec60 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74   else.  len = st
2ec70 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74  rlcpy(lPath, "/t
2ec80 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  mp/", maxLen);.#
2ec90 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20   endif.#endif.. 
2eca0 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31   if( lPath[len-1
2ecb0 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65  ]!='/' ){.    le
2ecc0 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
2ecd0 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  h, "/", maxLen);
2ece0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61  .  }.  .  /* tra
2ecf0 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61  nsform the db pa
2ed00 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63  th to a unique c
2ed10 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ache name */.  d
2ed20 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  bLen = (int)strl
2ed30 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f  en(dbPath);.  fo
2ed40 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20  r( i=0; i<dbLen 
2ed50 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e  && (i+len+7)<(in
2ed60 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  t)maxLen; i++){.
2ed70 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
2ed80 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
2ed90 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
2eda0 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
2edb0 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
2edc0 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
2edd0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
2ede0 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43  axLen);.  OSTRAC
2edf0 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
2ee00 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
2ee10 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
2ee20 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
2ee30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2ee40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a  E_OK;.}../* . **
2ee50 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63   Creates the loc
2ee60 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d  k file and any m
2ee70 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69  issing directori
2ee80 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20  es in lockPath. 
2ee90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2eea0 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
2eeb0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  h(const char *lo
2eec0 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  ckPath){.  int i
2eed0 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75  , len;.  char bu
2eee0 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  f[MAXPATHLEN];. 
2eef0 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
2ef00 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b    .  assert(lock
2ef10 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f  Path!=NULL);.  /
2ef20 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  * try to create 
2ef30 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64  all the intermed
2ef40 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73  iate directories
2ef50 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74   */.  len = (int
2ef60 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68  )strlen(lockPath
2ef70 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f  );.  buf[0] = lo
2ef80 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72  ckPath[0];.  for
2ef90 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b  ( i=1; i<len; i+
2efa0 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  + ){.    if( loc
2efb0 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20  kPath[i] == '/' 
2efc0 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20  && (i - start > 
2efd0 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f  0) ){.      /* o
2efe0 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61  nly mkdir if lea
2eff0 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20  f dir != "." or 
2f000 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20  "/" or ".." */. 
2f010 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74       if( i-start
2f020 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d  >2 || (i-start==
2f030 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  1 && buf[start] 
2f040 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
2f050 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20  art] != '/') .  
2f060 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61         || (i-sta
2f070 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61  rt==2 && buf[sta
2f080 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
2f090 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e  f[start+1] != '.
2f0a0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75  ') ){.        bu
2f0b0 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20  f[i]='\0';.     
2f0c0 20 20 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66     if( mkdir(buf
2f0d0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2f0e0 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
2f0f0 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
2f100 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
2f110 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
2f120 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
2f130 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
2f140 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
2f150 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
2f160 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
2f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f180 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
2f190 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
2f1a0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2f1b0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
2f1c0 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
2f1d0 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
2f1e0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
2f1f0 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
2f200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f210 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2f220 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
2f230 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
2f240 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
2f250 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
2f260 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
2f270 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
2f280 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61  id=%d\n", lockPa
2f290 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2f2a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2f2b0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2f2c0 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
2f2d0 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
2f2e0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
2f2f0 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2f300 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
2f310 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
2f320 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
2f330 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
2f340 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
2f350 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2f360 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
2f370 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
2f380 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
2f390 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
2f3a0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
2f3b0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2f3c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
2f3d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2f3e0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
2f3f0 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
2f400 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
2f410 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
2f420 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
2f430 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
2f440 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
2f450 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
2f460 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
2f470 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
2f480 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
2f490 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
2f4a0 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
2f4b0 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
2f4c0 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
2f4d0 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69  d = -1;.  int di
2f4e0 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78  rfd = -1;.  unix
2f4f0 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
2f500 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f510 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
2f520 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
2f530 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
2f540 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
2f550 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
2f560 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2f570 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
2f580 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
2f590 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
2f5a0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
2f5b0 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
2f5c0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
2f5d0 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
2f5e0 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
2f5f0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
2f600 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
2f610 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
2f620 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
2f630 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
2f640 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
2f650 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
2f660 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2f670 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
2f680 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
2f690 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
2f6a0 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
2f6b0 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
2f6c0 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
2f6d0 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
2f6e0 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
2f6f0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
2f700 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
2f710 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2f720 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
2f730 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
2f740 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
2f750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2f760 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
2f770 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2f780 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2f790 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2f7a0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2f7b0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2f7c0 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2f7d0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
2f7e0 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
2f7f0 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
2f800 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
2f810 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
2f820 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
2f830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f840 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2f850 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2f860 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2f870 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2f880 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IONS);.      }. 
2f890 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
2f8a0 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
2f8b0 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
2f8c0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
2f8d0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
2f8e0 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
2f8f0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2f900 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72  SSIONS);.    ter
2f910 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
2f920 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2f930 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c     if( islockfil
2f940 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2f950 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
2f960 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20     }.    switch 
2f970 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20  (terrno) {.     
2f980 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20   case EACCES:.  
2f990 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f9a0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
2f9b0 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20  case EIO: .     
2f9c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f9d0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20  _IOERR_LOCK; /* 
2f9e0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
2f9f0 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20  s the conch */. 
2fa00 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
2fa10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fa20 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2fa30 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  T;.    }.  }.  .
2fa40 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69    pNew = (unixFi
2fa50 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
2fa60 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77  loc(sizeof(*pNew
2fa70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  ));.  if( pNew==
2fa80 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  NULL ){.    rc =
2fa90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2faa0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61     goto end_crea
2fab0 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20  te_proxy;.  }.  
2fac0 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
2fad0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
2fae0 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46  );.  pNew->openF
2faf0 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2fb00 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
2fb10 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  yVfs, 0, sizeof(
2fb20 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75  dummyVfs));.  du
2fb30 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20  mmyVfs.pAppData 
2fb40 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  = (void*)&autolo
2fb50 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75  ckIoFinder;.  du
2fb60 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22  mmyVfs.zName = "
2fb70 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65  dummy";.  pUnuse
2fb80 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55  d->fd = fd;.  pU
2fb90 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f  nused->flags = o
2fba0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  penFlags;.  pNew
2fbb0 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
2fbc0 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66  sed;.  .  rc = f
2fbd0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64  illInUnixFile(&d
2fbe0 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72  ummyVfs, fd, dir
2fbf0 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  fd, (sqlite3_fil
2fc00 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30  e*)pNew, path, 0
2fc10 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
2fc20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fc30 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e      *ppFile = pN
2fc40 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ew;.    return S
2fc50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e  QLITE_OK;.  }.en
2fc60 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20  d_create_proxy: 
2fc70 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f     .  robust_clo
2fc80 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c  se(pNew, fd, __L
2fc90 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65  INE__);.  sqlite
2fca0 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
2fcb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
2fcc0 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  used);.  return 
2fcd0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
2fce0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
2fcf0 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
2fd00 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
2fd10 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
2fd20 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
2fd30 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
2fd40 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
2fd50 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
2fd60 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20  OSTIDLEN    16  
2fd70 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f  /* conch file ho
2fd80 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a  st id length */.
2fd90 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64  ./* Not always d
2fda0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65  efined in the he
2fdb0 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68  aders as it ough
2fdc0 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72  t to be */.exter
2fdd0 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69  n int gethostuui
2fde0 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e  d(uuid_t id, con
2fdf0 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  st struct timesp
2fe00 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67  ec *wait);../* g
2fe10 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76  et the host ID v
2fe20 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29  ia gethostuuid()
2fe30 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70  , pHostID must p
2fe40 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f  oint to PROXY_HO
2fe50 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65  STIDLEN .** byte
2fe60 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65  s of writable me
2fe70 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
2fe80 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74  int proxyGetHost
2fe90 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ID(unsigned char
2fea0 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a   *pHostID, int *
2feb0 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72  pError){.  asser
2fec0 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  t(PROXY_HOSTIDLE
2fed0 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64  N == sizeof(uuid
2fee0 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  _t));.  memset(p
2fef0 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59  HostID, 0, PROXY
2ff00 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66  _HOSTIDLEN);.#if
2ff10 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f   defined(__MAX_O
2ff20 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
2ff30 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20 20  REQUIRED)\.     
2ff40 20 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f 4d            && __M
2ff50 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f  AC_OS_X_VERSION_
2ff60 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30 35  MIN_REQUIRED<105
2ff70 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  0.  {.    static
2ff80 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69   const struct ti
2ff90 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d  mespec timeout =
2ffa0 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65   {1, 0}; /* 1 se
2ffb0 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20  c timeout */.   
2ffc0 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69 64   if( gethostuuid
2ffd0 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f  (pHostID, &timeo
2ffe0 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ut) ){.      int
2fff0 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20   err = errno;.  
30000 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
30010 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f  {.        *pErro
30020 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d  r = err;.      }
30030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
30040 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
30050 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  }.  }.#endif.#if
30060 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
30070 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75    /* simulate mu
30080 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
30090 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
300a0 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
300b0 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  s */.  if( sqlit
300c0 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d  e3_hostid_num !=
300d0 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44   0){.    pHostID
300e0 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f  [0] = (char)(pHo
300f0 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29  stID[0] + (char)
30100 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  (sqlite3_hostid_
30110 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20  num & 0xFF));.  
30120 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65  }.#endif.  .  re
30130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30140 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20  }../* The conch 
30150 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
30160 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69  e header, host i
30170 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  d and lock file 
30180 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  path. */.#define
30190 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53   PROXY_CONCHVERS
301a0 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74  ION 2   /* 1-byt
301b0 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74  e header, 16-byt
301c0 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20  e host id, path 
301d0 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
301e0 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20  _HEADERLEN    1 
301f0 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
30200 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f  header length */
30210 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50  .#define PROXY_P
30220 41 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f  ATHINDEX    (PRO
30230 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
30240 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64  XY_HOSTIDLEN).#d
30250 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43  efine PROXY_MAXC
30260 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f  ONCHLEN  (PROXY_
30270 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
30280 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54  HOSTIDLEN+MAXPAT
30290 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61  HLEN)../* .** Ta
302a0 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63  kes an open conc
302b0 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74  h file, copies t
302c0 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61  he contents to a
302d0 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68   new path and th
302e0 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20  en moves .** it 
302f0 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79  back.  The newly
30300 20 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20   created file's 
30310 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
30320 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  is assigned to t
30330 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65  he.** conch file
30340 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66   structure and f
30350 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69  inally the origi
30360 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  nal conch file d
30370 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a  escriptor is .**
30380 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e   closed.  Return
30390 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73  s zero if succes
303a0 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sful..*/.static 
303b0 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f  int proxyBreakCo
303c0 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
303d0 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
303e0 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f  myHostID){.  pro
303f0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
30400 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
30410 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
30420 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
30430 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
30440 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
30450 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
30460 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41  .  char tPath[MA
30470 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  XPATHLEN];.  cha
30480 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43  r buf[PROXY_MAXC
30490 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  ONCHLEN];.  char
304a0 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e   *cPath = pCtx->
304b0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20  conchFilePath;. 
304c0 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20   size_t readLen 
304d0 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61  = 0;.  size_t pa
304e0 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  thLen = 0;.  cha
304f0 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22  r errmsg[64] = "
30500 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  ";.  int fd = -1
30510 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b  ;.  int rc = -1;
30520 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30530 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a  TER(myHostID);..
30540 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65    /* create a ne
30550 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63  w path by replac
30560 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27  e the trailing '
30570 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62  -conch' with '-b
30580 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c  reak' */.  pathL
30590 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61  en = strlcpy(tPa
305a0 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41  th, cPath, MAXPA
305b0 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61  THLEN);.  if( pa
305c0 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e  thLen>MAXPATHLEN
305d0 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c   || pathLen<6 ||
305e0 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28   .     (strlcpy(
305f0 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35  &tPath[pathLen-5
30600 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21  ], "break", 6) !
30610 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  = 5) ){.    sqli
30620 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
30630 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d  eof(errmsg),errm
30640 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28  sg,"path error (
30650 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61  len %d)",(int)pa
30660 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  thLen);.    goto
30670 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
30680 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68    }.  /* read th
30690 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20  e conch content 
306a0 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f  */.  readLen = o
306b0 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65  sPread(conchFile
306c0 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f  ->h, buf, PROXY_
306d0 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
306e0 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50  .  if( readLen<P
306f0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29  ROXY_PATHINDEX )
30700 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
30710 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
30720 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65  rmsg),errmsg,"re
30730 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  ad error (len %d
30740 29 22 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29  )",(int)readLen)
30750 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
30760 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
30770 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  /* write it out 
30780 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
30790 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20   break file */. 
307a0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
307b0 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52  n(tPath, (O_RDWR
307c0 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29  |O_CREAT|O_EXCL)
307d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
307e0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
307f0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
30800 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c  IONS);.  if( fd<
30810 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
30820 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
30830 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
30840 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64  , "create failed
30850 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
30860 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
30870 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  aklock;.  }.  if
30880 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62  ( osPwrite(fd, b
30890 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20  uf, readLen, 0) 
308a0 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64  != (ssize_t)read
308b0 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
308c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
308d0 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
308e0 73 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65  sg, "write faile
308f0 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
30900 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
30910 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69  eaklock;.  }.  i
30920 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c  f( rename(tPath,
30930 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73   cPath) ){.    s
30940 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
30950 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
30960 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20  errmsg, "rename 
30970 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
30980 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
30990 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
309a0 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70  }.  rc = 0;.  fp
309b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62  rintf(stderr, "b
309c0 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  roke stale lock 
309d0 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29  on %s\n", cPath)
309e0 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  ;.  robust_close
309f0 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c  (pFile, conchFil
30a00 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
30a10 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20  .  conchFile->h 
30a20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  = fd;.  conchFil
30a30 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  e->openFlags = O
30a40 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
30a50 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a  ..end_breaklock:
30a60 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
30a70 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
30a80 20 20 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68      unlink(tPath
30a90 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
30aa0 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
30ab0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
30ac0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  }.    fprintf(st
30ad0 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
30ae0 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63   break stale loc
30af0 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20  k on %s, %s\n", 
30b00 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a  cPath, errmsg);.
30b10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
30b20 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20  .}../* Take the 
30b30 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f  requested lock o
30b40 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
30b50 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61   and break a sta
30b60 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a  le lock if the .
30b70 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  ** host id match
30b80 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
30b90 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  t proxyConchLock
30ba0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
30bb0 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
30bc0 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29  D, int lockType)
30bd0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
30be0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
30bf0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
30c00 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
30c10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
30c20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
30c30 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
30c40 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  chFile;.  int rc
30c50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30c60 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a  int nTries = 0;.
30c70 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
30c80 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a  c conchModTime;.
30c90 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63    .  do {.    rc
30ca0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
30cb0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
30cc0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
30cd0 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
30ce0 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b  ;.    nTries ++;
30cf0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
30d00 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
30d10 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b    /* If the lock
30d20 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a   failed (busy):.
30d30 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79         * 1st try
30d40 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69  : get the mod ti
30d50 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c  me of the conch,
30d60 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74   wait 0.5s and t
30d70 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20  ry again. .     
30d80 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69    * 2nd try: fai
30d90 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d  l if the mod tim
30da0 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73  e changed or hos
30db0 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e  t id is differen
30dc0 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20  t, wait .       
30dd0 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73  *           10 s
30de0 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ec and try again
30df0 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72  .       * 3rd tr
30e00 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  y: break the loc
30e10 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64  k unless the mod
30e20 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65   time has change
30e30 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d..       */.   
30e40 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
30e50 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73  uf;.      if( os
30e60 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d  Fstat(conchFile-
30e70 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
30e80 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
30e90 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
30ea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
30eb0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
30ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
30ed0 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
30ee0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
30ef0 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75  onchModTime = bu
30f00 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a  f.st_mtimespec;.
30f10 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35          usleep(5
30f20 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
30f30 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20  0.5 sec and try 
30f40 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f  the lock again*/
30f50 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
30f60 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e;  .      }..  
30f70 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
30f80 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66  es>1 );.      if
30f90 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74  ( conchModTime.t
30fa0 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  v_sec != buf.st_
30fb0 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63  mtimespec.tv_sec
30fc0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f   || .         co
30fd0 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73  nchModTime.tv_ns
30fe0 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
30ff0 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29  mespec.tv_nsec )
31000 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
31010 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
31020 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
31030 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32     if( nTries==2
31040 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68   ){  .        ch
31050 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41  ar tBuf[PROXY_MA
31060 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
31070 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73      int len = os
31080 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d  Pread(conchFile-
31090 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f  >h, tBuf, PROXY_
310a0 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
310b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
310c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
310d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
310e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
310f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31100 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
31110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31120 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41  if( len>PROXY_PA
31130 54 48 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b  THINDEX && tBuf[
31140 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f  0]==(char)PROXY_
31150 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20  CONCHVERSION){. 
31160 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27           /* don'
31170 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  t break the lock
31180 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
31190 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f  doesn't match */
311a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
311b0 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50  !=memcmp(&tBuf[P
311c0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c  ROXY_HEADERLEN],
311d0 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59   myHostID, PROXY
311e0 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20  _HOSTIDLEN) ){. 
311f0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
31200 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
31210 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31230 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65      /* don't bre
31240 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73  ak the lock on s
31250 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20 76  hort read or a v
31260 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20  ersion mismatch 
31270 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
31280 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
31290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
312a0 20 20 20 75 73 6c 65 65 70 28 31 30 30 30 30 30     usleep(100000
312b0 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20  00); /* wait 10 
312c0 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20  sec and try the 
312d0 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20  lock again */.  
312e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
312f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
31300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54        assert( nT
31310 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20  ries==3 );.     
31320 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65   if( 0==proxyBre
31330 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  akConchLock(pFil
31340 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a  e, myHostID) ){.
31350 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31360 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
31370 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58  if( lockType==EX
31380 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
31390 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
313a0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
313b0 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
313c0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
313d0 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
313e0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
313f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
31400 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
31410 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
31420 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
31430 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
31440 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54  conchFile, lockT
31450 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ype);.        }.
31460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31470 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c  } while( rc==SQL
31480 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69  ITE_BUSY && nTri
31490 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74  es<3 );.  .  ret
314a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
314b0 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79  kes the conch by
314c0 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64   taking a shared
314d0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74   lock and read t
314e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63  he contents conc
314f0 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61  h, if .** lockPa
31500 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  th is non-NULL, 
31510 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
31520 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d  lock file path m
31530 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55  ust match.  A NU
31540 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  LL .** lockPath 
31550 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c  means that the l
31560 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63  ockPath in the c
31570 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
31580 65 20 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a  e used if the .*
31590 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68  * host IDs match
315a0 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20  , or a new lock 
315b0 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e  path will be gen
315c0 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63  erated automatic
315d0 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69  ally .** and wri
315e0 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63  tten to the conc
315f0 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  h file..*/.stati
31600 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43  c int proxyTakeC
31610 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  onch(unixFile *p
31620 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  File){.  proxyLo
31630 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
31640 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
31650 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
31660 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
31670 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74  t; .  .  if( pCt
31680 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20  x->conchHeld!=0 
31690 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
316a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
316b0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
316c0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
316d0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20  ->conchFile;.   
316e0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
316f0 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72  ;.    int pError
31700 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72   = 0;.    char r
31710 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58  eadBuf[PROXY_MAX
31720 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63  CONCHLEN];.    c
31730 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58  har lockPath[MAX
31740 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68  PATHLEN];.    ch
31750 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68  ar *tempLockPath
31760 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
31770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31780 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74 65 43  .    int createC
31790 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  onch = 0;.    in
317a0 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20  t hostIdMatch = 
317b0 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c  0;.    int readL
317c0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  en = 0;.    int 
317d0 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
317e0 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63   0;.    int forc
317f0 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30  eNewLockPath = 0
31800 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41  ;.    .    OSTRA
31810 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE(("TAKECONCH  
31820 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
31830 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
31840 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
31850 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
31860 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
31870 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
31880 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29  uto:"), getpid()
31890 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72  ));..    rc = pr
318a0 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48  oxyGetHostID(myH
318b0 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b  ostID, &pError);
318c0 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
318d0 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
318e0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
318f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72  >lastErrno = pEr
31900 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ror;.      goto 
31910 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
31920 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72     }.    rc = pr
31930 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
31940 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48  le, myHostID, SH
31950 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
31960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31970 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
31980 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
31990 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64     }.    /* read
319a0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f   the existing co
319b0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nch file */.    
319c0 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e  readLen = seekAn
319d0 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a  dRead((unixFile*
319e0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72  )conchFile, 0, r
319f0 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  eadBuf, PROXY_MA
31a00 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20  XCONCHLEN);.    
31a10 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b  if( readLen<0 ){
31a20 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72  .      /* I/O er
31a30 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73  ror: lastErrno s
31a40 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
31a50 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  d */.      pFile
31a60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f  ->lastErrno = co
31a70 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  nchFile->lastErr
31a80 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
31a90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
31aa0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
31ab0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
31ac0 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65  }else if( readLe
31ad0 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52  n<=(PROXY_HEADER
31ae0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
31af0 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  LEN) || .       
31b00 20 20 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d        readBuf[0]
31b10 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  !=(char)PROXY_CO
31b20 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20  NCHVERSION ){.  
31b30 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72      /* a short r
31b40 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66  ead or version f
31b50 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d  ormat mismatch m
31b60 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
31b70 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20  create a new .  
31b80 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c      ** conch fil
31b90 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
31ba0 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d     createConch =
31bb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   1;.    }.    /*
31bc0 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
31bd0 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68 65 20  matches and the 
31be0 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64  lock path alread
31bf0 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  y exists in the 
31c00 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27  conch.    ** we'
31c10 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
31c20 65 20 70 61 74 68 20 74 68 65 72 65 2c 20 69 66  e path there, if
31c30 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74   we can't open t
31c40 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20  hat path, we'll 
31c50 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69  .    ** retry wi
31c60 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65  th a new auto-ge
31c70 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a 20 20  nerated path .  
31c80 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a    */.    do { /*
31c90 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64   in case we need
31ca0 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f   to try again fo
31cb0 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65  r an :auto: name
31cc0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a  d lock file */..
31cd0 20 20 20 20 20 20 69 66 28 20 21 63 72 65 61 74        if( !creat
31ce0 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65  eConch && !force
31cf0 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  NewLockPath ){. 
31d00 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74         hostIdMat
31d10 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65  ch = !memcmp(&re
31d20 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  adBuf[PROXY_HEAD
31d30 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
31d40 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
31d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d60 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49       PROXY_HOSTI
31d70 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f  DLEN);.        /
31d80 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68  * if the conch h
31d90 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20  as data compare 
31da0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  the contents */.
31db0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74          if( !pCt
31dc0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
31dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
31de0 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20   for auto-named 
31df0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c  local lock file,
31e00 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   just check the 
31e10 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c  host ID and we'l
31e20 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l.           ** 
31e30 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  use the local lo
31e40 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68 61  ck file path tha
31e50 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  t's already in t
31e60 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
31e70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
31e80 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a   hostIdMatch ){.
31e90 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
31ea0 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65  _t pathLen = (re
31eb0 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41  adLen - PROXY_PA
31ec0 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20  THINDEX);.      
31ed0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
31ee0 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d     if( pathLen>=
31ef0 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20  MAXPATHLEN ){.  
31f00 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
31f10 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31  Len=MAXPATHLEN-1
31f20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31f30 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
31f40 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65  py(lockPath, &re
31f50 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48  adBuf[PROXY_PATH
31f60 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29  INDEX], pathLen)
31f70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ;.            lo
31f80 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20  ckPath[pathLen] 
31f90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
31fa0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20   tempLockPath = 
31fb0 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20  lockPath;.      
31fc0 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b        tryOldLock
31fd0 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  Path = 1;.      
31fe0 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
31ff0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
32000 63 6b 20 70 61 74 68 20 69 66 20 74 68 65 20 63  ck path if the c
32010 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
32020 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
32030 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
32040 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32050 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
32060 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20  ostIdMatch.     
32070 20 20 20 20 20 20 20 20 20 20 26 26 20 21 73 74            && !st
32080 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
32090 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64  ProxyPath, &read
320a0 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
320b0 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  DEX],.          
320c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320d0 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50   readLen-PROXY_P
320e0 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20  ATHINDEX).      
320f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
32100 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64  * conch host and
32110 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68   lock path match
32120 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
32130 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
32140 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
32150 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
32160 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
32170 68 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65  h isn't writable
32180 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74   and doesn't mat
32190 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b  ch, we can't tak
321a0 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  e it */.      if
321b0 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  ( (conchFile->op
321c0 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20  enFlags&O_RDWR) 
321d0 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
321e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
321f0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
32200 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
32210 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
32220 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65     /* either the
32230 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61   conch didn't ma
32240 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74  tch or we need t
32250 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  o create a new o
32260 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ne */.      if( 
32270 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
32280 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
32290 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
322a0 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c  (pCtx->dbPath, l
322b0 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
322c0 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65  LEN);.        te
322d0 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63  mpLockPath = loc
322e0 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f  kPath;.        /
322f0 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  * create a copy 
32300 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  of the lock path
32310 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63   _only_ if the c
32320 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
32330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
32340 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20        /* update 
32350 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20  conch with host 
32360 61 6e 64 20 70 61 74 68 20 28 74 68 69 73 20 77  and path (this w
32370 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65  ill fail if othe
32380 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20  r process.      
32390 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65 64 20  ** has a shared 
323a0 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69  lock already), i
323b0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
323c0 74 63 68 65 73 2c 20 75 73 65 20 74 68 65 20 62  tches, use the b
323d0 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63  ig.      ** stic
323e0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
323f0 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46    futimes(conchF
32400 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20  ile->h, NULL);. 
32410 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d       if( hostIdM
32420 61 74 63 68 20 26 26 20 21 63 72 65 61 74 65 43  atch && !createC
32430 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  onch ){.        
32440 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  if( conchFile->p
32450 49 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69  Inode && conchFi
32460 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
32470 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  red>1 ){.       
32480 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
32490 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
324a0 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
324b0 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
324c0 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
324d0 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
324e0 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
324f0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
32500 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
32510 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
32520 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20         } else { 
32530 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
32540 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
32550 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
32560 79 48 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49  yHostID, EXCLUSI
32570 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
32580 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
32590 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f  .        rc = co
325a0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
325b0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
325c0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
325d0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
325e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
325f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32600 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  OK ){.        ch
32610 61 72 20 77 72 69 74 65 42 75 66 66 65 72 5b 50  ar writeBuffer[P
32620 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
32630 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ];.        int w
32640 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20  riteSize = 0;.  
32650 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 77        .        w
32660 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20  riteBuffer[0] = 
32670 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
32680 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20  HVERSION;.      
32690 20 20 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42    memcpy(&writeB
326a0 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44  uffer[PROXY_HEAD
326b0 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
326c0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
326d0 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  N);.        if( 
326e0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
326f0 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ath!=NULL ){.   
32700 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
32710 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
32720 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43  Y_PATHINDEX], pC
32730 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
32740 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
32750 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32760 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79           strlcpy
32770 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
32780 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
32790 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41  tempLockPath, MA
327a0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
327b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69     }.        wri
327c0 74 65 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50  teSize = PROXY_P
327d0 41 54 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65  ATHINDEX + strle
327e0 6e 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50  n(&writeBuffer[P
327f0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29  ROXY_PATHINDEX])
32800 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
32810 5f 66 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68  _ftruncate(conch
32820 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69  File->h, writeSi
32830 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ze);.        rc 
32840 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c  = unixWrite((sql
32850 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63  ite3_file *)conc
32860 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66  hFile, writeBuff
32870 65 72 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30  er, writeSize, 0
32880 29 3b 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63  );.        fsync
32890 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a  (conchFile->h);.
328a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
328b0 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 63   created a new c
328c0 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a  onch file (not j
328d0 75 73 74 20 75 70 64 61 74 65 64 20 74 68 65 20  ust updated the 
328e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20  contents of a . 
328f0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64          ** valid
32900 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72   conch file), tr
32910 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70  y to match the p
32920 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68  ermissions of th
32930 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
32940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32960 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68  K && createConch
32970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
32980 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
32990 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
329a0 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65   = osFstat(pFile
329b0 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20  ->h, &buf);.    
329c0 20 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30        if( err==0
329d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
329e0 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62  mode_t cmode = b
329f0 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52  uf.st_mode&(S_IR
32a00 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f  USR|S_IWUSR | S_
32a10 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a  IRGRP|S_IWGRP |.
32a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a40 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c          S_IROTH|
32a50 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20  S_IWOTH);.      
32a60 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20        /* try to 
32a70 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61  match the databa
32a80 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d  se file R/W perm
32a90 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20  issions, ignore 
32aa0 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64  failure */.#ifnd
32ab0 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f  ef SQLITE_PROXY_
32ac0 44 45 42 55 47 0a 20 20 20 20 20 20 20 20 20 20  DEBUG.          
32ad0 20 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68    osFchmod(conch
32ae0 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b  File->h, cmode);
32af0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
32b00 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
32b10 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 68 6d       rc = osFchm
32b20 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  od(conchFile->h,
32b30 20 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   cmode);.       
32b40 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d       }while( rc=
32b50 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d  =(-1) && errno==
32b60 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20  EINTR );.       
32b70 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
32b80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32b90 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
32ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32bb0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
32bc0 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45  "fchmod %o FAILE
32bd0 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c  D with %d %s\n",
32be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32bf0 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f         cmode, co
32c00 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
32c10 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
32c20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
32c30 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
32c40 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
32c50 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63  %o SUCCEDED\n",c
32c60 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
32c70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
32c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32c90 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
32ca0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
32cb0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
32cc0 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d  "STAT FAILED[%d]
32cd0 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20   with %d %s\n", 
32ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32cf0 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20       err, code, 
32d00 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b  strerror(code));
32d10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
32d20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
32d30 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63      }.      conc
32d40 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
32d50 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
32d60 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
32d70 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
32d80 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74        .    end_t
32d90 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20  akeconch:.      
32da0 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
32db0 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c  ROXY: CLOSE  %d\
32dc0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
32dd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32de0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
32df0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20  ->openFlags ){. 
32e00 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
32e10 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
32e20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
32e30 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  (pFile, pFile->h
32e40 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
32e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
32e60 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
32e70 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d 20 72        int fd = r
32e80 6f 62 75 73 74 5f 6f 70 65 6e 28 70 43 74 78 2d  obust_open(pCtx-
32e90 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  >dbPath, pFile->
32ea0 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20  openFlags,.     
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ec0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
32ed0 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
32ee0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
32ef0 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a  CE(("TRANSPROXY:
32f00 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64   OPEN  %d\n", fd
32f10 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
32f20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fd>=0 ){.       
32f30 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64     pFile->h = fd
32f40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
32f50 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 53 51  .          rc=SQ
32f60 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
32f70 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55  PT; /* SQLITE_BU
32f80 53 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  SY? proxyTakeCon
32f90 63 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20  ch called.      
32fa0 20 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b       during lock
32fb0 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ing */.        }
32fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32fd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32fe0 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50   && !pCtx->lockP
32ff0 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20  roxy ){.        
33000 63 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d  char *path = tem
33010 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70  pLockPath ? temp
33020 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d  LockPath : pCtx-
33030 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
33040 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
33050 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
33060 28 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f  (path, &pCtx->lo
33070 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20  ckProxy, 1);.   
33080 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33090 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
330a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72  LITE_NOMEM && tr
330b0 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a  yOldLockPath ){.
330c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20            /* we 
330d0 63 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20  couldn't create 
330e0 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
330f0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64  ile with the old
33100 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a   lock file path.
33110 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
33120 20 74 72 79 20 61 67 61 69 6e 20 76 69 61 20 61   try again via a
33130 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20  uto-naming .    
33140 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33150 20 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b      forceNewLock
33160 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  Path = 1;.      
33170 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
33180 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  th = 0;.        
33190 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67    continue; /* g
331a0 6f 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f  o back to the do
331b0 20 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20   {} while start 
331c0 70 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e  point, try again
331d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
331e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
331f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33200 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
33210 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20   to make a copy 
33220 6f 66 20 70 61 74 68 20 69 66 20 77 65 20 65 78  of path if we ex
33230 74 72 61 63 74 65 64 20 74 68 65 20 76 61 6c 75  tracted the valu
33240 65 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  e.         ** fr
33250 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  om the conch fil
33260 65 20 6f 72 20 74 68 65 20 70 61 74 68 20 77 61  e or the path wa
33270 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74  s allocated on t
33280 68 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20  he stack.       
33290 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
332a0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b   tempLockPath ){
332b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d  .          pCtx-
332c0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d  >lockProxyPath =
332d0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
332e0 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  (0, tempLockPath
332f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
33300 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
33310 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
33320 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
33330 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
33340 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
33350 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33370 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63  .        pCtx->c
33380 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20  onchHeld = 1;.  
33390 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69        .        i
333a0 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
333b0 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  xy->pMethod == &
333c0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
333d0 20 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63            afpLoc
333e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70  kingContext *afp
333f0 43 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Ctx;.          a
33400 66 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b  fpCtx = (afpLock
33410 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74  ingContext *)pCt
33420 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f  x->lockProxy->lo
33430 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
33440 20 20 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e          afpCtx->
33450 64 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c  dbPath = pCtx->l
33460 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
33470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
33480 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63  else {.        c
33490 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
334a0 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
334b0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
334c0 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
334d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
334e0 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48  RACE(("TAKECONCH
334f0 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63    %d %s\n", conc
33500 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
33510 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
33520 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69  ITE_OK?"ok":"fai
33530 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 72 65  led"));.      re
33540 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77  turn rc;.    } w
33550 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20  hile (1); /* in 
33560 63 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20  case we need to 
33570 72 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a  retry the :auto:
33580 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20   lock file - .  
33590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
335a0 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * we should neve
335b0 72 20 67 65 74 20 68 65 72 65 20 65 78 63 65 70  r get here excep
335c0 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69  t via the 'conti
335d0 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20  nue' call. */.  
335e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46  }.}../*.** If pF
335f0 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b  ile holds a lock
33600 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   on a conch file
33610 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74  , then release t
33620 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  hat lock..*/.sta
33630 74 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c  tic int proxyRel
33640 65 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  easeConch(unixFi
33650 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
33660 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33670 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62  ;         /* Sub
33680 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63  routine return c
33690 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  ode */.  proxyLo
336a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
336b0 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  tx;  /* The lock
336c0 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ing context for 
336d0 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a  the proxy lock *
336e0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  /.  unixFile *co
336f0 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
33700 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
33710 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  onch file */..  
33720 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
33730 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
33740 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
33750 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65  ext;.  conchFile
33760 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
33770 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  le;.  OSTRACE(("
33780 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64  RELEASECONCH  %d
33790 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
337a0 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
337b0 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74  .           (pCt
337c0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
337d0 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
337e0 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
337f0 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "), .           
33800 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 69 66  getpid()));.  if
33810 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
33820 64 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  d>0 ){.    rc = 
33830 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
33840 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
33850 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
33860 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
33870 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63    }.  pCtx->conc
33880 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54  hHeld = 0;.  OST
33890 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f  RACE(("RELEASECO
338a0 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63  NCH  %d %s\n", c
338b0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
338c0 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c          (rc==SQL
338d0 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
338e0 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72  "failed")));.  r
338f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33900 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d  ** Given the nam
33910 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
33920 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68  file, compute th
33930 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f  e name of its co
33940 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f  nch file..** Sto
33950 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  re the conch fil
33960 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20  ename in memory 
33970 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
33980 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
33990 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50  ** Make *pConchP
339a0 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ath point to the
339b0 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75   new name.  Retu
339c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
339d0 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51  success.** or SQ
339e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e  LITE_NOMEM if un
339f0 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d  able to obtain m
33a00 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
33a10 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
33a20 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72  nsible for ensur
33a30 69 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ing that the all
33a40 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
33a50 20 73 70 61 63 65 20 69 73 20 65 76 65 6e 74 75   space is eventu
33a60 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
33a70 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73  * *pConchPath is
33a80 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
33a90 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
33aa0 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
33ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33ac0 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68  proxyCreateConch
33ad0 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64  Pathname(char *d
33ae0 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43  bPath, char **pC
33af0 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74  onchPath){.  int
33b00 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
33b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
33b20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
33b30 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  int len = (int)s
33b40 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f  trlen(dbPath); /
33b50 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61  * Length of data
33b60 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20  base filename - 
33b70 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72  dbPath */.  char
33b80 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20   *conchPath;    
33b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66            /* buf
33ba0 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
33bb0 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20  construct conch 
33bc0 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  name */..  /* Al
33bd0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
33be0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e   the conch filen
33bf0 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ame and initiali
33c00 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20  ze the name to. 
33c10 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   ** the name of 
33c20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
33c30 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20  abase file. */  
33c40 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d  .  *pConchPath =
33c50 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68   conchPath = (ch
33c60 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
33c70 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20  loc(len + 8);.  
33c80 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30  if( conchPath==0
33c90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33ca0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
33cb0 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50  .  memcpy(conchP
33cc0 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e  ath, dbPath, len
33cd0 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77  +1);.  .  /* now
33ce0 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65   insert a "." be
33cf0 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20  fore the last / 
33d00 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66  character */.  f
33d10 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69  or( i=(len-1); i
33d20 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20  >=0; i-- ){.    
33d30 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  if( conchPath[i]
33d40 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
33d50 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
33d60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e  .    }.  }.  con
33d70 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20  chPath[i]='.';. 
33d80 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29   while ( i<len )
33d90 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b  {.    conchPath[
33da0 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a  i+1]=dbPath[i];.
33db0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
33dc0 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d  /* append the "-
33dd0 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f  conch" suffix to
33de0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d   the file */.  m
33df0 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68  emcpy(&conchPath
33e00 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c  [i+1], "-conch",
33e10 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28   7);.  assert( (
33e20 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68  int)strlen(conch
33e30 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29  Path) == len+7 )
33e40 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
33e50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61  TE_OK;.}.../* Ta
33e60 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66  kes a fully conf
33e70 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63  igured proxy loc
33e80 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20  king-style unix 
33e90 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65  file and switche
33ea0 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c  s.** the local l
33eb0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a  ock file path .*
33ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 77 69  /.static int swi
33ed0 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68  tchLockProxyPath
33ee0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
33ef0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
33f00 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
33f10 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
33f20 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
33f30 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
33f40 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
33f50 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68  .  char *oldPath
33f60 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
33f70 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63  xyPath;.  int rc
33f80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
33f90 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
33fa0 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock!=NO_LOCK )
33fb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33fc0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a  ITE_BUSY;.  }  .
33fd0 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  .  /* nothing to
33fe0 20 64 6f 20 69 66 20 74 68 65 20 70 61 74 68 20   do if the path 
33ff0 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20  is NULL, :auto: 
34000 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65 20 65  or matches the e
34010 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a  xisting path */.
34020 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70    if( !path || p
34030 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20  ath[0]=='\0' || 
34040 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a  !strcmp(path, ":
34050 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28  auto:") ||.    (
34060 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74 72 6e  oldPath && !strn
34070 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74  cmp(oldPath, pat
34080 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20  h, MAXPATHLEN)) 
34090 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
340a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
340b0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
340c0 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78  lockProxy = pCtx
340d0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
340e0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
340f0 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d  =NULL;.    pCtx-
34100 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a  >conchHeld = 0;.
34110 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78      if( lockProx
34120 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  y!=NULL ){.     
34130 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70   rc=lockProxy->p
34140 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
34150 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c  sqlite3_file *)l
34160 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
34170 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34180 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
34190 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78  e3_free(lockProx
341a0 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  y);.    }.    sq
341b0 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61  lite3_free(oldPa
341c0 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  th);.    pCtx->l
341d0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
341e0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
341f0 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a  , path);.  }.  .
34200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34210 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61  /*.** pFile is a
34220 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 62   file that has b
34230 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20  een opened by a 
34240 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c  prior xOpen call
34250 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20  .  dbPath.** is 
34260 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
34270 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48  at least MAXPATH
34280 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73  LEN+1 characters
34290 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
342a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e  This routine fin
342b0 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  d the filename a
342c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
342d0 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20  File and writes 
342e0 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68  it.** int dbPath
342f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34300 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f  proxyGetDbPathFo
34310 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  rUnixFile(unixFi
34320 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20  le *pFile, char 
34330 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65  *dbPath){.#if de
34340 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
34350 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
34360 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d  ethod == &afpIoM
34370 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
34380 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73   afp style keeps
34390 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
343a0 74 68 65 20 64 62 20 70 61 74 68 20 69 6e 20 74  the db path in t
343b0 68 65 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c  he filePath fiel
343c0 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
343d0 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61   struct */.    a
343e0 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c  ssert( (int)strl
343f0 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d  en((char*)pFile-
34400 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
34410 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a  <=MAXPATHLEN );.
34420 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61      strlcpy(dbPa
34430 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67  th, ((afpLocking
34440 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
34450 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
34460 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54  ->dbPath, MAXPAT
34470 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a  HLEN);.  } else.
34480 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69  #endif.  if( pFi
34490 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
344a0 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
344b0 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c   ){.    /* dot l
344c0 6f 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74  ock style uses t
344d0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
344e0 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  xt to store the 
344f0 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  dot lock.    ** 
34500 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
34510 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
34520 6e 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  n((char *)pFile-
34530 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
34540 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43   - strlen(DOTLOC
34550 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d  K_SUFFIX);.    m
34560 65 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28 63  emcpy(dbPath, (c
34570 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
34580 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e  kingContext, len
34590 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   + 1);.  }else{.
345a0 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72      /* all other
345b0 20 73 74 79 6c 65 73 20 75 73 65 20 74 68 65 20   styles use the 
345c0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
345d0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62 20  to store the db 
345e0 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
345f0 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28   assert( strlen(
34600 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f  (char*)pFile->lo
34610 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d  ckingContext)<=M
34620 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20  AXPATHLEN );.   
34630 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c   strlcpy(dbPath,
34640 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
34650 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20  lockingContext, 
34660 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d  MAXPATHLEN);.  }
34670 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34680 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61  _OK;.}../*.** Ta
34690 6b 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66  kes an already f
346a0 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69  illed in unix fi
346b0 6c 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74  le and alters it
346c0 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63   so all file loc
346d0 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65  king .** will be
346e0 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
346f0 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f  e local proxy lo
34700 63 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f  ck file.  The fo
34710 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a  llowing fields.*
34720 2a 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20  * are preserved 
34730 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
34740 6f 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74  ontext so that t
34750 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f  hey can be resto
34760 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  red and .** the 
34770 75 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70  unix structure p
34780 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20  roperly cleaned 
34790 75 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65  up at close time
347a0 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43  :.**  ->lockingC
347b0 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65  ontext.**  ->pMe
347c0 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69  thod.*/.static i
347d0 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
347e0 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
347f0 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74  le *pFile, const
34800 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20   char *path) {. 
34810 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
34820 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68  text *pCtx;.  ch
34830 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54  ar dbPath[MAXPAT
34840 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f  HLEN+1];       /
34850 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
34860 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
34870 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d   char *lockPath=
34880 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d  NULL;.  int rc =
34890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20   SQLITE_OK;.  . 
348a0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
348b0 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock!=NO_LOCK )
348c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
348d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
348e0 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f  proxyGetDbPathFo
348f0 72 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c  rUnixFile(pFile,
34900 20 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20   dbPath);.  if( 
34910 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d  !path || path[0]
34920 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d  =='\0' || !strcm
34930 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  p(path, ":auto:"
34940 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74  ) ){.    lockPat
34950 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  h=NULL;.  }else{
34960 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63  .    lockPath=(c
34970 68 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a  har *)path;.  }.
34980 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54    .  OSTRACE(("T
34990 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f  RANSPROXY  %d fo
349a0 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
349b0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
349c0 20 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f       (lockPath ?
349d0 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75   lockPath : ":au
349e0 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29  to:"), getpid())
349f0 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c  );..  pCtx = sql
34a00 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
34a10 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
34a20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
34a30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34a40 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
34a50 6d 73 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69  mset(pCtx, 0, si
34a60 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20  zeof(*pCtx));.. 
34a70 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
34a80 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64  eConchPathname(d
34a90 62 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f  bPath, &pCtx->co
34aa0 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20  nchFilePath);.  
34ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34ac0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  K ){.    rc = pr
34ad0 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
34ae0 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
34af0 65 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f  ePath, &pCtx->co
34b00 6e 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  nchFile, 0);.   
34b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34b20 43 41 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46  CANTOPEN && ((pF
34b30 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
34b40 5f 52 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a  _RDWR) == 0) ){.
34b50 20 20 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20        /* if (a) 
34b60 74 68 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61  the open flags a
34b70 72 65 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28  re not O_RDWR, (
34b80 62 29 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e  b) the conch isn
34b90 27 74 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20  't there, and.  
34ba0 20 20 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66      ** (c) the f
34bb0 69 6c 65 20 73 79 73 74 65 6d 20 69 73 20 72 65  ile system is re
34bc0 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e  ad-only, then en
34bd0 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20  able no-locking 
34be0 61 63 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a  access..      **
34bf0 20 55 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44   Ugh, since O_RD
34c00 4f 4e 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20  ONLY==0x0000 we 
34c10 74 65 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52  test for !O_RDWR
34c20 20 73 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20   since unixOpen 
34c30 61 73 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a  asserts.      **
34c40 20 74 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20   that openFlags 
34c50 77 69 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f  will have only o
34c60 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f  ne of O_RDONLY o
34c70 72 20 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20  r O_RDWR..      
34c80 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
34c90 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
34ca0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
34cb0 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20   conchInfo;.    
34cc0 20 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73    int goLockless
34cd0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
34ce0 20 6f 73 53 74 61 74 28 70 43 74 78 2d 3e 63 6f   osStat(pCtx->co
34cf0 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 63 6f  nchFilePath, &co
34d00 6e 63 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  nchInfo) == -1 )
34d10 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65   {.        int e
34d20 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
34d30 20 20 20 20 69 66 28 20 28 65 72 72 3d 3d 45 4e      if( (err==EN
34d40 4f 45 4e 54 29 20 26 26 20 28 73 74 61 74 66 73  OENT) && (statfs
34d50 28 64 62 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  (dbPath, &fsInfo
34d60 29 20 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20  ) != -1) ){.    
34d70 20 20 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73        goLockless
34d80 20 3d 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61   = (fsInfo.f_fla
34d90 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d  gs&MNT_RDONLY) =
34da0 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20  = MNT_RDONLY;.  
34db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34dc0 20 20 20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b        if( goLock
34dd0 6c 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  less ){.        
34de0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
34df0 3d 20 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e  = -1; /* read on
34e00 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20  ly FS/ lockless 
34e10 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
34e20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
34e30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20   }.    }.  }  . 
34e40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34e50 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29  OK && lockPath )
34e60 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  {.    pCtx->lock
34e70 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
34e80 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c  te3DbStrDup(0, l
34e90 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20  ockPath);.  }.. 
34ea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34eb0 4f 4b 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  OK ){.    pCtx->
34ec0 64 62 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  dbPath = sqlite3
34ed0 44 62 53 74 72 44 75 70 28 30 2c 20 64 62 50 61  DbStrDup(0, dbPa
34ee0 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  th);.    if( pCt
34ef0 78 2d 3e 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20  x->dbPath==NULL 
34f00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
34f10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
34f20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
34f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34f40 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69   /* all memory i
34f50 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f  s allocated, pro
34f60 78 79 73 20 61 72 65 20 63 72 65 61 74 65 64 20  xys are created 
34f70 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20  and assigned, . 
34f80 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65     ** switch the
34f90 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
34fa0 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65   and pMethod the
34fb0 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f  n return..    */
34fc0 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f  .    pCtx->oldLo
34fd0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
34fe0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
34ff0 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d  text;.    pFile-
35000 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
35010 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78  = pCtx;.    pCtx
35020 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70  ->pOldMethod = p
35030 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20  File->pMethod;. 
35040 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
35050 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68  d = &proxyIoMeth
35060 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
35070 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
35080 68 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20  hFile ){ .      
35090 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d  pCtx->conchFile-
350a0 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
350b0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
350c0 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  )pCtx->conchFile
350d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
350e0 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
350f0 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
35100 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
35110 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  0, pCtx->lockPro
35120 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  xyPath);.    sql
35130 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
35140 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 20  conchFilePath); 
35150 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
35160 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f  e(pCtx);.  }.  O
35170 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
35180 4f 58 59 20 20 25 64 20 25 73 5c 6e 22 2c 20 70  OXY  %d %s\n", p
35190 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
351a0 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f      (rc==SQLITE_
351b0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
351c0 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72  led")));.  retur
351d0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
351e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e  This routine han
351f0 64 6c 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c  dles sqlite3_fil
35200 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c  e_control() call
35210 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
35220 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20  fic.** to proxy 
35230 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
35240 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
35250 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
35260 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
35270 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
35280 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
35290 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47     case SQLITE_G
352a0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
352b0 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
352c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
352d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
352e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
352f0 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d  hod == &proxyIoM
35300 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
35310 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
35320 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
35330 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35340 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
35350 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
35360 20 20 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63     proxyTakeConc
35370 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
35380 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
35390 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
353a0 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
353b0 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43  har **)pArg = pC
353c0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
353d0 68 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  h;.        }else
353e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
353f0 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
35400 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20   = ":auto: (not 
35410 68 65 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20  held)";.        
35420 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
35430 0a 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74  .        *(const
35440 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
35450 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
35460 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35470 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
35480 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f  case SQLITE_SET_
35490 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
354a0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
354b0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
354c0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e  le*)id;.      in
354d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
354e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 50 72  ;.      int isPr
354f0 6f 78 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c  oxyStyle = (pFil
35500 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
35510 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a  roxyIoMethods);.
35520 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d        if( pArg==
35530 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63  NULL || (const c
35540 68 61 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b  har *)pArg==0 ){
35550 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
35560 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20  roxyStyle ){.   
35570 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
35580 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ff proxy locking
35590 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64   - not supported
355a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
355b0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   = SQLITE_ERROR 
355c0 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  /*SQLITE_PROTOCO
355d0 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  L? SQLITE_MISUSE
355e0 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ?*/;.        }el
355f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
35600 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
35610 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64  locking - alread
35620 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a  y off - NOOP */.
35630 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
35640 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
35650 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
35660 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
35670 68 61 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d  har *proxyPath =
35680 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
35690 41 72 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Arg;.        if(
356a0 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
356b0 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 78 79  .          proxy
356c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
356d0 70 43 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20  pCtx = .        
356e0 20 20 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e      (proxyLockin
356f0 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d  gContext*)pFile-
35700 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
35710 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
35720 73 74 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61  strcmp(pArg, ":a
35730 75 74 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20  uto:") .        
35740 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63     || (pCtx->loc
35750 6b 50 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20  kProxyPath &&.  
35760 20 20 20 20 20 20 20 20 20 20 20 20 20 21 73 74               !st
35770 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
35780 50 72 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79  ProxyPath, proxy
35790 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
357a0 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
357b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
357c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
357d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
357e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 77           rc = sw
357f0 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74  itchLockProxyPat
35800 68 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61  h(pFile, proxyPa
35810 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  th);.          }
35820 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
35840 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20  n on proxy file 
35850 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20  locking */.     
35860 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
35870 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
35880 28 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74  (pFile, proxyPat
35890 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  h);.        }.  
358a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
358b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
358c0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
358d0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
358e0 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75  /* The call assu
358f0 72 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61  res that only va
35900 6c 69 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20  lid opcodes are 
35910 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  sent */.    }.  
35920 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
35930 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
35940 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
35950 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 64  ** Within this d
35960 69 76 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f  ivision (the pro
35970 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d  xying locking im
35980 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68  plementation) th
35990 65 20 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20  e procedures.** 
359a0 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74  above this point
359b0 20 61 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69   are all utiliti
359c0 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65  es.  The lock-re
359d0 6c 61 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66  lated methods of
359e0 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f   the.** proxy-lo
359f0 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f  cking sqlite3_io
35a00 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66  _method object f
35a10 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a  ollow..*/.../*.*
35a20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
35a30 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
35a40 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
35a50 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
35a60 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
35a70 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
35a80 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
35a90 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
35aa0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
35ab0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
35ac0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
35ad0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
35ae0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
35af0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
35b00 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
35b10 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
35b20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
35b30 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
35b40 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
35b50 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
35b60 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
35b70 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
35b80 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
35b90 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
35ba0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
35bb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
35bc0 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
35bd0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
35be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
35bf0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
35c00 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
35c10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
35c20 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
35c30 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
35c40 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
35c50 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
35c60 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
35c70 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
35c80 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
35c90 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63  ->pMethod->xChec
35ca0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73  kReservedLock((s
35cb0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
35cc0 78 79 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20  xy, pResOut);.  
35cd0 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63    }else{ /* conc
35ce0 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
35cf0 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 70  kless */.      p
35d00 52 65 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a  ResOut=0;.    }.
35d10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
35d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
35d30 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
35d40 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
35d50 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
35d60 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
35d70 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
35d80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
35d90 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
35da0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
35db0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
35dc0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
35dd0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
35de0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
35df0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
35e00 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
35e10 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
35e20 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
35e30 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
35e40 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
35e50 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
35e60 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
35e70 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
35e80 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
35e90 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
35ea0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
35eb0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
35ec0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
35ed0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
35ee0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
35ef0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
35f00 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
35f10 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
35f20 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
35f30 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
35f40 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
35f50 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
35f60 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
35f70 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
35f80 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
35f90 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
35fa0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
35fb0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
35fc0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
35fd0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
35fe0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
35ff0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
36000 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
36010 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
36020 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
36030 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
36040 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
36050 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
36060 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
36070 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
36080 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
36090 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
360a0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72  d;.  int rc = pr
360b0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
360c0 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  le);.  if( rc==S
360d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
360e0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
360f0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
36100 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36110 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
36120 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66  gContext;.    if
36130 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
36140 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  d>0 ){.      uni
36150 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
36160 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
36170 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
36180 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
36190 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
361a0 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b  proxy, eFileLock
361b0 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
361c0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78  eFileLock = prox
361d0 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  y->eFileLock;.  
361e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
361f0 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20  * conchHeld < 0 
36200 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  is lockless */. 
36210 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
36220 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
36230 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
36240 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
36250 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
36260 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
36270 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
36280 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
36290 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
362a0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
362b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
362c0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
362d0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
362e0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
362f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
36300 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
36310 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
36320 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
36330 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
36340 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
36350 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
36360 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
36370 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
36380 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
36390 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
363a0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
363b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
363c0 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
363d0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
363e0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
363f0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
36400 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
36410 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
36420 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  Held>0 ){.      
36430 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
36440 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
36450 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  y;.      rc = pr
36460 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  oxy->pMethod->xU
36470 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
36480 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c  ile*)proxy, eFil
36490 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46  eLock);.      pF
364a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
364b0 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63   proxy->eFileLoc
364c0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
364d0 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64      /* conchHeld
364e0 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
364f0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
36500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36510 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
36520 20 74 68 61 74 20 75 73 65 73 20 70 72 6f 78 79   that uses proxy
36530 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69   locks..*/.stati
36540 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
36550 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
36560 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
36570 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
36580 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
36590 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c  *)id;.    proxyL
365a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
365b0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
365c0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
365d0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
365e0 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xt;.    unixFile
365f0 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43   *lockProxy = pC
36600 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
36610 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
36620 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
36630 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e  onchFile;.    in
36640 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36650 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c  ;.    .    if( l
36660 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  ockProxy ){.    
36670 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79    rc = lockProxy
36680 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
36690 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
366a0 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f  *)lockProxy, NO_
366b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
366c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
366d0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
366e0 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
366f0 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
36700 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  file*)lockProxy)
36710 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
36720 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36730 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
36740 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
36750 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
36760 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
36770 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b  if( conchFile ){
36780 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d  .      if( pCtx-
36790 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20  >conchHeld ){.  
367a0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
367b0 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69  ReleaseConch(pFi
367c0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le);.        if(
367d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
367e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
367f0 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
36800 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
36810 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
36820 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
36830 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
36840 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
36850 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69 6c 65  3_free(conchFile
36860 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
36870 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 43  ite3DbFree(0, pC
36880 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
36890 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
368a0 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  free(pCtx->conch
368b0 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73  FilePath);.    s
368c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
368d0 70 43 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20  pCtx->dbPath);. 
368e0 20 20 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68     /* restore th
368f0 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  e original locki
36900 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70  ng context and p
36910 4d 65 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73  Method then clos
36920 65 20 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c  e it */.    pFil
36930 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
36940 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63  t = pCtx->oldLoc
36950 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
36960 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
36970 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68  = pCtx->pOldMeth
36980 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  od;.    sqlite3_
36990 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20  free(pCtx);.    
369a0 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d  return pFile->pM
369b0 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64  ethod->xClose(id
369c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
369d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
369e0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
369f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
36a00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
36a10 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
36a20 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c  *.** The proxy l
36a30 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 69 73 20  ocking style is 
36a40 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65  intended for use
36a50 20 77 69 74 68 20 41 46 50 20 66 69 6c 65 73 79   with AFP filesy
36a60 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69  stems..** And si
36a70 6e 63 65 20 41 46 50 20 69 73 20 6f 6e 6c 79 20  nce AFP is only 
36a80 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63  supported on Mac
36a90 4f 53 58 2c 20 74 68 65 20 70 72 6f 78 79 20 6c  OSX, the proxy l
36aa0 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a  ocking is also.*
36ab0 2a 20 72 65 73 74 72 69 63 74 65 64 20 74 6f 20  * restricted to 
36ac0 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a  MacOSX..** .**.*
36ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36ae0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 72  ** End of the pr
36af0 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  oxy lock impleme
36b00 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
36b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
36b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
36b70 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
36b80 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
36b90 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
36ba0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
36bb0 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 61 6c  ine registers al
36bc0 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  l VFS implementa
36bd0 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c  tions for unix-l
36be0 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a  ike operating.**
36bf0 20 73 79 73 74 65 6d 73 2e 20 20 54 68 69 73 20   systems.  This 
36c00 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74 68 65  routine, and the
36c10 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
36c20 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 66  ) routine that f
36c30 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c  ollows,.** shoul
36c40 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f  d be the only ro
36c50 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
36c60 69 6c 65 20 74 68 61 74 20 61 72 65 20 76 69 73  ile that are vis
36c70 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a  ible from other.
36c80 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** files..**.** 
36c90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
36ca0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72 69  called once duri
36cb0 6e 67 20 53 51 4c 69 74 65 20 69 6e 69 74 69 61  ng SQLite initia
36cc0 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79 20  lization and by 
36cd0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72 65  a.** single thre
36ce0 61 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  ad.  The memory 
36cf0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d  allocation and m
36d00 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
36d10 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65  have not.** nece
36d20 73 73 61 72 69 6c 79 20 62 65 65 6e 20 69 6e 69  ssarily been ini
36d30 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
36d40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
36d50 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 74 68 65  lled, and so the
36d60 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20  y.** should not 
36d70 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20  be used..*/.int 
36d80 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
36d90 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20  void){ .  /* .  
36da0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
36db0 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 73 20 61   macro defines a
36dc0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  n initializer fo
36dd0 72 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73  r an sqlite3_vfs
36de0 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
36df0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  e name of the VF
36e00 53 20 69 73 20 4e 41 4d 45 2e 20 20 54 68 65 20  S is NAME.  The 
36e10 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70 6f  pAppData is a po
36e20 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74  inter to a point
36e30 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22  er.  ** to the "
36e40 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
36e50 2e 20 20 28 70 41 70 70 44 61 74 61 20 69 73 20  .  (pAppData is 
36e60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  a pointer to a p
36e70 6f 69 6e 74 65 72 20 62 65 63 61 75 73 65 0a 20  ointer because. 
36e80 20 2a 2a 20 73 69 6c 6c 79 20 43 39 30 20 72 75   ** silly C90 ru
36e90 6c 65 73 20 70 72 6f 68 69 62 69 74 20 61 20 76  les prohibit a v
36ea0 6f 69 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20  oid* from being 
36eb0 63 61 73 74 20 74 6f 20 61 20 66 75 6e 63 74 69  cast to a functi
36ec0 6f 6e 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  on pointer.  ** 
36ed0 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 74  and so we have t
36ee0 6f 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65  o go through the
36ef0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 70 6f   intermediate po
36f00 69 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 70  inter to avoid p
36f10 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65  roblems.  ** whe
36f20 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  n compiling with
36f30 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
36f40 73 20 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a  s on GCC.).  **.
36f50 20 20 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20    ** The FINDER 
36f60 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
36f70 73 20 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e  s macro is the n
36f80 61 6d 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ame of the point
36f90 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66  er to the.  ** f
36fa0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20  inder-function. 
36fb0 20 54 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   The finder-func
36fc0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
36fd0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20  ointer to the.  
36fe0 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74  ** sqlite_io_met
36ff0 68 6f 64 73 20 6f 62 6a 65 63 74 20 74 68 61 74  hods object that
37000 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
37010 64 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a  desired locking.
37020 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e 20    ** behaviors. 
37030 20 53 65 65 20 74 68 65 20 64 69 76 69 73 69 6f   See the divisio
37040 6e 20 61 62 6f 76 65 20 74 68 61 74 20 63 6f 6e  n above that con
37050 74 61 69 6e 73 20 74 68 65 20 49 4f 4d 45 54 48  tains the IOMETH
37060 4f 44 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66  ODS.  ** macro f
37070 6f 72 20 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f  or addition info
37080 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65  rmation on finde
37090 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  r-functions..  *
370a0 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  *.  ** Most find
370b0 65 72 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ers simply retur
370c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
370d0 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
370e0 6f 5f 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f  o_methods.  ** o
370f0 62 6a 65 63 74 2e 20 20 42 75 74 20 74 68 65 20  bject.  But the 
37100 22 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  "autolockIoFinde
37110 72 22 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  r" available on 
37120 4d 61 63 4f 53 58 20 64 6f 65 73 20 61 20 6c 69  MacOSX does a li
37130 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74  ttle.  ** more t
37140 68 61 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f  han that; it loo
37150 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
37160 73 74 65 6d 20 74 79 70 65 20 74 68 61 74 20 68  stem type that h
37170 6f 73 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 64  osts the .  ** d
37180 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
37190 20 74 72 69 65 73 20 74 6f 20 63 68 6f 6f 73 65   tries to choose
371a0 20 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68   an locking meth
371b0 6f 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  od appropriate f
371c0 6f 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 69 6c  or.  ** that fil
371d0 65 73 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20  esystem time..  
371e0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 55 4e 49  */.  #define UNI
371f0 58 56 46 53 28 56 46 53 4e 41 4d 45 2c 20 46 49  XVFS(VFSNAME, FI
37200 4e 44 45 52 29 20 7b 20 20 20 20 20 20 20 20 20  NDER) {         
37210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37220 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
37230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
37240 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
37250 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37260 20 20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69     sizeof(unixFi
37270 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
37280 46 69 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20  File */         
37290 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
372a0 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20   MAX_PATHNAME,  
372b0 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
372c0 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  name */         
372d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30           \.    0
372e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
372f0 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
37300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37310 20 20 20 20 20 20 20 5c 0a 20 20 20 20 56 46 53         \.    VFS
37320 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20  NAME,           
37330 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20     /* zName */  
37340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37350 20 20 20 20 20 5c 0a 20 20 20 20 28 76 6f 69 64       \.    (void
37360 2a 29 26 46 49 4e 44 45 52 2c 20 20 20 20 20 20  *)&FINDER,      
37370 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 20   /* pAppData */ 
37380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37390 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65     \.    unixOpe
373a0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
373b0 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20  * xOpen */      
373c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373d0 20 5c 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74   \.    unixDelet
373e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
373f0 78 44 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20  xDelete */      
37400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37410 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c  .    unixAccess,
37420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
37430 63 63 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20  ccess */        
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37450 20 20 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e     unixFullPathn
37460 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
37470 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  lPathname */    
37480 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37490 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20   unixDlOpen,    
374a0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
374b0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
374c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
374d0 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  nixDlError,     
374e0 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
374f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37500 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37510 78 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  xDlSym,         
37520 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20     /* xDlSym */ 
37530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37540 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
37550 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
37560 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20   /* xDlClose */ 
37570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37580 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e     \.    unixRan
37590 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
375a0 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
375b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375c0 20 5c 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70   \.    unixSleep
375d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
375e0 78 53 6c 65 65 70 20 2a 2f 20 20 20 20 20 20 20  xSleep */       
375f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37600 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74  .    unixCurrent
37610 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
37620 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20  urrentTime */   
37630 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37640 20 20 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72     unixGetLastEr
37650 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74  ror,     /* xGet
37660 4c 61 73 74 45 72 72 6f 72 20 2a 2f 20 20 20 20  LastError */    
37670 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37680 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
37690 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
376a0 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 20 20  ntTimeInt64 */  
376b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
376c0 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixSetSystemCall
376d0 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
376e0 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20  emCall */       
376f0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37700 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  xGetSystemCall, 
37710 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
37720 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  Call */         
37730 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4e       \.    unixN
37740 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
37750 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
37760 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  all */          
37770 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     \.  }..  /*. 
37780 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20   ** All default 
37790 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61  VFSes for unix a
377a0 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
377b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
377c0 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  ray..  **.  ** N
377d0 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c  ote that the sql
377e0 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66  ite3_vfs.pNext f
377f0 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20  ield of the VFS 
37800 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69  object is modifi
37810 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53  ed.  ** by the S
37820 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20  QLite core when 
37830 74 68 65 20 56 46 53 20 69 73 20 72 65 67 69 73  the VFS is regis
37840 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66  tered.  So the f
37850 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72  ollowing.  ** ar
37860 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ray cannot be co
37870 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74  nst..  */.  stat
37880 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61  ic sqlite3_vfs a
37890 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51  Vfs[] = {.#if SQ
378a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
378b0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53  ING_STYLE && (OS
378c0 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69  _VXWORKS || defi
378d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a  ned(__APPLE__)).
378e0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
378f0 78 22 2c 20 20 20 20 20 20 20 20 20 20 61 75 74  x",          aut
37900 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  olockIoFinder ),
37910 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56  .#else.    UNIXV
37920 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
37930 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65      posixIoFinde
37940 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  r ),.#endif.    
37950 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f  UNIXVFS("unix-no
37960 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49  ne",     nolockI
37970 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
37980 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74  NIXVFS("unix-dot
37990 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49  file",  dotlockI
379a0 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
379b0 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 65 78 63  NIXVFS("unix-exc
379c0 6c 22 2c 20 20 20 20 20 70 6f 73 69 78 49 6f 46  l",     posixIoF
379d0 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f  inder ),.#if OS_
379e0 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58  VXWORKS.    UNIX
379f0 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73  VFS("unix-nameds
37a00 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72  em", semIoFinder
37a10 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   ),.#endif.#if S
37a20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
37a30 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55  KING_STYLE.    U
37a40 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73  NIXVFS("unix-pos
37a50 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46  ix",    posixIoF
37a60 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 21 4f 53  inder ),.#if !OS
37a70 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49  _VXWORKS.    UNI
37a80 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b  XVFS("unix-flock
37a90 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  ",    flockIoFin
37aa0 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65  der ),.#endif.#e
37ab0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
37ac0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
37ad0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
37ae0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55  __APPLE__).    U
37af0 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70  NIXVFS("unix-afp
37b00 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e  ",      afpIoFin
37b10 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56  der ),.    UNIXV
37b20 46 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20  FS("unix-nfs",  
37b30 20 20 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 20      nfsIoFinder 
37b40 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  ),.    UNIXVFS("
37b50 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20  unix-proxy",    
37b60 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c  proxyIoFinder ),
37b70 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75  .#endif.  };.  u
37b80 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20  nsigned int i;  
37b90 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
37ba0 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a  counter */..  /*
37bb0 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68   Double-check th
37bc0 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b  at the aSyscall[
37bd0 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e  ] array has been
37be0 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a   constructed.  *
37bf0 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65  * correctly.  Se
37c00 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36  e ticket [bb3a86
37c10 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a  e890c8e96ab] */.
37c20 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
37c30 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 31  ize(aSyscall)==1
37c40 36 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 69 73  6 );..  /* Regis
37c50 74 65 72 20 61 6c 6c 20 56 46 53 65 73 20 64 65  ter all VFSes de
37c60 66 69 6e 65 64 20 69 6e 20 74 68 65 20 61 56 66  fined in the aVf
37c70 73 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 66  s[] array */.  f
37c80 6f 72 28 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f  or(i=0; i<(sizeo
37c90 66 28 61 56 66 73 29 2f 73 69 7a 65 6f 66 28 73  f(aVfs)/sizeof(s
37ca0 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 20 69 2b  qlite3_vfs)); i+
37cb0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
37cc0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 61 56  vfs_register(&aV
37cd0 66 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20  fs[i], i==0);.  
37ce0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
37cf0 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
37d00 53 68 75 74 64 6f 77 6e 20 74 68 65 20 6f 70 65  Shutdown the ope
37d10 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
37d20 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  terface..**.** S
37d30 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
37d40 73 74 65 6d 73 20 6d 69 67 68 74 20 6e 65 65 64  stems might need
37d50 20 74 6f 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61   to do some clea
37d60 6e 75 70 20 69 6e 20 74 68 69 73 20 72 6f 75 74  nup in this rout
37d70 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61  ine,.** to relea
37d80 73 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  se dynamically a
37d90 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 73  llocated objects
37da0 2e 20 20 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e  .  But not on un
37db0 69 78 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ix..** This rout
37dc0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  ine is a no-op f
37dd0 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20  or unix..*/.int 
37de0 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76  sqlite3_os_end(v
37df0 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72 6e 20  oid){ .  return 
37e00 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a  SQLITE_OK; .}. .
37e10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
37e20 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a              _OS_UNIX */.