/ Hex Artifact Content
Login

Artifact 67f9a304641f126f5f7326cd452c2df3d9a4d512:


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 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1b80: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1b90: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1ba0: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1bb0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1bc0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1bd0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1be0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1bf0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c10: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
1c20: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
1c30: 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b    int fileFlags;
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c 6c        /* Miscell
1c60: 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20  anous flags */. 
1c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c80: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c90: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ca0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cb0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ce0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1cf0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d00: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d30: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d40: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d50: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d60: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d70: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d90: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1da0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1db0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dc0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dd0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1de0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1df0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e20: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e30: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e40: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e50: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e80: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e90: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1ea0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1eb0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ec0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ed0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ee0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ef0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f00: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f10: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f20: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f30: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f40: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f60: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f70: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f80: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f90: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fa0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fb0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fc0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fd0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fe0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1ff0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2000: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2010: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2020: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2030: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2040: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2050: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2060: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2070: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2080: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2090: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20a0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20c0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20d0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20e0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20f0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2100: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2110: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2120: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2130: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2140: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2150: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2160: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2170: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2180: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2190: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21a0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21b0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21c0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21d0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21e0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21f0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2200: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2210: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
2230: 61 63 72 6f 73 20 64 65 66 69 6e 65 20 62 69 74  acros define bit
2240: 73 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e 66 69  s in unixFile.fi
2250: 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  leFlags.*/.#defi
2260: 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45 5f  ne SQLITE_WHOLE_
2270: 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20 30 78  FILE_LOCKING  0x
2280: 30 30 30 31 20 20 20 2f 2a 20 55 73 65 20 77 68  0001   /* Use wh
2290: 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ole-file locking
22a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
22b0: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
22c0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
22d0: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
22e0: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
22f0: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  n.h"../*.** Defi
2300: 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f  ne various macro
2310: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
2320: 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73  ng from some sys
2330: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
2340: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2350: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2360: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  E 0.#endif.#ifde
2370: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2380: 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c  _LFS.# undef O_L
2390: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
23a0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
23b0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23c0: 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69  _NOFOLLOW.# defi
23d0: 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a  ne O_NOFOLLOW 0.
23e0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
23f0: 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65  _BINARY.# define
2400: 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64   O_BINARY 0.#end
2410: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a  if../*.** The DJ
2420: 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76  GPP compiler env
2430: 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d  ironment looks m
2440: 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c  ostly like Unix,
2450: 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73   but it.** lacks
2460: 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   the fcntl() sys
2470: 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65  tem call.  So re
2480: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74  define fcntl() t
2490: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  o be something.*
24a0: 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75  * that always su
24b0: 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65  cceeds.  This me
24c0: 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67  ans that locking
24d0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
24e0: 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20  under.** DJGPP. 
24f0: 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d   But it is DOS -
2500: 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78   what did you ex
2510: 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20  pect?.*/.#ifdef 
2520: 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69  __DJGPP__.# defi
2530: 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20  ne fcntl(A,B,C) 
2540: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2550: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
2560: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
2570: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2580: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2590: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
25a0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
25b0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
25c0: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
25d0: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
25e0: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
25f0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
2600: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2610: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
2620: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
2630: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
2640: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
2650: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
2660: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
2670: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
2680: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
2690: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
26a0: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
26b0: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
26c0: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
26d0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
26e0: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
26f0: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
2700: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
2710: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
2720: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
2730: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
2740: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
2750: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
2760: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
2770: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
2780: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
2790: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
27a0: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
27b0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
27c0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
27d0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
27e0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
27f0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2800: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2810: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
2820: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2830: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2840: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
2850: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c  tatic void unixL
2860: 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
2870: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2880: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
2890: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
28a0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
28b0: 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  TER));.}.#ifdef 
28c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
28d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
28e0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
28f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
2900: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
2910: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
2920: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
2930: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
2940: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
2950: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
2960: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
2970: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
2980: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
2990: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
29a0: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
29b0: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
29c0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
29d0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
29e0: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
29f0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
2a00: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2a10: 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65  azFileLock(int e
2a20: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69  FileLock){.  swi
2a30: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
2a40: 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f  {.    case NO_LO
2a50: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
2a60: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41 52  ";.    case SHAR
2a70: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
2a80: 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61  "SHARED";.    ca
2a90: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
2aa0: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
2ab0: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45  ED";.    case PE
2ac0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
2ad0: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
2ae0: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
2af0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
2b00: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
2b10: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
2b20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
2b30: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
2b40: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
2b50: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
2b60: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
2b70: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
2b80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2b90: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
2ba0: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
2bb0: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
2bc0: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
2bd0: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
2be0: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
2bf0: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
2c00: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
2c10: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
2c20: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
2c30: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
2c40: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
2c50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c60: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
2c70: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
2c80: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
2c90: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
2ca0: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
2cb0: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
2cc0: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
2cd0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
2ce0: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
2cf0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
2d00: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
2d10: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
2d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66  }else{.    s = f
2d30: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
2d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2d50: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
2d60: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
2d70: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
2d80: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
2d90: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
2da0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2db0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
2dc0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
2dd0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
2de0: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
2df0: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
2e00: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
2e10: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
2e20: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
2e30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2e40: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
2e50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
2e60: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
2e70: 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64  ;.  s = fcntl(fd
2e80: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
2e90: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
2ea0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2eb0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
2ec0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
2ed0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
2ee0: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
2ef0: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
2f00: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
2f10: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
2f20: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
2f30: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
2f40: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
2f50: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
2f60: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
2f70: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
2f80: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
2f90: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
2fa0: 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c  p;.    fcntl(fd,
2fb0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
2fc0: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
2fd0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
2fe0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
2ff0: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
3000: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
3010: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
3020: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
3030: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
3040: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
3050: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
3060: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
3070: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
3080: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
3090: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
30a0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
30b0: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
30c0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
30d0: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
30e0: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
30f0: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
3100: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
3110: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
3120: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
3130: 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c  .}.#define fcntl
3140: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
3150: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
3160: 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  _TRACE */.../*.*
3170: 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74  * Retry ftruncat
3180: 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  e() calls that f
3190: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
31a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52  .*/.#ifdef EINTR
31b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
31c0: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
31d0: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
31e0: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
31f0: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 74 72 75  .  do{ rc = ftru
3200: 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68  ncate(h,sz); }wh
3210: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
3220: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
3230: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
3240: 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73  e.# define robus
3250: 74 5f 66 74 72 75 6e 63 61 74 65 28 61 2c 62 29  t_ftruncate(a,b)
3260: 20 66 74 72 75 6e 63 61 74 65 28 61 2c 62 29 0a   ftruncate(a,b).
3270: 23 65 6e 64 69 66 20 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif .../*.** 
3280: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
3290: 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61  nslates a standa
32a0: 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63  rd POSIX errno c
32b0: 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69  ode into somethi
32c0: 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20  ng.** useful to 
32d0: 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74  the clients of t
32e0: 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74  he sqlite3 funct
32f0: 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61  ions.  Specifica
3300: 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e  lly, it is.** in
3310: 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c  tended to transl
3320: 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66  ate a variety of
3330: 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72   "try again" err
3340: 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f  ors into SQLITE_
3350: 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61  BUSY.** and a va
3360: 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65  riety of "please
3370: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3380: 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20  descriptor NOW" 
3390: 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20  errors into .** 
33a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20  SQLITE_IOERR.** 
33b0: 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e  .** Errors durin
33c0: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
33d0: 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69   of locks, or fi
33e0: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
33f0: 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t for locks,.** 
3400: 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e  should handle EN
3410: 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45  OLCK, ENOTSUP, E
3420: 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61  OPNOTSUPP separa
3430: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
3440: 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46  int sqliteErrorF
3450: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  romPosixError(in
3460: 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e  t posixError, in
3470: 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b  t sqliteIOErr) {
3480: 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78  .  switch (posix
3490: 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20  Error) {.  case 
34a0: 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  0: .    return S
34b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20  QLITE_OK;.    . 
34c0: 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20   case EAGAIN:.  
34d0: 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a  case ETIMEDOUT:.
34e0: 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20    case EBUSY:.  
34f0: 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61  case EINTR:.  ca
3500: 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20  se ENOLCK:  .   
3510: 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72   /* random NFS r
3520: 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65  etry error, unle
3530: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3540: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3550: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3560: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
3570: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
3580: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
3590: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35a0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63  E_BUSY;.    .  c
35b0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20  ase EACCES: .   
35c0: 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69   /* EACCES is li
35d0: 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67  ke EAGAIN during
35e0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
35f0: 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  ons, but not any
3600: 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20   other time*/.  
3610: 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45    if( (sqliteIOE
3620: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
3630: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  RR_LOCK) || ..(s
3640: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
3650: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
3660: 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49  K) || ..(sqliteI
3670: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
3680: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a  OERR_RDLOCK) ||.
3690: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
36a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
36b0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
36c0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
36d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
36e0: 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20    }.    /* else 
36f0: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  fall through */.
3700: 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20    case EPERM: . 
3710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3720: 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63 61  _PERM;.    .  ca
3730: 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20 20  se EDEADLK:.    
3740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
3750: 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20  ERR_BLOCKED;.   
3760: 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50   .#if EOPNOTSUPP
3770: 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  !=ENOTSUP.  case
3780: 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20   EOPNOTSUPP: .  
3790: 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77    /* something w
37a0: 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72  ent terribly awr
37b0: 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  y, unless during
37c0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
37d0: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
37e0: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
37f0: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
3800: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
3810: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ays */.#endif.#i
3820: 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63  fdef ENOTSUP.  c
3830: 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20  ase ENOTSUP: .  
3840: 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c    /* invalid fd,
3850: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
3860: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
3870: 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  rt introspection
3880: 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20  , in which .    
3890: 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d   * it actually m
38a0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
38b0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61  s */.#endif.  ca
38c0: 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45  se EIO:.  case E
38d0: 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e  BADF:.  case EIN
38e0: 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54  VAL:.  case ENOT
38f0: 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f  CONN:.  case ENO
3900: 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49  DEV:.  case ENXI
3910: 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54  O:.  case ENOENT
3920: 3a 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a  :.  case ESTALE:
3930: 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a  .  case ENOSYS:.
3940: 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f      /* these sho
3950: 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c  uld force the cl
3960: 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68  ient to close th
3970: 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e  e file and recon
3980: 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64  nect */.    .  d
3990: 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74  efault: .    ret
39a0: 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b  urn sqliteIOErr;
39b0: 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a  .  }.}..../*****
39c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
3a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
3a20: 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  in Unique File I
3a30: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
3a40: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
3a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
3a60: 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73  On most versions
3a70: 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e   of unix, we can
3a80: 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49 44   get a unique ID
3a90: 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63   for a file by c
3aa0: 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20  oncatenating.** 
3ab0: 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65  the device numbe
3ac0: 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20  r and the inode 
3ad0: 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69  number.  But thi
3ae0: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
3af0: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f  on VxWorks..** O
3b00: 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69  n VxWorks, a uni
3b10: 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74  que file id must
3b20: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
3b30: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
3b40: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ame..**.** A poi
3b50: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
3b60: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3b70: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
3b80: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 0a  an be used as a.
3b90: 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49  ** unique file I
3ba0: 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45  D in VxWorks.  E
3bb0: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
3bc0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63  this structure c
3bd0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70  ontains.** a cop
3be0: 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63  y of the canonic
3bf0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68  al filename.  Th
3c00: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65  ere is also a re
3c10: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20  ference count.  
3c20: 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75 72  .** The structur
3c30: 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77  e is reclaimed w
3c40: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3c50: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74  f pointers to it
3c60: 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72   drops to.** zer
3c70: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  o..**.** There a
3c80: 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61  re never very ma
3c90: 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74  ny files open at
3ca0: 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f   one time and lo
3cb0: 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  okups are not.**
3cc0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63   a performance-c
3cd0: 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f  ritical path, so
3ce0: 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
3cf0: 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a  t to put these.*
3d00: 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20  * structures on 
3d10: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  a linked list..*
3d20: 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  /.struct vxworks
3d30: 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63  FileId {.  struc
3d40: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3d50: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
3d60: 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68   in a list of th
3d70: 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  em all */.  int 
3d80: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
3d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3da0: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
3db0: 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f  s to this one */
3dc0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
3df0: 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  e zCanonicalName
3e00: 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  [] string */.  c
3e10: 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e  har *zCanonicalN
3e20: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
3e30: 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  Canonical filena
3e40: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53  me */.};..#if OS
3e50: 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20  _VXWORKS./* .** 
3e60: 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e  All unique filen
3e70: 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ames are held on
3e80: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68   a linked list h
3e90: 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  eaded by this.**
3ea0: 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74   variable:.*/.st
3eb0: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
3ec0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
3ed0: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a  ksFileList = 0;.
3ee0: 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20  ./*.** Simplify 
3ef0: 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  a filename into 
3f00: 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f  its canonical fo
3f10: 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20  rm.** by making 
3f20: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  the following ch
3f30: 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20  anges:.**.**  * 
3f40: 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61  removing any tra
3f50: 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63  iling and duplic
3f60: 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ate /.**  * conv
3f70: 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73  ert /./ into jus
3f80: 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  t /.**  * conver
3f90: 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41  t /A/../ where A
3fa0: 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e   is any simple n
3fb0: 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  ame into just /.
3fc0: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72  **.** Changes ar
3fd0: 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e  e made in-place.
3fe0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
3ff0: 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a   name length..**
4000: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
4010: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20   filename is in 
4020: 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75  z[0..n-1].  Retu
4030: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
4040: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
4050: 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64  n the simplified
4060: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
4070: 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70   int vxworksSimp
4080: 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a  lifyName(char *z
4090: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
40a0: 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  i, j;.  while( n
40b0: 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >1 && z[n-1]=='/
40c0: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f  ' ){ n--; }.  fo
40d0: 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
40e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
40f0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
4100: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29  f( z[i+1]=='/' )
4110: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4120: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
4130: 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69   && i+2<n && z[i
4140: 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +2]=='/' ){.    
4150: 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20      i += 1;.    
4160: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4170: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4180: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
4190: 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +3<n && z[i+2]==
41a0: 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27  '.' && z[i+3]=='
41b0: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  /' ){.        wh
41c0: 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d  ile( j>0 && z[j-
41d0: 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
41e0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
41f0: 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  0 ){ j--; }.    
4200: 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
4210: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4220: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4230: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
4240: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
4250: 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a   return j;.}../*
4260: 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75  .** Find a uniqu
4270: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68  e file ID for th
4280: 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65  e given absolute
4290: 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75   pathname.  Retu
42a0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
42b0: 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  to the vxworksFi
42c0: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68  leId object.  Th
42d0: 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68  is pointer is th
42e0: 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65  e unique.** file
42f0: 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   ID..**.** The n
4300: 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Ref field of the
4310: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
4320: 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65  bject is increme
4330: 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  nted before.** t
4340: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74  he object is ret
4350: 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78  urned.  A new vx
4360: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
4370: 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  ct is created.**
4380: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
4390: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66  e global list if
43a0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
43b0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
43c0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
43d0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
43e0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  LL..*/.static st
43f0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
4400: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46  Id *vxworksFindF
4410: 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72  ileId(const char
4420: 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29   *zAbsoluteName)
4430: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
4440: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20  ksFileId *pNew; 
4450: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63          /* searc
4460: 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69  h key and new fi
4470: 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63  le ID */.  struc
4480: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
4490: 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f  *pCandidate;   /
44a0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
44b0: 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  er existing file
44c0: 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b   IDs */.  int n;
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
44f0: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f   Length of zAbso
4500: 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20  luteName string 
4510: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41  */..  assert( zA
4520: 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d  bsoluteName[0]==
4530: 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e  '/' );.  n = (in
4540: 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75  t)strlen(zAbsolu
4550: 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20  teName);.  pNew 
4560: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
4570: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
4580: 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28  + (n+1) );.  if(
4590: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
45a0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61  n 0;.  pNew->zCa
45b0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63  nonicalName = (c
45c0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
45d0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43   memcpy(pNew->zC
45e0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41  anonicalName, zA
45f0: 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31  bsoluteName, n+1
4600: 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73  );.  n = vxworks
4610: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65  SimplifyName(pNe
4620: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
4630: 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  e, n);..  /* Sea
4640: 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
4650: 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d  ing entry that m
4660: 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f  atching the cano
4670: 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a  nical name..  **
4680: 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65   If found, incre
4690: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
46a0: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
46b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
46c0: 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69  .  ** the existi
46d0: 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f  ng file ID..  */
46e0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
46f0: 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64  x();.  for(pCand
4700: 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c  idate=vxworksFil
4710: 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74  eList; pCandidat
4720: 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43  e; pCandidate=pC
4730: 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29  andidate->pNext)
4740: 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69  {.    if( pCandi
4750: 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a  date->nName==n .
4760: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
4770: 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f  Candidate->zCano
4780: 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d  nicalName, pNew-
4790: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
47a0: 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20   n)==0.    ){.  
47b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
47c0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
47d0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66  pCandidate->nRef
47e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c  ++;.       unixL
47f0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
4800: 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64      return pCand
4810: 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  idate;.    }.  }
4820: 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20  ..  /* No match 
4830: 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77  was found.  We w
4840: 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66  ill make a new f
4850: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77  ile ID */.  pNew
4860: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e  ->nRef = 1;.  pN
4870: 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20  ew->nName = n;. 
4880: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76   pNew->pNext = v
4890: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a  xworksFileList;.
48a0: 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73    vxworksFileLis
48b0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78  t = pNew;.  unix
48c0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
48d0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
48e0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
48f0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
4900: 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73  unt on a vxworks
4910: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
4920: 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  Free.** the obje
4930: 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ct when the refe
4940: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
4950: 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  hes zero..*/.sta
4960: 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73  tic void vxworks
4970: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74  ReleaseFileId(st
4980: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
4990: 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  Id *pId){.  unix
49a0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
49b0: 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65  assert( pId->nRe
49c0: 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52  f>0 );.  pId->nR
49d0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d  ef--;.  if( pId-
49e0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
49f0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
4a00: 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66  leId **pp;.    f
4a10: 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69  or(pp=&vxworksFi
4a20: 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a  leList; *pp && *
4a30: 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28  pp!=pId; pp = &(
4a40: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d  (*pp)->pNext)){}
4a50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
4a60: 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70  ==pId );.    *pp
4a70: 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20   = pId->pNext;. 
4a80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4a90: 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  pId);.  }.  unix
4aa0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
4ab0: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
4ac0: 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORKS */./*******
4ad0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
4ae0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
4af0: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
4b00: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
4b10: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
4b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b60: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
4b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
4bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4bd0: 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69  ***** Posix Advi
4be0: 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  sory Locking ***
4bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
4c10: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
4c20: 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  ocks are broken 
4c30: 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49  by design.  ANSI
4c40: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
4c50: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
4c60: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
4c70: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
4c80: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
4c90: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
4ca0: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
4cb0: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
4cc0: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
4cd0: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
4ce0: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
4cf0: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
4d00: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
4d10: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
4d20: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
4d30: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
4d40: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
4d50: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
4d60: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
4d70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d80: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
4d90: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a  test case:.**.**
4da0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d         int fd1 =
4db0: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c   open("./file1",
4dc0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
4dd0: 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20   0644);.**      
4de0: 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
4df0: 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57  "./file2", O_RDW
4e00: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
4e10: 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ;.**.** Suppose 
4e20: 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69  ./file1 and ./fi
4e30: 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74  le2 are really t
4e40: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65  he same file (be
4e50: 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20  cause.** one is 
4e60: 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c  a hard or symbol
4e70: 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f  ic link to the o
4e80: 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f  ther) then if yo
4e90: 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c  u set.** an excl
4ea0: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64  usive lock on fd
4eb0: 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67  1, then try to g
4ec0: 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
4ed0: 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20  lock.** on fd2, 
4ee0: 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75  it works.  I wou
4ef0: 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64  ld have expected
4f00: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b   the second lock
4f10: 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63   to.** fail sinc
4f20: 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65  e there was alre
4f30: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ady a lock on th
4f40: 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64  e file due to fd
4f50: 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f  1..** But not so
4f60: 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f  .  Since both lo
4f70: 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68  cks came from th
4f80: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20  e same process, 
4f90: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76  the.** second ov
4fa0: 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73  errides the firs
4fb0: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
4fc0: 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66  hey were on diff
4fd0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4fe0: 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
4ff0: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69   on different fi
5000: 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  le names..**.** 
5010: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
5020: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
5030: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
5040: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
5050: 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f  cess.** among co
5060: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
5070: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
5080: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
5090: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
50a0: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
50b0: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
50c0: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
50d0: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
50e0: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
50f0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
5100: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
5110: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
5120: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
5130: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
5140: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
5150: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
5160: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
5170: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
5180: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
5190: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
51a0: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
51b0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
51c0: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
51d0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
51e0: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
51f0: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
5200: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
5210: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
5220: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
5230: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
5240: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
5250: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
5260: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
5270: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
5280: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
5290: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
52a0: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
52b0: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
52c0: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
52d0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
52e0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
52f0: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
5300: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
5310: 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68  **.** (Aside: Th
5320: 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e  e use of inode n
5330: 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65  umbers as unique
5340: 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f   IDs does not wo
5350: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
5360: 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77  * For VxWorks, w
5370: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
5380: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e  e alternative un
5390: 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62  ique ID system b
53a0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e  ased on.** canon
53b0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e  ical filename an
53c0: 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  d implemented in
53d0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69   the previous di
53e0: 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54  vision.).**.** T
53f0: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
5400: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f  structure for PO
5410: 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  SIX is no longer
5420: 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72   just an integer
5430: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
5440: 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20  tor.  It is now 
5450: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5460: 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67   holds the integ
5470: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
5480: 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e  iptor and a poin
5490: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
54a0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
54b0: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  s the internal.*
54c0: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63  * locks on the c
54d0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f  orresponding ino
54e0: 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  de.  There is on
54f0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
5500: 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65  ure.** per inode
5510: 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65  , so if the same
5520: 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64   inode is opened
5530: 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69   twice, both uni
5540: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  xFile structures
5550: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
5560: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
5570: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
5580: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
5590: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
55a0: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
55b0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
55c0: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
55d0: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
55e0: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
55f0: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
5600: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
5610: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
5620: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
5630: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
5640: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
5650: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
5660: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
5670: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
5680: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
5690: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
56a0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
56b0: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
56c0: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
56d0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
56e0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
56f0: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
5700: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
5710: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
5720: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
5730: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
5740: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
5750: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
5760: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
5770: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
5780: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74  ..**.** But wait
5790: 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74  :  there are yet
57a0: 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77   more problems w
57b0: 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f  ith POSIX adviso
57c0: 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ry locks..**.** 
57d0: 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66  If you close a f
57e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
57f0: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  hat points to a 
5800: 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f  file that has lo
5810: 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b  cks,.** all lock
5820: 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  s on that file t
5830: 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79  hat are owned by
5840: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
5850: 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65  cess are.** rele
5860: 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61  ased.  To work a
5870: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
5880: 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f  em, each unixIno
5890: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  deInfo object.**
58a0: 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75   maintains a cou
58b0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
58c0: 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   of pending lock
58d0: 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a  s on tha inode..
58e0: 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  ** When an attem
58f0: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
5900: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
5910: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
5920: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
5930: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
5940: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
5950: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
5960: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
5970: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
5980: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
5990: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
59a0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
59b0: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49  ar..** The unixI
59c0: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
59d0: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
59e0: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
59f0: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
5a00: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
5a10: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
5a20: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
5a30: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
5a40: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
5a50: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
5a60: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
5a70: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
5a80: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
5a90: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
5aa0: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
5ab0: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
5ac0: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
5ad0: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
5ae0: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
5af0: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
5b00: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
5b10: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
5b20: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
5b30: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
5b40: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
5b50: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
5b60: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
5b70: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
5b80: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
5b90: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
5ba0: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
5bb0: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
5bc0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
5bd0: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
5be0: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
5bf0: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
5c00: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
5c10: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
5c20: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
5c30: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
5c40: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
5c50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
5c60: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
5c70: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
5c80: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
5c90: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
5ca0: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
5cb0: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
5cc0: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
5cd0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
5ce0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
5cf0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
5d00: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65  thread B..** One
5d10: 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e   has to do a run
5d20: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
5d30: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
5d40: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
5d50: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
5d60: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
5d70: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e  d to support Lin
5d80: 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20  uxThreads.  But 
5d90: 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75  support for Linu
5da0: 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20  xThreads.** was 
5db0: 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e  dropped beginnin
5dc0: 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33  g with version 3
5dd0: 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69  .7.0.  SQLite wi
5de0: 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69  ll still work wi
5df0: 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61  th.** LinuxThrea
5e00: 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74  ds provided that
5e10: 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (1) there is no
5e20: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
5e30: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65  onnection .** pe
5e40: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
5e50: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
5e60: 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61  ess and (2) data
5e70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
5e80: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20  .** do not move 
5e90: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a  across threads..
5ea0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
5eb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
5ec0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
5ed0: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
5ee0: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
5ef0: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
5f00: 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  r unixInodeInfo 
5f10: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63  object..*/.struc
5f20: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
5f30: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f50: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
5f60: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
5f70: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
5f80: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
5f90: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
5fa0: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
5fb0: 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e  #else.  ino_t in
5fc0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
5fd0: 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d      /* Inode num
5fe0: 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ber */.#endif.};
5ff0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
6000: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
6010: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
6020: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
6030: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
6040: 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75  de.  Or, on Linu
6050: 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20  xThreads, there 
6060: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  is one of these 
6070: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a  structures for.*
6080: 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65  * each inode ope
6090: 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65  ned by each thre
60a0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67  ad..**.** A sing
60b0: 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76  le inode can hav
60c0: 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20  e multiple file 
60d0: 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20  descriptors, so 
60e0: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a  each unixFile.**
60f0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
6100: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
6110: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
6120: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
6130: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
6140: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
6150: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e  the number of un
6160: 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20  ixFile pointing 
6170: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
6180: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b   unixInodeInfo {
6190: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
61a0: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
61b0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
61c0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   key */.  int nS
61d0: 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  hared;          
61e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
61f0: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
6200: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e  cks held */.  in
6210: 74 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  t eFileLock;    
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6230: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
6240: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
6250: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  CK etc. */.  int
6260: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6280: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
6290: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
62a0: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
62b0: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
62c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
62d0: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
62e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
62f0: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  inode */.  int n
6300: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
6310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6320: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
6330: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a  ing file locks *
6340: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
6350: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
6360: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
6370: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
6380: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69  o close */.  uni
6390: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78  xInodeInfo *pNex
63a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
63b0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
63c0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
63d0: 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  s */.  unixInode
63e0: 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20  Info *pPrev;    
63f0: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e         /*    ...
6400: 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  . doubly linked 
6410: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
6420: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
6430: 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20 20 75 6e  KING_STYLE).  un
6440: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
6450: 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a   sharedByte;  /*
6460: 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74   for AFP simulat
6470: 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ed shared lock *
6480: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  /.#endif.#if OS_
6490: 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20  VXWORKS.  sem_t 
64a0: 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pSem;          
64b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
64c0: 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f  ed POSIX semapho
64d0: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65  re */.  char aSe
64e0: 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  mName[MAX_PATHNA
64f0: 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20  ME+2];  /* Name 
6500: 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72  of that semaphor
6510: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
6520: 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66  /*.** A lists of
6530: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
6540: 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73  fo objects..*/.s
6550: 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49  tatic unixInodeI
6560: 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d  nfo *inodeList =
6570: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68   0;../*.**.** Th
6580: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e  is function - un
6590: 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20  ixLogError_x(), 
65a0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
65b0: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
65c0: 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f  o.** unixLogErro
65d0: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  r()..**.** It is
65e0: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
65f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
6600: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
6610: 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62   and errno has b
6620: 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c  een.** set. It l
6630: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
6640: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
6650: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
6660: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
6670: 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20  f.** errno and, 
6680: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
6690: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
66a0: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
66b0: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a  strerror() or.**
66c0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a   strerror_r()..*
66d0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
66e0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
66f0: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
6700: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
6710: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
6720: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
6730: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
6740: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
6750: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
6760: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
6770: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
6780: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
6790: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
67a0: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
67b0: 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e  .** failed (e.g.
67c0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e   "unlink", "open
67d0: 22 29 20 61 6e 64 20 74 68 65 20 74 68 65 20 61  ") and the the a
67e0: 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73  ssociated file-s
67f0: 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69  ystem path,.** i
6800: 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  f any..*/.#defin
6810: 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61  e unixLogError(a
6820: 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f  ,b,c)     unixLo
6830: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
6840: 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61  ,c,__LINE__).sta
6850: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45  tic int unixLogE
6860: 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e  rrorAtLine(.  in
6870: 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20  t errcode,      
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6890: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
68a0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
68b0: 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20  ar *zFunc,      
68c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
68d0: 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  of OS function t
68e0: 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  hat failed */.  
68f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
6900: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
6910: 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73  /* File path ass
6920: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72  ociated with err
6930: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  or */.  int iLin
6940: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
6950: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
6960: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68  e line number wh
6970: 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ere error occurr
6980: 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ed */.){.  char 
6990: 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20  *zErr;          
69a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
69b0: 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72  ssage from strer
69c0: 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c  ror() or equival
69d0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72  ent */.  int iEr
69e0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20  rno = errno;    
69f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65           /* Save
6a00: 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20  d syscall error 
6a10: 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  number */..  /* 
6a20: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
6a30: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
6a40: 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  d (SQLITE_THREAD
6a50: 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75  SAFE==0), then u
6a60: 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65  se.  ** the stre
6a70: 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  rror() function 
6a80: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75  to obtain the hu
6a90: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72  man-readable err
6aa0: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
6ab0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72  equivalent to er
6ac0: 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
6ad0: 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29  use strerror_r()
6ae0: 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49  ..  */ .#if SQLI
6af0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
6b00: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54   defined(HAVE_ST
6b10: 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72  RERROR_R).  char
6b20: 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d   aErr[80];.  mem
6b30: 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a  set(aErr, 0, siz
6b40: 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45  eof(aErr));.  zE
6b50: 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a  rr = aErr;..  /*
6b60: 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43   If STRERROR_R_C
6b70: 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75  HAR_P (set by au
6b80: 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20  toconf scripts) 
6b90: 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20  or __USE_GNU is 
6ba0: 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73  defined,.  ** as
6bb0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
6bc0: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
6bd0: 65 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  e the GNU versio
6be0: 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28  n of strerror_r(
6bf0: 29 20 74 68 61 74 20 0a 20 20 2a 2a 20 72 65 74  ) that .  ** ret
6c00: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
6c10: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
6c20: 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  ining the error 
6c30: 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f  message. That po
6c40: 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20  inter .  ** may 
6c50: 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c  point to aErr[],
6c60: 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74   or it may point
6c70: 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20   to some static 
6c80: 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72  storage somewher
6c90: 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
6ca0: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
6cb0: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
6cc0: 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65  des the POSIX ve
6cd0: 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73  rsion of .  ** s
6ce0: 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69  trerror_r(), whi
6cf0: 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73  ch always writes
6d00: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
6d10: 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20  e into aErr[].. 
6d20: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
6d30: 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  code incorrectly
6d40: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
6d50: 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65   is the POSIX ve
6d60: 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20  rsion that is.  
6d70: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ** available, th
6d80: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
6d90: 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e  will often be an
6da0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e   empty string. N
6db0: 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70  ot a.  ** huge p
6dc0: 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63  roblem. Incorrec
6dd0: 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74  tly concluding t
6de0: 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73  hat the GNU vers
6df0: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
6e00: 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61   .  ** could lea
6e10: 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20  d to a segfault 
6e20: 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66  though..  */.#if
6e30: 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f   defined(STRERRO
6e40: 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64  R_R_CHAR_P) || d
6e50: 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55  efined(__USE_GNU
6e60: 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e  ).  zErr = .# en
6e70: 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72  dif.  strerror_r
6e80: 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73  (iErrno, aErr, s
6e90: 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a  izeof(aErr)-1);.
6ea0: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48  .#elif SQLITE_TH
6eb0: 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68  READSAFE.  /* Th
6ec0: 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61  is is a threadsa
6ed0: 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74  fe build, but st
6ee0: 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f  rerror_r() is no
6ef0: 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a  t available. */.
6f00: 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c    zErr = "";.#el
6f10: 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65  se.  /* Non-thre
6f20: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73  adsafe build, us
6f30: 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f  e strerror(). */
6f40: 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72  .  zErr = strerr
6f50: 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64  or(iErrno);.#end
6f60: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 65 72  if..  assert( er
6f70: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
6f80: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
6f90: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
6fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
6fb0: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
6fc0: 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64  s_unix.c:%d: (%d
6fd0: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
6fe0: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72        iLine, iEr
6ff0: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
7000: 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20  h, zErr.  );..  
7010: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
7020: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
7030: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7040: 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
7050: 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61  e that close() a
7060: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72  lmost always wor
7070: 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20  ks, since it is 
7080: 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72  only in a.** ver
7090: 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69  y sick applicati
70a0: 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20  on or on a very 
70b0: 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68  sick platform th
70c0: 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c  at it might fail
70d0: 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20  ..** If it does 
70e0: 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61  fail, simply lea
70f0: 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  k the file descr
7100: 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f  iptor, but do lo
7110: 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a  g the.** error..
7120: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7130: 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  it is not safe t
7140: 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20  o retry close() 
7150: 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63  after EINTR sinc
7160: 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  e the.** file de
7170: 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68  scriptor might h
7180: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
7190: 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68   reused by anoth
71a0: 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f  er thread..** So
71b0: 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74   we don't even t
71c0: 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ry to recover fr
71d0: 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75  om an EINTR.  Ju
71e0: 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72  st log the error
71f0: 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e  .** and move on.
7200: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7210: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69  robust_close(uni
7220: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
7230: 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29  t h, int lineno)
7240: 7b 0a 20 20 69 66 28 20 63 6c 6f 73 65 28 68 29  {.  if( close(h)
7250: 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   ){.    unixLogE
7260: 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54  rrorAtLine(SQLIT
7270: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22  E_IOERR_CLOSE, "
7280: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20  close",.        
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
72a0: 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50  File ? pFile->zP
72b0: 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29  ath : 0, lineno)
72c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
72d0: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
72e0: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
72f0: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
7300: 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73  InodeInfo->pUnus
7310: 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61  ed list..*/ .sta
7320: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65  tic void closePe
7330: 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c  ndingFds(unixFil
7340: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
7350: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
7360: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
7370: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
7380: 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75  Fd *p;.  UnixUnu
7390: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20  sedFd *pNext;.  
73a0: 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55  for(p=pInode->pU
73b0: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
73c0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
73d0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f  p->pNext;.    ro
73e0: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
73f0: 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , p->fd, __LINE_
7400: 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  _);.    sqlite3_
7410: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70  free(p);.  }.  p
7420: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
7430: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
7440: 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65  ease a unixInode
7450: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
7460: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
7470: 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65  ted by findInode
7480: 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Info()..**.** Th
7490: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
74a0: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
74b0: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
74c0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
74d0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
74e0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
74f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7500: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
7510: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
7520: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
7530: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
7540: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
7550: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
7560: 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
7570: 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 70 49  pInode ){.    pI
7580: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
7590: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
75a0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
75b0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
75c0: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
75d0: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
75e0: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
75f0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
7600: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
7610: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
7620: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
7630: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
7640: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
7650: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
7660: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
7670: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7680: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
7690: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
76a0: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
76b0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
76c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
76d0: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
76e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
76f0: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
7700: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
7710: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
7720: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
7730: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
7740: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7750: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
7760: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
7770: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
7780: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
7790: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
77a0: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
77b0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
77c0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
77d0: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
77e0: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
77f0: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
7800: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
7810: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
7820: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7830: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
7840: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
7850: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
7860: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
7870: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
7880: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
7890: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
78a0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
78b0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
78c0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
78d0: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
78e0: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
78f0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
7900: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
7910: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
7920: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
7930: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
7940: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
7950: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
7960: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
7970: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
7980: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
79b0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
79c0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
79f0: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
7a00: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
7a10: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
7a20: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
7a30: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
7a40: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
7a50: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
7a60: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
7a70: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
7a80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
7a90: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
7aa0: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
7ab0: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
7ac0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
7ad0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
7ae0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
7af0: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
7b00: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
7b10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
7b20: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
7b30: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
7b40: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
7b50: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
7b60: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
7b70: 3e 68 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74  >h;.  rc = fstat
7b80: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
7b90: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
7ba0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
7bb0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
7bc0: 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20  def EOVERFLOW.  
7bd0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
7be0: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
7bf0: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
7c00: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
7c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7c20: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
7c30: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
7c40: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
7c50: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
7c60: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
7c70: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
7c80: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
7c90: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
7ca0: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
7cb0: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
7cc0: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
7cd0: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
7ce0: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
7cf0: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
7d00: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
7d10: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
7d20: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
7d30: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
7d40: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
7d50: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
7d60: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
7d70: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
7d80: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
7d90: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
7da0: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
7db0: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
7dc0: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
7dd0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
7de0: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
7df0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
7e00: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
7e10: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
7e20: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
7e30: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
7e40: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
7e50: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
7e60: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
7e70: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
7e80: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
7e90: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
7ea0: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
7eb0: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
7ec0: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
7ed0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
7ee0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
7ef0: 72 63 20 3d 20 77 72 69 74 65 28 66 64 2c 20 22  rc = write(fd, "
7f00: 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20  S", 1); }while( 
7f10: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
7f20: 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20  INTR );.    if( 
7f30: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  rc!=1 ){.      p
7f40: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
7f50: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
7f60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7f70: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  RR;.    }.    rc
7f80: 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74   = fstat(fd, &st
7f90: 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
7fa0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  rc!=0 ){.      p
7fb0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
7fc0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
7fd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7fe0: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
7ff0: 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ndif..  memset(&
8000: 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f  fileId, 0, sizeo
8010: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69  f(fileId));.  fi
8020: 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62  leId.dev = statb
8030: 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f  uf.st_dev;.#if O
8040: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65  S_VXWORKS.  file
8050: 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e  Id.pId = pFile->
8060: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c  pId;.#else.  fil
8070: 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  eId.ino = statbu
8080: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66  f.st_ino;.#endif
8090: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64  .  pInode = inod
80a0: 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
80b0: 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70  pInode && memcmp
80c0: 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64  (&fileId, &pInod
80d0: 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  e->fileId, sizeo
80e0: 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20  f(fileId)) ){.  
80f0: 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
8100: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  e->pNext;.  }.  
8110: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
8120: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71  .    pInode = sq
8130: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
8140: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
8150: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
8160: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
8170: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8180: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
8190: 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a  t(pInode, 0, siz
81a0: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20  eof(*pInode));. 
81b0: 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64     memcpy(&pInod
81c0: 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65  e->fileId, &file
81d0: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
81e0: 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d));.    pInode-
81f0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
8200: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69  Inode->pNext = i
8210: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49  nodeList;.    pI
8220: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b  node->pPrev = 0;
8230: 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69  .    if( inodeLi
8240: 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e  st ) inodeList->
8250: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a  pPrev = pInode;.
8260: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
8270: 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  pInode;.  }else{
8280: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
8290: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e  f++;.  }.  *ppIn
82a0: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ode = pInode;.  
82b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
82c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
82d0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
82e0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
82f0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
8300: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
8310: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
8320: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
8330: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
8340: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
8350: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
8360: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
8370: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
8380: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
8390: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
83a0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
83b0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
83c0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
83d0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
83e0: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
83f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
8400: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
8410: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
8420: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
8430: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
8440: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
8450: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
8460: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
8470: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
8480: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
8490: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
84a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
84b0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
84c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
84d0: 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  e );.  unixEnter
84e0: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
84f0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
8500: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
8510: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
8520: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
8530: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
8540: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
8550: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
8560: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
8570: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
8580: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
8590: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
85a0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
85b0: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
85c0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
85d0: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
85e0: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
85f0: 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
8600: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
8610: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
8620: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
8630: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
8640: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
8650: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
8660: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
8670: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
8680: 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31 20 3d 3d  K;.    if (-1 ==
8690: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
86a0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
86b0: 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  ) {.      int tE
86c0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
86d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
86e0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
86f0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
8700: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
8710: 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
8720: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
8730: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
8740: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
8750: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
8760: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
8770: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
8780: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
8790: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
87a0: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
87b0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
87c0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
87d0: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
87e0: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
87f0: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
8800: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8810: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
8820: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
8830: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
8840: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
8850: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
8860: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
8870: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
8880: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
8890: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
88a0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
88b0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
88c0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
88d0: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
88e0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
88f0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
8900: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
8910: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
8920: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
8930: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
8940: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
8950: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
8960: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
8970: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
8980: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
8990: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
89a0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
89b0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
89c0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
89d0: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
89e0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
89f0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
8a00: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
8a10: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
8a20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
8a30: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
8a40: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
8a50: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
8a60: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
8a70: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
8a80: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
8a90: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
8aa0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
8ab0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
8ac0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
8ad0: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
8ae0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
8af0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
8b00: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
8b10: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
8b20: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
8b30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
8b40: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
8b50: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
8b60: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
8b70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
8b80: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
8b90: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
8ba0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
8bb0: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
8bc0: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
8bd0: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
8be0: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
8bf0: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
8c00: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
8c10: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
8c20: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
8c30: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
8c40: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
8c50: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
8c60: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
8c70: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
8c80: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
8c90: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
8ca0: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
8cb0: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
8cc0: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
8cd0: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
8ce0: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
8cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
8d00: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
8d10: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
8d20: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
8d30: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
8d40: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
8d50: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
8d60: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
8d70: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
8d80: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
8d90: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
8da0: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
8db0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
8dc0: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
8dd0: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
8de0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
8df0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
8e00: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
8e10: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
8e20: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
8e30: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
8e40: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
8e50: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
8e60: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
8e70: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
8e80: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
8e90: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
8ea0: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
8eb0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
8ec0: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
8ed0: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
8ee0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
8ef0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
8f00: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
8f10: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
8f20: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
8f30: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
8f40: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
8f50: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
8f60: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
8f70: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
8f80: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
8f90: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
8fa0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
8fb0: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
8fc0: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
8fd0: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
8fe0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
8ff0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
9000: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
9010: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
9020: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
9030: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
9040: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
9050: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
9060: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
9070: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
9080: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
9090: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
90a0: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
90b0: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
90c0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
90d0: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
90e0: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
90f0: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
9100: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
9110: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
9120: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
9130: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
9140: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
9150: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
9160: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
9170: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
9180: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
9190: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
91a0: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
91b0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
91c0: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
91d0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
91e0: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
91f0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
9200: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
9210: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
9220: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
9230: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
9240: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
9250: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
9260: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
9270: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
9280: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
9290: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
92a0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
92b0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
92c0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
92d0: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
92e0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
92f0: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
9300: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
9310: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
9320: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
9330: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
9340: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
9350: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
9360: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
9370: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
9380: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
9390: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
93a0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
93b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
93c0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
93d0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
93e0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
93f0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
9400: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
9410: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
9420: 6e 74 20 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt s = 0;.  int 
9430: 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  tErrno = 0;..  a
9440: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
9450: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
9460: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
9470: 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
9480: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
9490: 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  >h,.      azFile
94a0: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
94b0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
94c0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
94d0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
94e0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
94f0: 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  k), pInode->nSha
9500: 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29  red , getpid()))
9510: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
9520: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
9530: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
9540: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
9550: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
9560: 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
9570: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
9580: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
9590: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
95a0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
95b0: 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
95c0: 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
95d0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
95e0: 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
95f0: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
9600: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
9610: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
9620: 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  ) (unix)\n", pFi
9630: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
9640: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
9650: 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
9660: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9670: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
9680: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
9690: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
96a0: 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29  rrect..  **  (1)
96b0: 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
96c0: 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
96d0: 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
96e0: 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
96f0: 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
9700: 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
9710: 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
9720: 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
9730: 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
9740: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
9750: 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
9760: 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
9770: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
9780: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
9790: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
97a0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
97b0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
97c0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
97d0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
97e0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
97f0: 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
9800: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
9810: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
9820: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
9830: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
9840: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
9850: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
9860: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
9870: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
9880: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
9890: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
98a0: 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
98b0: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
98c0: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
98d0: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
98e0: 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
98f0: 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
9900: 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
9910: 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
9920: 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
9930: 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
9940: 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
9950: 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
9960: 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
9970: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
9980: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
9990: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
99a0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  )).  ){.    rc =
99b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
99c0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
99d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
99e0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
99f0: 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
9a00: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
9a10: 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
9a20: 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
9a30: 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
9a40: 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
9a50: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
9a60: 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
9a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
9a80: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
9a90: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
9aa0: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e  K && .      (pIn
9ab0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
9ac0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
9ad0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
9ae0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
9af0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9b00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
9b10: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
9b20: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
9b30: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
9b40: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
9b50: 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
9b60: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
9b70: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
9b80: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
9b90: 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
9ba0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
9bb0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
9bc0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45  .  }...  /* A PE
9bd0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
9be0: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
9bf0: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
9c00: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
9c10: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
9c20: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
9c30: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
9c40: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
9c50: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
9c60: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
9c70: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
9c80: 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  ;.  lock.l_whenc
9c90: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
9ca0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
9cb0: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
9cc0: 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
9cd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
9ce0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
9cf0: 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
9d00: 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
9d10: 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c  l_type = (eFileL
9d20: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
9d30: 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b  ?F_RDLCK:F_WRLCK
9d40: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  );.    lock.l_st
9d50: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
9d60: 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  TE;.    s = fcnt
9d70: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
9d80: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
9d90: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
9da0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
9db0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
9dc0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
9dd0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
9de0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
9df0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
9e00: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
9e10: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
9e20: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
9e30: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
9e40: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
9e50: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
9e60: 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
9e70: 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
9e80: 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
9e90: 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
9ea0: 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
9eb0: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
9ec0: 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
9ed0: 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
9ee0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
9ef0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
9f00: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
9f10: 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
9f20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
9f30: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
9f40: 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  0 );..    /* Now
9f50: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
9f60: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
9f70: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
9f80: 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  FIRST;.    lock.
9f90: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
9fa0: 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 28 73 20  IZE;.    if( (s 
9fb0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
9fc0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
9fd0: 29 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  ))==(-1) ){.    
9fe0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
9ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
a000: 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
a010: 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
a020: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
a030: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
a040: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
a050: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b  n = 1L;.    lock
a060: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
a070: 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  K;.    if( fcntl
a080: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
a090: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b  LK, &lock)!=0 ){
a0a0: 0a 20 20 20 20 20 20 69 66 28 20 73 20 21 3d 20  .      if( s != 
a0b0: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -1 ){.        /*
a0c0: 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70   This could happ
a0d0: 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72  en with a networ
a0e0: 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  k mount */.     
a0f0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
a100: 6f 3b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o; .        rc =
a110: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
a120: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
a130: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
a140: 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  UNLOCK); .      
a150: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
a160: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
a170: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
a180: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
a190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a1a0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
a1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a1c0: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
a1d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
a1e0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
a1f0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
a200: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
a210: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
a220: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
a230: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
a240: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
a250: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
a260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
a270: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
a280: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
a290: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
a2a0: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
a2b0: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
a2c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
a2d0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
a2e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
a2f0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
a300: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
a310: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
a320: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
a330: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
a340: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
a350: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
a360: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
a370: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
a380: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
a390: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
a3a0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
a3b0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
a3c0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
a3d0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
a3e0: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
a3f0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
a400: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
a410: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
a420: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
a430: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
a440: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
a450: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
a460: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
a470: 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63  WRLCK;.    switc
a480: 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  h( eFileLock ){.
a490: 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52        case RESER
a4a0: 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  VED_LOCK:.      
a4b0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a4c0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
a4d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a4e0: 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53       case EXCLUS
a4f0: 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  IVE_LOCK:.      
a500: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a510: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
a520: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
a530: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
a540: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a550: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
a560: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29         assert(0)
a570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
a580: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
a590: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
a5a0: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
a5b0: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
a5c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
a5d0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
a5e0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
a5f0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
a600: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
a610: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
a620: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
a630: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a640: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
a650: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a660: 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   ..#ifndef NDEBU
a670: 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  G.  /* Set up th
a680: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f  e transaction-co
a690: 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65  unter change che
a6a0: 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e  cking flags when
a6b0: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  .  ** transition
a6c0: 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45  ing from a SHARE
a6d0: 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20  D to a RESERVED 
a6e0: 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67  lock.  The chang
a6f0: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52  e.  ** from SHAR
a700: 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d  ED to RESERVED m
a710: 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69  arks the beginni
a720: 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20  ng of a normal. 
a730: 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74   ** write operat
a740: 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a  ion (not a hot j
a750: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
a760: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
a770: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
a780: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
a790: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20  k<=SHARED_LOCK. 
a7a0: 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d    && eFileLock==
a7b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20  RESERVED_LOCK.  
a7c0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  ){.    pFile->tr
a7d0: 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b  ansCntrChng = 0;
a7e0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
a7f0: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  date = 0;.    pF
a800: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
a810: 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  te = 1;.  }.#end
a820: 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  if...  if( rc==S
a830: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a840: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
a850: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
a860: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
a870: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
a880: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
a890: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
a8a0: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
a8b0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
a8c0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
a8d0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
a8e0: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
a8f0: 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f  OCK;.  }..end_lo
a900: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
a910: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
a920: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
a930: 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20  s %s (unix)\n", 
a940: 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
a950: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
a960: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
a970: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
a980: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
a990: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a9a0: 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65   Add the file de
a9b0: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79  scriptor used by
a9c0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69   file handle pFi
a9d0: 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73  le to the corres
a9e0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73  ponding.** pUnus
a9f0: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ed list..*/.stat
aa00: 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69  ic void setPendi
aa10: 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  ngFd(unixFile *p
aa20: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
aa30: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
aa40: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
aa50: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
aa60: 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  p = pFile->pUnus
aa70: 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  ed;.  p->pNext =
aa80: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
aa90: 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  ;.  pInode->pUnu
aaa0: 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65  sed = p;.  pFile
aab0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c  ->h = -1;.  pFil
aac0: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
aad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
aae0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
aaf0: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
ab00: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
ab10: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
ab20: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
ab30: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
ab40: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
ab50: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
ab60: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
ab70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
ab80: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
ab90: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
aba0: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
abb0: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
abc0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
abd0: 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e  * .** If handleN
abe0: 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65  FSUnlock is true
abf0: 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72  , then on downgr
ac00: 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  ading an EXCLUSI
ac10: 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45  VE_LOCK to SHARE
ac20: 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61  D.** the byte ra
ac30: 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69  nge is divided i
ac40: 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20  nto 2 parts and 
ac50: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69  the first part i
ac60: 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a  s unlocked then.
ac70: 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64  ** set to a read
ac80: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
ac90: 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69  other part is si
aca0: 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  mply unlocked.  
acb0: 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61  This works .** a
acc0: 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42  round a bug in B
acd0: 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c  SD NFS lockd (al
ace0: 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53  so seen on MacOS
acf0: 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61  X 10.3+) that fa
ad00: 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76  ils to .** remov
ad10: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
ad20: 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65   on a region whe
ad30: 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
ad40: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
ad50: 69 6e 74 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b  int _posixUnlock
ad60: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ad70: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
ad80: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
ad90: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
ada0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
adb0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
adc0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
add0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
ade0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
adf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ae00: 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74 45   int h;.  int tE
ae10: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
ae20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
ae30: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
ae40: 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
ae50: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
ae60: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
ae70: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
ae80: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
ae90: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
aea0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
aeb0: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
aec0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
aed0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
aee0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
aef0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
af00: 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29  .      getpid())
af10: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
af20: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
af30: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
af40: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
af50: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
af60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
af70: 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
af80: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d  erMutex();.  h =
af90: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e   pFile->h;.  pIn
afa0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
afb0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
afc0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
afd0: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
afe0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
aff0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
b000: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
b010: 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
b020: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
b030: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b040: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
b050: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
b060: 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
b070: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
b080: 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66  ign(0);..#ifndef
b090: 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
b0a0: 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
b0b0: 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
b0c0: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
b0d0: 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
b0e0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
b0f0: 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
b100: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
b110: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
b120: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
b130: 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
b140: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
b150: 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
b160: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
b170: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
b180: 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
b190: 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
b1a0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
b1b0: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
b1c0: 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
b1d0: 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
b1e0: 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
b1f0: 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
b200: 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
b210: 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
b220: 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
b230: 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
b240: 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
b250: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
b260: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ion..    */.#if 
b270: 30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  0.    assert( pF
b280: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
b290: 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  te==0.         |
b2a0: 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
b2b0: 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  e==0.         ||
b2c0: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
b2d0: 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64  rChng==1 );.#end
b2e0: 69 66 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  if.    pFile->in
b2f0: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
b300: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
b310: 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61  downgrading to a
b320: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
b330: 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65  NFS involves cle
b340: 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20  aring the write 
b350: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lock.    ** befo
b360: 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20  re establishing 
b370: 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74  the readlock - t
b380: 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63  o avoid a race c
b390: 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e  ondition we down
b3a0: 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  grade.    ** the
b3b0: 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b   lock in 2 block
b3c0: 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20  s, so that part 
b3d0: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c  of the range wil
b3e0: 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20  l be covered by 
b3f0: 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  a .    ** write 
b400: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72  lock until the r
b410: 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62  est is covered b
b420: 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20  y a read lock:. 
b430: 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57     **  1:   [WWW
b440: 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20  WW].    **  2:  
b450: 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20   [....W].    ** 
b460: 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
b470: 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52    **  4:   [RRRR
b480: 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .].    */.    if
b490: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
b4a0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66  RED_LOCK ){..#if
b4b0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c   !defined(__APPL
b4c0: 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  E__) || !SQLITE_
b4d0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
b4e0: 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64  TYLE.      (void
b4f0: 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b  )handleNFSUnlock
b500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b510: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d  handleNFSUnlock=
b520: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =0 );.#endif.#if
b530: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
b540: 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
b550: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
b560: 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e  LE.      if( han
b570: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a  dleNFSUnlock ){.
b580: 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69          off_t di
b590: 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53  vSize = SHARED_S
b5a0: 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  IZE - 1;.       
b5b0: 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   .        lock.l
b5c0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
b5d0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
b5e0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
b5f0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
b600: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
b610: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
b620: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
b630: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
b640: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
b650: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
b660: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
b670: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b680: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b690: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b6a0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b6b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b6c0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
b6d0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
b6e0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
b6f0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b700: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
b710: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b720: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
b730: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
b740: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
b750: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
b760: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
b770: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b780: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
b790: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
b7a0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
b7b0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
b7c0: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
b7d0: 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b  fcntl(h, F_SETLK
b7e0: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
b7f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
b800: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
b810: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b820: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
b830: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
b840: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
b850: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
b860: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
b870: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
b880: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
b890: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
b8a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b8b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
b8c0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
b8d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
b8e0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
b8f0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
b900: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
b910: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
b920: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
b930: 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
b940: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
b950: 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
b960: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
b970: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
b980: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
b990: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
b9a0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b9b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b9c0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b9d0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b9e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b9f0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
ba00: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
ba10: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
ba20: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
ba30: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
ba40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ba50: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
ba60: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
ba70: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
ba80: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
ba90: 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
baa0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
bab0: 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20  G_STYLE */.     
bac0: 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   {.        lock.
bad0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
bae0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
baf0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
bb00: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
bb10: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
bb20: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
bb30: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
bb40: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
bb50: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
bb60: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
bb70: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
bb80: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
bb90: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
bba0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
bbb0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
bbc0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
bbd0: 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _RDLOCK);.      
bbe0: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
bbf0: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
bc00: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
bc10: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
bc20: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
bc30: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
bc40: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
bc50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bc60: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
bc70: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
bc80: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
bc90: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
bca0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
bcb0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
bcc0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
bcd0: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
bce0: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
bcf0: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
bd00: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
bd10: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d  ETLK, &lock)!=(-
bd20: 31 29 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  1) ){.      pIno
bd30: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
bd40: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
bd50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 45   }else{.      tE
bd60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
bd70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
bd80: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
bd90: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
bda0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
bdb0: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
bdc0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
bdd0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
bde0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
bdf0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
be00: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
be10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
be20: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
be30: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
be40: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
be50: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
be60: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
be70: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
be80: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
be90: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
bea0: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
beb0: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
bec0: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
bed0: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
bee0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
bef0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
bf00: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
bf10: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
bf20: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
bf30: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
bf40: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
bf50: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
bf60: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
bf70: 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   0L;.      Simul
bf80: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
bf90: 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
bfa0: 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
bfb0: 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
bfc0: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
bfd0: 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  (0);.      if( f
bfe0: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
bff0: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
c000: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
c010: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
c020: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
c030: 65 7b 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  e{.        tErrn
c040: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
c050: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
c060: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
c070: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
c080: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
c090: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
c0a0: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
c0b0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
c0c0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
c0d0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rrno;.        }.
c0e0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
c0f0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
c100: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
c110: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
c120: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
c130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
c140: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
c150: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
c160: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
c170: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
c180: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
c190: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
c1a0: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
c1b0: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
c1c0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
c1d0: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
c1e0: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
c1f0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
c200: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
c210: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
c220: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
c230: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
c240: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
c250: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
c260: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
c270: 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e    }.  }...end_un
c280: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
c290: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
c2a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
c2b0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c2c0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
c2d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c2e0: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
c2f0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
c300: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
c310: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
c320: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
c330: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
c340: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
c350: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
c360: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
c370: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
c380: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
c390: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
c3a0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
c3b0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
c3c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
c3d0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
c3e0: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
c3f0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c400: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
c410: 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70  ck){.  return _p
c420: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
c430: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
c440: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c450: 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
c460: 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
c470: 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
c480: 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
c490: 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
c4a0: 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
c4b0: 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
c4c0: 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
c4d0: 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
c4e0: 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
c4f0: 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
c500: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
c510: 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
c520: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
c530: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
c540: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
c550: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
c560: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
c570: 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
c580: 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
c590: 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
c5a0: 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
c5b0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
c5c0: 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
c5d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
c5e0: 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
c5f0: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
c600: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
c610: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
c620: 20 20 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20    if( pFile ){. 
c630: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69     if( pFile->di
c640: 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rfd>=0 ){.      
c650: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
c660: 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  le, pFile->dirfd
c670: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
c680: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d     pFile->dirfd=
c690: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  -1;.    }.    if
c6a0: 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
c6b0: 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
c6c0: 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
c6d0: 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
c6e0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
c6f0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 23 69 66 20 4f   -1;.    }.#if O
c700: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 69 66  S_VXWORKS.    if
c710: 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a  ( pFile->pId ){.
c720: 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
c730: 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  >isDelete ){.   
c740: 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70 46 69 6c       unlink(pFil
c750: 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
c760: 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  alName);.      }
c770: 0a 20 20 20 20 20 20 76 78 77 6f 72 6b 73 52 65  .      vxworksRe
c780: 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
c790: 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 20 20 70  e->pId);.      p
c7a0: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
c7b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c7c0: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
c7d0: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
c7e0: 2d 3e 68 29 29 3b 0a 20 20 20 20 4f 70 65 6e 43  ->h));.    OpenC
c7f0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20  ounter(-1);.    
c800: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
c810: 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  le->pUnused);.  
c820: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
c830: 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
c840: 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  le));.  }.  retu
c850: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c860: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
c870: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
c880: 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
c890: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
c8a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c8b0: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29  E_OK;.  if( id )
c8c0: 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
c8d0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
c8e0: 65 20 2a 29 69 64 3b 0a 20 20 20 20 75 6e 69 78  e *)id;.    unix
c8f0: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
c900: 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  CK);.    unixEnt
c910: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69  erMutex();.    i
c920: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
c930: 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
c940: 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
c950: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
c960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
c970: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
c980: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
c990: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
c9a0: 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
c9b0: 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
c9c0: 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
c9d0: 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
c9e0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
c9f0: 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
ca00: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
ca10: 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
ca20: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
ca30: 20 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20   .      ** when 
ca40: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
ca50: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
ca60: 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64  */.      setPend
ca70: 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
ca80: 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49    }.    releaseI
ca90: 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
caa0: 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
cab0: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
cac0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
cad0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
cae0: 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}../********
caf0: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
cb00: 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
cb10: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
cb20: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
cb30: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
cb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb80: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
cb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbd0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
cbe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbf0: 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63  ****** No-op Loc
cc00: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
cc10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc20: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66  *******.**.** Of
cc30: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
cc40: 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
cc50: 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  ions available, 
cc60: 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20 74  this is by far t
cc70: 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20  he.** simplest: 
cc80: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f   locking is igno
cc90: 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74  red.  No attempt
cca0: 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b   is made to lock
ccb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
ccc0: 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
ccd0: 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  g or writing..**
cce0: 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67  .** This locking
ccf0: 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72   mode is appropr
cd00: 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20  iate for use on 
cd10: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
cd20: 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61  ses.** (ex: data
cd30: 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20 62  bases that are b
cd40: 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f  urned into CD-RO
cd50: 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29  M, for example.)
cd60: 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f    It can.** also
cd70: 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
cd80: 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c  application empl
cd90: 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61  oys some externa
cda0: 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a  l mechanism to.*
cdb0: 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74  * prevent simult
cdc0: 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66  aneous access of
cdd0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
cde0: 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72  se by two or mor
cdf0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
ce00: 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20  nnections.  But 
ce10: 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69 6f  there is a serio
ce20: 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62  us risk of datab
ce30: 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  ase.** corruptio
ce40: 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e  n if this lockin
ce50: 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69  g mode is used i
ce60: 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65  n situations whe
ce70: 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64  re multiple.** d
ce80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ce90: 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69 6e  ons are accessin
cea0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
ceb0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
cec0: 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64  same.** time and
ced0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
cee0: 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  those connection
cef0: 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a  s are writing..*
cf00: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  /..static int no
cf10: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
cf20: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
cf30: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
cf40: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e   *pResOut){.  UN
cf50: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
cf60: 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73  otUsed);.  *pRes
cf70: 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Out = 0;.  retur
cf80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
cf90: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
cfa0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
cfb0: 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
cfc0: 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
cfd0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
cfe0: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
cff0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
d000: 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
d010: 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  int nolockUnlock
d020: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
d030: 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
d040: 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
d050: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
d060: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
d070: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d080: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
d090: 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  e the file..*/.s
d0a0: 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
d0b0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
d0c0: 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75  le *id) {.  retu
d0d0: 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
d0e0: 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  (id);.}../******
d0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
d100: 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c  d of the no-op l
d110: 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
d120: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
d130: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
d140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d180: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
d190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d1b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
d1e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d1f0: 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69  *** Begin dot-fi
d200: 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  le Locking *****
d210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
d230: 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b  The dotfile lock
d240: 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
d250: 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69 73  on uses the exis
d260: 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74  tance of separat
d270: 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20  e lock.** files 
d280: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74  in order to cont
d290: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
d2a0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
d2b0: 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a  s works on just.
d2c0: 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  ** about every f
d2d0: 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
d2e0: 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
d2f0: 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
d300: 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
d310: 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
d320: 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
d330: 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
d340: 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
d350: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
d360: 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
d370: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
d380: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
d390: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
d3a0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
d3b0: 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
d3c0: 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
d3d0: 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
d3e0: 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
d3f0: 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
d400: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
d410: 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
d420: 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
d430: 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
d440: 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
d450: 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
d460: 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
d470: 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
d480: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
d490: 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
d4a0: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
d4b0: 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65  ng a file in the
d4c0: 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
d4d0: 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  as the.** databa
d4e0: 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
d4f0: 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
d500: 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
d510: 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
d520: 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   The existance o
d530: 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d  f a lock file im
d540: 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
d550: 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
d560: 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65  her lock.** type
d570: 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
d580: 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
d590: 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
d5a0: 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
d5b0: 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
d5c0: 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
d5d0: 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
d5e0: 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
d5f0: 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
d600: 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69  k file..*/.#defi
d610: 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
d620: 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
d630: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
d640: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
d650: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
d660: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
d670: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
d680: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
d690: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
d6a0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
d6b0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
d6c0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
d6d0: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
d6e0: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
d6f0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
d700: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
d710: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
d720: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
d730: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
d740: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
d750: 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
d760: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
d770: 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
d780: 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
d790: 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
d7a0: 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
d7b0: 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
d7c0: 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
d7d0: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
d7e0: 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
d7f0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
d800: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
d810: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
d820: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d830: 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
d840: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
d850: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
d860: 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
d870: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d880: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
d890: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
d8a0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
d8b0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
d8c0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
d8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
d8e0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
d8f0: 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
d900: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
d910: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
d920: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
d930: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
d940: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
d950: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d960: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
d970: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
d980: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
d990: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  r some other con
d9a0: 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  nection in the s
d9b0: 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20  ame process.    
d9c0: 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20  ** holds a lock 
d9d0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f  on the file.  No
d9e0: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   need to check f
d9f0: 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72  urther. */.    r
da00: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
da10: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
da20: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66   lock is held if
da30: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65   and only if the
da40: 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73   lockfile exists
da50: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
da60: 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
da70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69  (const char*)pFi
da80: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
da90: 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  xt;.    reserved
daa0: 20 3d 20 61 63 63 65 73 73 28 7a 4c 6f 63 6b 46   = access(zLockF
dab0: 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a  ile, 0)==0;.  }.
dac0: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
dad0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
dae0: 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20  d (dotlock)\n", 
daf0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
db00: 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65  served));.  *pRe
db10: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
db20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
db30: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
db40: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
db50: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
db60: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
db70: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
db80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
db90: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
dba0: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
dbb0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
dbc0: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
dbd0: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
dbe0: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
dbf0: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
dc00: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
dc10: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
dc20: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
dc30: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
dc40: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
dc50: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
dc60: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
dc70: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
dc80: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
dc90: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
dca0: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
dcb0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
dcc0: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
dcd0: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
dce0: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
dcf0: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
dd00: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
dd10: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
dd20: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
dd30: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
dd40: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
dd50: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
dd60: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
dd70: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
dd80: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
dd90: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
dda0: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
ddb0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
ddc0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
ddd0: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
dde0: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
ddf0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
de00: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
de10: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
de20: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
de30: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
de40: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
de50: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74  ..**.** With dot
de60: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65  file locking, we
de70: 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70   really only sup
de80: 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20  port state (4): 
de90: 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75  EXCLUSIVE..** Bu
dea0: 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f  t we track the o
deb0: 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  ther locking lev
dec0: 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  els internally..
ded0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
dee0: 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  tlockLock(sqlite
def0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
df00: 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
df10: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
df20: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
df30: 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72    int fd;.  char
df40: 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
df50: 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
df60: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
df70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
df80: 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  K;...  /* If we 
df90: 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74  have any lock, t
dfa0: 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  hen the lock fil
dfb0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
dfc0: 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20  .  All we have. 
dfd0: 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a   ** to do is adj
dfe0: 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ust our internal
dff0: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c   record of the l
e000: 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a  ock level..  */.
e010: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
e020: 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
e030: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
e040: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
e050: 4c 6f 63 6b 3b 0a 23 69 66 20 21 4f 53 5f 56 58  Lock;.#if !OS_VX
e060: 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77  WORKS.    /* Alw
e070: 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
e080: 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
e090: 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
e0a0: 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
e0b0: 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
e0c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e0d0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
e0e0: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
e0f0: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64  ive lock */.  fd
e100: 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c   = open(zLockFil
e110: 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45  e,O_RDONLY|O_CRE
e120: 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b  AT|O_EXCL,0600);
e130: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
e140: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
e150: 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
e160: 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  file, someone el
e170: 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c  se may have stol
e180: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  en the lock */. 
e190: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
e1a0: 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
e1b0: 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
e1c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
e1d0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
e1e0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
e1f0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
e200: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
e210: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
e220: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
e230: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
e240: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
e250: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e260: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
e270: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
e280: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 72  urn rc;.  } .  r
e290: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
e2a0: 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  e, fd, __LINE__)
e2b0: 3b 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74  ;.  .  /* got it
e2c0: 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
e2d0: 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
e2e0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
e2f0: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
e300: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e310: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
e320: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
e330: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e340: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
e350: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
e360: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
e370: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
e380: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
e390: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
e3a0: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
e3b0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
e3c0: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
e3d0: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
e3e0: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
e3f0: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
e400: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
e410: 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69  * When the locki
e420: 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73  ng level reaches
e430: 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65   NO_LOCK, delete
e440: 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a   the lock file..
e450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
e460: 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  tlockUnlock(sqli
e470: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
e480: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
e490: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
e4a0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
e4b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
e4c0: 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
e4d0: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
e4e0: 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ext;..  assert( 
e4f0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
e500: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
e510: 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
e520: 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
e530: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
e540: 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65  ck,..   pFile->e
e550: 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
e560: 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
e570: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
e580: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
e590: 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
e5a0: 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
e5b0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
e5c0: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
e5d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e5e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
e5f0: 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
e600: 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
e610: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
e620: 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
e630: 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
e640: 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
e650: 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
e660: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
e670: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
e680: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
e690: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
e6a0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
e6b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e6c0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
e6d0: 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
e6e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
e6f0: 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
e700: 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
e710: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
e720: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  OCK );.  if( unl
e730: 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29  ink(zLockFile) )
e740: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30  {.    int rc = 0
e750: 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
e760: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
e770: 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72  ( ENOENT != tErr
e780: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  no ){.      rc =
e790: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
e7a0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
e7b0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
e7c0: 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20  UNLOCK);.    }. 
e7d0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e7e0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
e7f0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e800: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
e810: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
e820: 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
e830: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
e840: 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
e850: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e860: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20  * Close a file. 
e870: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
e880: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c  ock has been rel
e890: 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f  eased before clo
e8a0: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
e8b0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  int dotlockClose
e8c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
e8d0: 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  d) {.  int rc;. 
e8e0: 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
e8f0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e900: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e910: 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63      dotlockUnloc
e920: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
e930: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e940: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
e950: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72  ontext);.  }.  r
e960: 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
e970: 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(id);.  return 
e980: 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}./*********
e990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
e9a0: 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
e9b0: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
e9c0: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
e9d0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
e9e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea20: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
ea30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea70: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
ea80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea90: 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
eaa0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
eab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eac0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
ead0: 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
eae0: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
eaf0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
eb00: 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
eb10: 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
eb20: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
eb30: 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
eb40: 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
eb50: 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
eb60: 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
eb70: 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
eb80: 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
eb90: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
eba0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
ebb0: 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
ebc0: 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
ebd0: 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
ebe0: 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
ebf0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
ec00: 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
ec10: 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
ec20: 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
ec30: 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
ec40: 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
ec50: 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
ec60: 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
ec70: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
ec80: 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
ec90: 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
eca0: 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
ecb0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
ecc0: 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20  E is turned off 
ecd0: 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69  or if.** compili
ece0: 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a  ng for VXWORKS..
ecf0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
ed00: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
ed10: 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
ed20: 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  S../*.** Retry f
ed30: 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61  lock() calls tha
ed40: 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54  t fail with EINT
ed50: 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54  R.*/.#ifdef EINT
ed60: 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  R.static int rob
ed70: 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64  ust_flock(int fd
ed80: 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74  , int op){.  int
ed90: 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
eda0: 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77  flock(fd,op); }w
edb0: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
edc0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
edd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
ede0: 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75  se.# define robu
edf0: 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c  st_flock(a,b) fl
ee00: 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a  ock(a,b).#endif.
ee10: 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69       ../*.** Thi
ee20: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
ee30: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
ee40: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
ee50: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
ee60: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
ee70: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
ee80: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
ee90: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
eea0: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
eeb0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
eec0: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
eed0: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
eee0: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
eef0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
ef00: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
ef10: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
ef20: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
ef30: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
ef40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ef50: 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
ef60: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
ef70: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
ef80: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
ef90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
efa0: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
efb0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
efc0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
efd0: 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
efe0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
eff0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
f000: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
f010: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
f020: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
f030: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
f040: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
f050: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
f060: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
f070: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f080: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
f090: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
f0a0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
f0b0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
f0c0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
f0d0: 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
f0e0: 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
f0f0: 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
f100: 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
f110: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
f120: 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
f130: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
f140: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
f150: 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
f160: 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
f170: 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
f180: 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62  .      lrc = rob
f190: 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
f1a0: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
f1b0: 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
f1c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
f1d0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f1e0: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
f1f0: 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
f200: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
f210: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
f220: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
f230: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
f240: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
f250: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
f260: 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
f270: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
f280: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f290: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f2a0: 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
f2b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f2c0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
f2d0: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
f2e0: 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
f2f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
f300: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
f310: 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
f320: 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
f330: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
f340: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
f350: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
f360: 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
f370: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
f380: 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
f390: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f3a0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
f3b0: 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
f3c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f3d0: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
f3e0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
f3f0: 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
f400: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
f410: 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20  rved));..#ifdef 
f420: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
f430: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
f440: 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
f450: 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
f460: 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
f470: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f480: 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
f490: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
f4a0: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
f4b0: 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
f4c0: 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
f4d0: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
f4e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
f4f0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
f500: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
f510: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
f520: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
f530: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
f540: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
f550: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
f560: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
f570: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
f580: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
f590: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
f5a0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
f5b0: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
f5c0: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
f5d0: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
f5e0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
f5f0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
f600: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
f610: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
f620: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
f630: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
f640: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
f650: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
f660: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
f670: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
f680: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
f690: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
f6a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
f6b0: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
f6c0: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
f6d0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
f6e0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
f6f0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
f700: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
f710: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
f720: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
f730: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
f740: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
f750: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
f760: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
f770: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
f780: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
f790: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
f7a0: 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
f7b0: 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
f7c0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
f7d0: 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
f7e0: 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
f7f0: 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
f800: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
f810: 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
f820: 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
f830: 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
f840: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
f850: 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
f860: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
f870: 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
f880: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
f890: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
f8a0: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
f8b0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
f8c0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
f8d0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
f8e0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
f8f0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
f900: 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
f910: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f920: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
f930: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f940: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
f950: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
f960: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
f970: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
f980: 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
f990: 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
f9a0: 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
f9b0: 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
f9c0: 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
f9d0: 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
f9e0: 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
f9f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
fa00: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
fa10: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
fa20: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
fa30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fa40: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
fa50: 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
fa60: 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
fa70: 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
fa80: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
fa90: 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20   LOCK_NB)) {.   
faa0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
fab0: 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e  rno;.    /* didn
fac0: 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20  't get, must be 
fad0: 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d  busy */.    rc =
fae0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
faf0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
fb00: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
fb10: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
fb20: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
fb30: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
fb40: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
fb50: 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  rno;.    }.  } e
fb60: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74  lse {.    /* got
fb70: 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
fb80: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
fb90: 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  */.    pFile->eF
fba0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
fbb0: 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ock;.  }.  OSTRA
fbc0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
fbd0: 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22  %s %s (flock)\n"
fbe0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
fbf0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
fc00: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72  ), .           r
fc10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
fc20: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
fc30: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fc40: 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
fc50: 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
fc60: 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
fc70: 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
fc80: 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
fc90: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
fca0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fcb0: 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
fcc0: 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72  CK_ERRORS */.  r
fcd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
fce0: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
fcf0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
fd00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
fd10: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
fd20: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
fd30: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
fd40: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
fd50: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
fd60: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
fd70: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
fd80: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
fd90: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
fda0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
fdb0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
fdc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fdd0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
fde0: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c  tic int flockUnl
fdf0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
fe00: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
fe10: 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
fe20: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fe30: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61  File*)id;.  .  a
fe40: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
fe50: 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
fe60: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
fe70: 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c   pid=%d (flock)\
fe80: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
fe90: 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
fea0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
feb0: 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
fec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
fed0: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
fee0: 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
fef0: 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
ff00: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
ff10: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
ff20: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
ff30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ff40: 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
ff50: 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
ff60: 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
ff70: 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
ff80: 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
ff90: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ffa0: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
ffb0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
ffc0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
ffd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ffe0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
fff0: 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
10000 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 6f  */.  int rc = ro
10010 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
10020 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
10030 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 69   if (rc) {.    i
10040 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65  nt r, tErrno = e
10050 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71  rrno;.    r = sq
10060 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10070 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
10080 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10090 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
100a0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29 20 29  _LOCK_ERROR(r) )
100b0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
100c0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
100d0 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  o;.    }.#ifdef 
100e0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
100f0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
10100 20 20 20 20 69 66 28 20 28 72 20 26 20 53 51 4c      if( (r & SQL
10110 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
10120 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
10130 20 20 20 20 72 20 3d 20 53 51 4c 49 54 45 5f 42      r = SQLITE_B
10140 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  USY;.    }.#endi
10150 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
10160 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
10170 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20 20 20  RORS */.    .   
10180 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65   return r;.  } e
10190 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  lse {.    pFile-
101a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
101b0 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
101c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
101d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
101e0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
101f0 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28   int flockClose(
10200 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10210 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
10220 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28      flockUnlock(
10230 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
10240 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  }.  return close
10250 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
10260 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10270 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
10280 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
10290 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  WORK */../******
102a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
102b0 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c  d of the flock l
102c0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
102d0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
102e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
102f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10330 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
10340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10380 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103a0 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53  ** Begin Named S
103b0 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67  emaphore Locking
103c0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
103e0 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
103f0 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
10400 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57  supported on VxW
10410 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  orks..**.** Sema
10420 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
10430 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61   like dot-lock a
10440 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74  nd flock in that
10450 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a   it really only.
10460 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c  ** supports EXCL
10470 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20  USIVE locking.  
10480 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  Only a single pr
10490 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f  ocess can read o
104a0 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64  r write.** the d
104b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
104c0 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65  a time.  This re
104d0 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20  duces potential 
104e0 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74  concurrency, but
104f0 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f  .** makes the lo
10500 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
10510 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a  n much easier..*
10520 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
10530 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10540 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
10550 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
10560 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
10570 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
10580 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
10590 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
105a0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
105b0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
105c0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
105d0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
105e0 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
105f0 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
10600 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
10610 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
10620 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
10630 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
10640 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
10650 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
10660 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68  static int semCh
10670 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
10680 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10690 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
106a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
106b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
106c0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
106d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
106e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
106f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
10700 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
10710 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
10720 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
10730 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10740 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
10750 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
10760 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
10770 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
10780 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
10790 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
107a0 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
107b0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
107c0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
107d0 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
107e0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
107f0 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
10800 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f  rved ){.    sem_
10810 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
10820 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
10830 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
10840 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28  tatBuf;..    if(
10850 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
10860 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
10870 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10880 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
10890 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
108a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
108b0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
108c0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
108d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
108e0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
108f0 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
10900 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10910 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  rno;.      } els
10920 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
10930 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
10940 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
10950 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
10960 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
10970 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46  ved = (pFile->eF
10980 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44  ileLock < SHARED
10990 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
109a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
109b0 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76   /* we could hav
109c0 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
109d0 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f  it */.      sem_
109e0 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20  post(pSem);.    
109f0 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
10a00 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
10a10 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22  d %d %d (sem)\n"
10a20 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
10a30 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
10a40 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
10a50 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
10a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
10a70 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
10a80 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
10a90 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
10aa0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
10ab0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
10ac0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
10ad0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
10ae0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
10af0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
10b00 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
10b10 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
10b20 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
10b30 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
10b40 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
10b50 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
10b60 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
10b70 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
10b80 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
10b90 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
10ba0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
10bb0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
10bc0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
10bd0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
10be0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
10bf0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
10c00 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
10c10 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
10c20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
10c30 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
10c40 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
10c50 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
10c60 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
10c70 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
10c80 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
10c90 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
10ca0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
10cb0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
10cc0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
10cd0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
10ce0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
10cf0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
10d00 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
10d10 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d  LUSIVE.**.** Sem
10d20 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c  aphore locks onl
10d30 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
10d40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
10d50 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
10d60 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
10d70 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
10d80 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
10d90 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
10da0 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
10db0 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
10dc0 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
10dd0 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
10de0 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
10df0 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
10e00 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
10e10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
10e20 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
10e30 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
10e40 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
10e50 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
10e60 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
10e70 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
10e80 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28  tic int semLock(
10e90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10ea0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
10eb0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
10ec0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10ed0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a  *)id;.  int fd;.
10ee0 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
10ef0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
10f00 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sem;.  int rc = 
10f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
10f20 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
10f30 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
10f40 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
10f50 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
10f60 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
10f70 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
10f80 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
10f90 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
10fa0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
10fb0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
10fc0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  eLock;.    rc = 
10fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
10fe0 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
10ff0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
11000 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
11010 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
11020 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
11030 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
11040 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
11050 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
11060 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
11070 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
11080 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
11090 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
110a0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
110b0 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
110c0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
110d0 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
110e0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
110f0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
11100 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11110 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
11120 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
11130 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
11140 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
11150 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
11160 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
11170 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
11180 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
11190 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
111a0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
111b0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
111c0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
111d0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
111e0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
111f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55  .static int semU
11200 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
11210 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
11220 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
11230 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11240 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
11250 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
11260 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
11270 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11280 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
11290 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
112a0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
112b0 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
112c0 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
112d0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20  h, eFileLock,.. 
112e0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
112f0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
11300 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
11310 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
11320 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
11330 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
11340 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11350 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
11360 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
11370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11380 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
11390 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
113a0 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
113b0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
113c0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
113d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
113e0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
113f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
11400 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
11410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11420 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
11430 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  ally unlock. */.
11440 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28    if ( sem_post(
11450 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20  pSem)==-1 ) {.  
11460 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f    int rc, tErrno
11470 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
11480 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
11490 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
114a0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
114b0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
114c0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
114d0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
114e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
114f0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11500 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
11510 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
11520 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
11530 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11540 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
11550 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
11560 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
11570 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
11580 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
11590 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
115a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
115b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
115c0 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
115d0 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
115e0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
115f0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
11600 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
11610 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
11620 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
11630 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
11640 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
11650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11660 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
11670 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
11680 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
11690 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
116a0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
116b0 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
116c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
116d0 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
116e0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
116f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
11700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
11710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
11760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
117b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
117d0 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
117e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11800 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
11810 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
11820 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
11830 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
11840 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
11850 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
11860 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
11870 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
11880 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
11890 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
118a0 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
118b0 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
118c0 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
118d0 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
118e0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
118f0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
11900 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11910 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
11920 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
11930 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
11940 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
11950 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
11960 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
11970 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
11980 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
11990 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
119a0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
119b0 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
119c0 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
119d0 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
119e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
119f0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
11a00 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
11a10 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
11a20 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
11a30 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
11a40 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
11a50 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
11a60 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
11a70 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
11a80 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
11a90 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
11aa0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
11ab0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
11ac0 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
11ad0 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
11ae0 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
11af0 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
11b00 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
11b10 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
11b20 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
11b30 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
11b40 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
11b50 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
11b60 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
11b70 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
11b80 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
11bb0 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
11bc0 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
11bd0 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
11be0 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
11bf0 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
11c00 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
11c10 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
11c20 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
11c30 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
11c40 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
11c50 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
11c60 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
11c70 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
11c80 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
11c90 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
11ca0 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
11cb0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
11cc0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
11cd0 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
11ce0 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
11cf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
11d00 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
11d10 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
11d20 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
11d30 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
11d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
11d50 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11d60 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
11d70 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
11d80 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
11d90 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
11da0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
11db0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
11dc0 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
11dd0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
11de0 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
11df0 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
11e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11e10 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
11e20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
11e30 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
11e40 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
11e50 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
11e60 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
11e70 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
11e80 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
11e90 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
11ea0 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
11eb0 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
11ec0 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
11ed0 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
11ee0 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
11ef0 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
11f00 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
11f10 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
11f20 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
11f30 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
11f40 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
11f50 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
11f60 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
11f70 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29  offset, length))
11f80 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
11f90 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
11fa0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
11fb0 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
11fc0 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
11fd0 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
11fe0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
11ff0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46      OSTRACE(("AF
12000 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
12010 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
12020 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
12030 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
12040 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
12050 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20  rrno)));.#ifdef 
12060 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
12070 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  P_LOCK_ERRORS.  
12080 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
12090 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63  SY;.#else.    rc
120a0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
120b0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
120c0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
120d0 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b           setLock
120e0 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Flag ? SQLITE_IO
120f0 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54  ERR_LOCK : SQLIT
12100 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
12110 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12120 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
12130 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
12140 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12150 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
12160 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12170 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
12180 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12190 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
121a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
121b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
121c0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
121d0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
121e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
121f0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
12200 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
12210 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
12220 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
12230 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
12240 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
12250 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
12260 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
12270 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
12280 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
12290 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
122a0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
122b0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
122c0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
122d0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
122e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
122f0 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
12300 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
12310 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
12320 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
12330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12340 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
12350 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12360 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12370 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
12380 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
12390 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
123a0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
123b0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
123c0 70 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f  pFile );.  afpLo
123d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
123e0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
123f0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
12400 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
12410 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65  ext;.  if( conte
12420 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
12430 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
12440 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12450 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
12460 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
12470 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
12480 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
12490 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
124a0 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
124b0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
124c0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
124d0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
124e0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
124f0 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
12500 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
12510 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
12520 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
12530 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
12540 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
12550 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
12560 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
12570 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
12580 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
12590 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
125a0 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
125b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
125c0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
125d0 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
125e0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
125f0 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
12600 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
12610 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
12620 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
12630 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
12640 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
12650 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
12660 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
12670 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
12680 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
12690 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
126a0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
126b0 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
126c0 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
126d0 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
126e0 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
126f0 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
12700 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
12710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12720 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12730 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
12740 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
12750 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
12760 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
12770 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12780 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c   %d %d (afp)\n",
12790 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
127a0 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20  eserved));.  .  
127b0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
127c0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
127d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
127e0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
127f0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12800 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
12810 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
12820 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12830 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
12840 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
12850 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
12860 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
12870 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
12880 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
12890 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
128a0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
128b0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
128c0 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
128d0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
128e0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
128f0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
12900 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
12910 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
12920 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
12930 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
12940 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
12950 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
12960 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
12970 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
12980 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
12990 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
129a0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
129b0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
129c0 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
129d0 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
129e0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
129f0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
12a00 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
12a10 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
12a20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
12a30 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
12a40 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
12a50 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12a60 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12a70 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
12a80 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
12a90 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
12aa0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
12ab0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
12ac0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
12ad0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
12ae0 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
12af0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
12b00 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
12b10 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12b20 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
12b30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12b40 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
12b50 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12b60 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
12b70 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
12b80 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
12b90 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
12ba0 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
12bb0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
12bc0 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
12bd0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
12be0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12bf0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
12c00 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
12c10 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
12c20 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
12c30 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
12c40 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
12c50 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
12c60 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
12c70 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
12c80 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
12c90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
12ca0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
12cb0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
12cc0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
12cd0 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
12ce0 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
12cf0 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
12d00 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46  n the.  ** unixF
12d10 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
12d20 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61   Don't use the a
12d30 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  fp_end_lock: exi
12d40 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
12d50 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
12d60 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
12d70 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
12d80 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12d90 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
12da0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
12db0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
12dc0 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
12dd0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
12de0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
12df0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
12e00 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
12e10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12e20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
12e30 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
12e40 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
12e50 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20  ct.  **  (1) We 
12e60 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20  never move from 
12e70 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74  unlocked to anyt
12e80 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e  hing higher than
12e90 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20   shared lock..  
12ea0 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e  **  (2) SQLite n
12eb0 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  ever explicitly 
12ec0 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69  requests a pendi
12ed0 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33  g lock..  **  (3
12ee0 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ) A shared lock 
12ef0 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77  is always held w
12f00 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f  hen a reserve lo
12f10 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  ck is requested.
12f20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12f30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12f40 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  !=NO_LOCK || eFi
12f50 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
12f60 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
12f70 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44   eFileLock!=PEND
12f80 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
12f90 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
12fa0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
12fb0 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  | pFile->eFileLo
12fc0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
12fd0 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
12fe0 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
12ff0 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
13000 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
13010 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
13020 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
13030 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
13040 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
13050 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
13060 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
13070 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
13080 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
13090 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
130a0 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
130b0 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
130c0 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
130d0 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
130e0 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
130f0 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
13100 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
13110 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
13120 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
13130 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
13140 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
13150 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53     ){.    rc = S
13160 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
13170 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
13180 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  k;.  }.  .  /* I
13190 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
131a0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
131b0 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
131c0 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
131d0 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
131e0 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
131f0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
13200 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
13210 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
13220 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
13230 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
13240 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
13250 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28  _LOCK && .     (
13260 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
13270 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
13280 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
13290 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
132a0 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
132b0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
132c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
132d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
132e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
132f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
13300 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
13310 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13320 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
13330 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
13340 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
13350 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
13360 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
13370 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20  d_lock;.  }.    
13380 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
13390 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
133a0 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
133b0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
133c0 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
133d0 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
133e0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
133f0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
13400 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
13410 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
13420 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ed..  */.  if( e
13430 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
13440 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
13450 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
13460 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
13470 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
13480 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
13490 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
134a0 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61  ;.    failed = a
134b0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
134c0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
134d0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
134e0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
134f0 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
13500 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
13510 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
13520 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
13530 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f   .  /* If contro
13540 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
13550 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
13560 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
13570 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
13580 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
13590 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
135a0 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
135b0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
135c0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
135d0 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63     int lrc1, lrc
135e0 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20  2, lrc1Errno;.  
135f0 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
13600 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
13610 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
13620 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
13630 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
13640 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
13650 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
13660 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
13670 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
13680 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
13690 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
136a0 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
136b0 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
136c0 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
136d0 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
136e0 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
136f0 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
13700 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
13710 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
13720 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
13730 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
13740 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
13750 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
13760 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13770 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13780 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
13790 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
137a0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
137b0 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
137c0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
137d0 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
137e0 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
137f0 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
13800 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
13810 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
13820 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
13830 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
13840 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
13850 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
13860 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
13870 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13880 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
13890 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
138a0 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e  Errno = lrc1Errn
138b0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  o;.      rc = lr
138c0 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
138d0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
138e0 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
138f0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
13900 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
13910 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
13920 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
13930 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
13940 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
13950 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
13960 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
13970 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
13980 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
13990 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
139a0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
139b0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
139c0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
139d0 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
139e0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
139f0 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
13a00 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
13a10 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
13a20 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
13a30 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
13a40 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
13a50 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
13a60 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
13a70 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
13a80 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
13a90 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
13aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
13ab0 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
13ac0 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
13ad0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
13ae0 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
13af0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
13b00 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
13b10 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
13b20 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
13b30 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
13b40 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
13b50 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
13b60 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
13b70 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
13b80 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
13b90 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
13ba0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13bb0 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
13bc0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
13bd0 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
13be0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
13bf0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
13c00 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
13c10 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
13c20 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
13c30 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
13c40 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
13c50 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
13c60 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
13c70 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
13c80 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
13c90 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
13ca0 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
13cb0 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
13cc0 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
13cd0 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
13ce0 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
13cf0 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
13d00 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
13d10 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
13d20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
13d30 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
13d40 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
13d50 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
13d60 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
13d70 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
13d80 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
13d90 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
13da0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
13db0 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
13dc0 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
13dd0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
13de0 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
13df0 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
13e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13e10 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
13e20 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
13e30 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
13e40 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
13e50 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
13e60 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
13e70 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
13e80 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
13eb0 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
13ec0 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
13ed0 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
13ee0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13ef0 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
13f20 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
13f30 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
13f40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
13f50 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
13f60 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
13f70 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
13f80 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
13f90 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
13fa0 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
13fb0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
13fc0 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
13fd0 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
13fe0 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
13ff0 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
14000 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14010 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
14020 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
14030 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
14040 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
14050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14060 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
14070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14080 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
14090 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
140a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
140b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
140c0 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
140d0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
140e0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
140f0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
14100 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
14110 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
14120 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
14130 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
14140 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
14150 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
14160 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
14170 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
14180 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f   }.  .afp_end_lo
14190 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
141a0 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
141b0 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
141c0 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70  s %s (afp)\n", p
141d0 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
141e0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
141f0 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
14200 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
14210 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
14220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14230 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
14240 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
14250 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
14260 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
14270 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
14280 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
14290 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
142a0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
142b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
142c0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
142d0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
142e0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
142f0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
14300 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
14310 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14320 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
14330 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
14340 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14350 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14360 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
14370 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
14380 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14390 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
143a0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
143b0 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
143c0 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
143d0 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
143e0 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
143f0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
14400 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
14410 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
14420 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
14430 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
14440 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
14450 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
14460 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
14470 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
14480 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
14490 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
144a0 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
144b0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
144c0 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
144d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
144e0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
144f0 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
14500 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
14510 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
14520 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
14530 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
14540 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
14550 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
14560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14570 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
14580 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
14590 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
145a0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
145b0 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
145c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
145d0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
145e0 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
145f0 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
14600 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
14610 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
14620 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
14630 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
14640 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
14650 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
14660 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
14670 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20  );.    .#ifndef 
14680 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  NDEBUG.    /* Wh
14690 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
146a0 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
146b0 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
146c0 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
146d0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
146e0 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
146f0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
14700 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
14710 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
14720 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
14730 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
14740 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
14750 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
14760 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
14770 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
14780 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
14790 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
147a0 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
147b0 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
147c0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
147d0 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
147e0 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
147f0 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
14800 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
14810 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
14820 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
14830 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
14840 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
14850 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
14860 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
14870 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
14880 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
14890 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a  le->dbUpdate==0.
148a0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
148b0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
148c0 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69  ng==1 );.    pFi
148d0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
148e0 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
148f0 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65    .    if( pFile
14900 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ->eFileLock==EXC
14910 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
14920 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
14930 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
14940 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
14950 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45  RED_FIRST, SHARE
14960 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
14970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14980 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
14990 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
149a0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
149b0 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  d>1) ){.        
149c0 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62  /* only re-estab
149d0 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
149e0 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72  lock if necessar
149f0 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
14a00 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
14a10 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
14a20 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
14a30 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e;.        rc = 
14a40 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
14a50 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
14a60 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
14a70 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 1, 1);.      
14a80 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
14a90 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b   skipShared = 1;
14aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14ab0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14ac0 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
14ad0 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
14ae0 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  G_LOCK ){.      
14af0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
14b00 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
14b10 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
14b20 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
14b30 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   } .    if( rc==
14b40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
14b50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52  le->eFileLock>=R
14b60 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
14b70 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
14b80 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
14b90 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
14ba0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
14bb0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
14bc0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
14bd0 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20  f( !rc ){ .     
14be0 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
14bf0 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20  rved = 0; .     
14c00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14c10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14c20 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
14c30 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
14c40 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29  ode->nShared>1))
14c50 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
14c60 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
14c70 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
14c80 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14c90 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c  ITE_OK && eFileL
14ca0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock==NO_LOCK ){.
14cb0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
14cc0 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
14cd0 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
14ce0 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
14cf0 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
14d00 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
14d10 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
14d20 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
14d30 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
14d40 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
14d50 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e     */.    unsign
14d60 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
14d70 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
14d80 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
14d90 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
14da0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
14db0 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
14dc0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
14dd0 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61   ){.      Simula
14de0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
14df0 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
14e00 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
14e10 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
14e20 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
14e30 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73  0);.      if( !s
14e40 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20  kipShared ){.   
14e50 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
14e60 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
14e70 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
14e80 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
14e90 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
14ea0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
14eb0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
14ec0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
14ed0 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
14ee0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
14ef0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
14f00 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
14f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14f20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
14f30 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  --;.      assert
14f40 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ( pInode->nLock>
14f50 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
14f60 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
14f70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
14f80 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
14f90 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
14fa0 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
14fb0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
14fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14fd0 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
14fe0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14ff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15000 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
15010 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46  ile & cleanup AF
15020 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  P specific locki
15030 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73  ng context .*/.s
15040 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f  tatic int afpClo
15050 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
15060 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
15070 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15080 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
15090 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
150a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
150b0 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20    afpUnlock(id, 
150c0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e  NO_LOCK);.    un
150d0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
150e0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
150f0 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e  Inode && pFile->
15100 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
15110 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
15120 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
15130 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
15140 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
15150 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
15160 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
15170 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
15180 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
15190 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
151a0 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
151b0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
151c0 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e  Inode->aPending.
151d0 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
151e0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
151f0 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  d when.      ** 
15200 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
15210 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
15220 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64  */.      setPend
15230 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
15240 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49    }.    releaseI
15250 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
15260 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15270 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
15280 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63  Context);.    rc
15290 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
152a0 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  (id);.    unixLe
152b0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
152c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
152d0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
152e0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
152f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
15300 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
15310 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
15320 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
15330 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
15340 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
15350 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
15360 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
15370 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
15380 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
15390 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
153a0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
153b0 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
153c0 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
153d0 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
153e0 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
153f0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
15400 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
15410 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
15420 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
15430 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15450 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
15460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154a0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154f0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
15500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15510 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
15520 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
15530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15540 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
15550 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
15560 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
15570 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
15580 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
15590 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
155a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
155b0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
155c0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
155d0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
155e0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
155f0 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
15600 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
15610 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
15620 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
15630 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
15640 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
15650 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
15660 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
15670 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
15680 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
15690 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
156a0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
156b0 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
156c0 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64   _posixUnlock(id
156d0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
156e0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
156f0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
15700 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
15710 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
15720 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
15730 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
15740 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
15750 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
15760 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
15770 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
15780 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
15790 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
157a0 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
157b0 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
157c0 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
157d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157e0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
157f0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
15800 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
15810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
15820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
15870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
158c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
158d0 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
158e0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
158f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
15910 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
15920 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
15930 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
15940 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
15950 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
15960 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
15970 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
15980 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
15990 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
159a0 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
159b0 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
159c0 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
159d0 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
159e0 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
159f0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
15a00 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
15a10 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
15a20 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
15a30 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
15a40 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
15a50 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
15a60 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
15a70 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
15a80 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
15a90 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
15aa0 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
15ab0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
15ac0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
15ad0 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
15ae0 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
15af0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
15b00 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
15b10 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
15b20 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
15b30 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
15b40 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
15b50 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
15b60 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
15b70 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
15b80 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
15b90 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
15ba0 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20  ** any any form 
15bb0 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
15bc0 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
15bd0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
15be0 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
15bf0 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
15c00 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
15c10 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
15c20 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
15c30 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
15c40 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
15c50 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
15c60 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
15c70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15c80 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
15c90 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
15ca0 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
15cb0 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
15cc0 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
15cd0 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
15ce0 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
15cf0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
15d00 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
15d10 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
15d20 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
15d30 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
15d40 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 70 72  ).  do{ got = pr
15d50 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
15d60 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d   cnt, offset); }
15d70 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
15d80 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
15d90 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15da0 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
15db0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
15dc0 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
15dd0 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28 69 64  got = pread64(id
15de0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
15df0 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28  offset); }while(
15e00 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
15e10 3d 45 49 4e 54 52 20 29 3b 0a 20 20 53 69 6d 75  =EINTR );.  Simu
15e20 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
15e30 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
15e40 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
15e50 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
15e60 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53  , SEEK_SET);.  S
15e70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
15e80 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
15e90 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
15ea0 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
15eb0 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
15ec0 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
15ed0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
15ee0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15f00 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
15f10 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
15f20 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
15f30 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f  urn -1;.  }.  do
15f40 7b 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d  { got = read(id-
15f50 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 20  >h, pBuf, cnt); 
15f60 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
15f70 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
15f80 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
15f90 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
15fa0 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
15fb0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
15fc0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
15fd0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
15fe0 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
15ff0 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
16000 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
16010 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
16020 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
16030 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
16040 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
16050 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
16060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
16070 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
16080 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
16090 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
160a0 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
160b0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
160c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
160d0 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69  unixRead(.  sqli
160e0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
160f0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
16100 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
16110 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a  e3_int64 offset.
16120 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
16130 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16140 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74   *)id;.  int got
16150 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
16160 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
16170 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
16180 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
16190 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
161a0 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
161b0 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
161c0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
161d0 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
161e0 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
161f0 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
16200 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
16210 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
16220 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
16230 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
16240 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
16250 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
16260 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20   .  );.#endif.. 
16270 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
16280 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
16290 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
162a0 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
162b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
162c0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
162d0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
162e0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
162f0 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
16300 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
16310 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
16320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
16330 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
16340 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
16350 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
16360 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
16370 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
16380 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
16390 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
163a0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
163b0 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
163c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
163d0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
163e0 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
163f0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
16400 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
16410 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
16420 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
16430 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
16440 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16450 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
16460 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
16470 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
16480 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
16490 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
164a0 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
164b0 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
164c0 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
164d0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
164e0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
164f0 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
16500 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
16510 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
16520 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
16530 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21   int got;.#if (!
16540 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
16550 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
16560 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
16570 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
16580 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
16590 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  RT;.#if defined(
165a0 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b  USE_PREAD).  do{
165b0 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64   got = pwrite(id
165c0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
165d0 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28  offset); }while(
165e0 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
165f0 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20  =EINTR );.#elif 
16600 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
16610 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  D64).  do{ got =
16620 20 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c   pwrite64(id->h,
16630 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
16640 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  et); }while( got
16650 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
16660 54 52 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65  TR );.#else.  ne
16670 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
16680 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
16690 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20  EEK_SET);.  if( 
166a0 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
166b0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77  t ){.    if( new
166c0 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a  Offset == -1 ){.
166d0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
166e0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
166f0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65   = errno;.    }e
16700 6c 73 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  lse{.      ((uni
16710 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
16720 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20  Errno = 0;....  
16730 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d    }.    return -
16740 31 3b 0a 20 20 7d 0a 20 20 64 6f 7b 20 67 6f 74  1;.  }.  do{ got
16750 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20   = write(id->h, 
16760 70 42 75 66 2c 20 63 6e 74 29 3b 20 7d 77 68 69  pBuf, cnt); }whi
16770 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
16780 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
16790 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
167a0 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
167b0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
167c0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
167d0 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f   errno;.  }..  O
167e0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20  STRACE(("WRITE  
167f0 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
16800 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
16810 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
16820 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
16830 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a  return got;.}...
16840 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
16850 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
16860 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
16870 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16880 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
16890 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
168a0 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
168b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
168c0 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
168d0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
168e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
168f0 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
16900 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
16910 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
16920 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
16930 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
16940 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
16950 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
16960 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
16970 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
16980 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
16990 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
169a0 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
169b0 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
169c0 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
169d0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
169e0 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
169f0 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
16a00 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
16a10 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
16a20 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20  Unused==0.      
16a30 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44   || offset>=PEND
16a40 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20  ING_BYTE+512.   
16a50 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d      || offset+am
16a60 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  t<=PENDING_BYTE 
16a70 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  .  );.#endif..#i
16a80 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
16a90 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
16aa0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
16ab0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
16ac0 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
16ad0 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
16ae0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16af0 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
16b00 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
16b10 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
16b20 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
16b30 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
16b40 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
16b50 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
16b60 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
16b70 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16b80 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
16b90 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
16ba0 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
16bb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
16bc0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
16bd0 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
16be0 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
16bf0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
16c00 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
16c10 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
16c20 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
16c30 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
16c40 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
16c50 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
16c60 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
16c70 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
16c80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
16c90 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
16ca0 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
16cb0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16cc0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16cd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
16ce0 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
16cf0 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
16d00 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
16d10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
16d20 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
16d30 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
16d40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
16d50 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
16d60 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
16d70 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
16d80 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
16d90 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64  (wrote = seekAnd
16da0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66  Write(pFile, off
16db0 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  set, pBuf, amt))
16dc0 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
16dd0 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
16de0 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
16df0 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
16e00 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
16e10 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
16e20 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
16e30 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
16e40 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
16e50 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
16e60 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28  amt=1 ));..  if(
16e70 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
16e80 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20  ( wrote<0 ){.   
16e90 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
16ea0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
16eb0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
16ec0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
16ed0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
16ee0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
16ef0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f  lastErrno = 0; /
16f00 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
16f10 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
16f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
16f30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
16f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16f50 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
16f60 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
16f70 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
16f80 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
16f90 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
16fa0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
16fb0 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
16fc0 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
16fd0 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
16fe0 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
16ff0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
17000 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
17010 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
17020 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
17030 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
17040 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
17050 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
17060 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
17070 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
17080 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
17090 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
170a0 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
170b0 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20  th the (slower) 
170c0 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79  fsync()..** If y
170d0 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
170e0 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
170f0 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
17100 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
17110 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
17120 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
17130 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
17140 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
17150 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 64 65  datasync) && !de
17160 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
17170 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
17180 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
17190 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
171a0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
171b0 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
171c0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
171d0 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
171e0 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
171f0 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
17200 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
17210 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
17220 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
17230 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
17240 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
17250 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
17260 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
17270 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
17280 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
17290 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
172a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
172b0 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
172c0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
172d0 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
172e0 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
172f0 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
17300 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
17310 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
17320 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
17330 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
17340 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
17350 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
17360 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
17370 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
17380 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
17390 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
173a0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
173b0 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
173c0 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
173d0 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
173e0 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
173f0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
17400 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
17410 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
17420 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
17430 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
17440 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
17450 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
17460 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
17470 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
17480 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
17490 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
174a0 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
174b0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
174c0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
174d0 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
174e0 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
174f0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
17500 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
17510 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
17520 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
17530 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
17540 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
17550 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
17560 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
17570 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
17580 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
17590 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
175a0 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
175b0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
175c0 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
175d0 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
175e0 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
175f0 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
17600 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
17610 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
17620 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
17630 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
17640 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
17650 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
17660 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
17670 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
17680 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
17690 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
176a0 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
176b0 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
176c0 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
176d0 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
176e0 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
176f0 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
17700 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
17710 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
17720 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
17730 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
17740 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
17750 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
17760 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
17770 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
17780 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
17790 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
177a0 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
177b0 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
177c0 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
177d0 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
177e0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
177f0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
17800 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
17810 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
17820 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
17830 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
17840 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
17850 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
17860 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
17870 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
17880 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
17890 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
178a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
178b0 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
178c0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
178d0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
178e0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
178f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
17900 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
17910 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
17920 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
17930 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
17940 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
17950 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
17960 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
17970 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
17980 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
17990 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
179a0 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
179b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
179c0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
179d0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
179e0 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
179f0 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
17a00 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
17a10 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
17a20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
17a30 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
17a40 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
17a50 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
17a60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
17a70 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
17a80 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
17a90 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
17aa0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
17ab0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
17ac0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
17ad0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
17ae0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
17af0 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
17b00 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
17b10 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17b20 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
17b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
17b40 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
17b50 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
17b60 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c  {.    rc = fcntl
17b70 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
17b80 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
17b90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
17ba0 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
17bb0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
17bc0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
17bd0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
17be0 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
17bf0 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
17c00 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
17c10 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
17c20 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
17c30 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
17c40 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
17c50 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
17c60 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
17c70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
17c80 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
17c90 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
17ca0 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
17cb0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
17cc0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
17cd0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
17ce0 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
17cf0 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
17d00 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
17d10 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
17d20 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
17d30 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
17d40 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
17d50 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
17d60 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
17d70 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
17d80 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
17d90 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
17da0 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
17db0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
17dc0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
17dd0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
17de0 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
17df0 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
17e00 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
17e10 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
17e20 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
17e30 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
17e40 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
17e50 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
17e60 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
17e70 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
17e80 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
17e90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
17ea0 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
17eb0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
17ec0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
17ed0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
17ee0 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
17ef0 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
17f00 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
17f10 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
17f20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
17f30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17f40 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
17f50 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
17f60 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
17f70 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
17f80 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
17f90 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
17fa0 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
17fb0 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
17fc0 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
17fd0 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
17fe0 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
17ff0 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
18000 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
18010 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
18020 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
18030 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
18040 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
18050 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
18060 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
18070 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
18080 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
18090 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
180a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
180b0 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
180c0 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
180d0 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
180e0 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
180f0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
18100 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
18110 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
18120 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
18130 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
18140 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
18150 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
18160 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
18170 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
18180 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
18190 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
181a0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
181b0 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
181c0 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
181d0 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
181e0 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
181f0 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
18200 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
18210 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
18220 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
18230 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18240 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
18250 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
18260 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18270 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
18280 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
18290 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
182a0 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
182b0 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
182c0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
182d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
182e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
182f0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
18300 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
18310 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
18320 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
18330 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
18340 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
18350 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
18360 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
18370 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
18380 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
18390 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
183a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
183b0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
183c0 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
183d0 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
183e0 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
183f0 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
18400 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
18410 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
18420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
18430 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
18440 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
18450 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
18460 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
18470 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
18480 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
18490 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
184a0 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
184b0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
184c0 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
184d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
184e0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
184f0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
18500 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
18510 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f  RR_FSYNC, "full_
18520 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  fsync", pFile->z
18530 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Path);.  }.  if(
18540 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
18550 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
18560 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28  ("DIRSYNC %-3d (
18570 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
18580 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
18590 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  ", pFile->dirfd,
185a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
185b0 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
185c0 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e 64  ullsync));.#ifnd
185d0 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
185e0 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a  E_DIRSYNC.    /*
185f0 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   The directory s
18600 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ync is only atte
18610 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73  mpted if full_fs
18620 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75  ync is.    ** tu
18630 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76  rned off or unav
18640 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66  ailable.  If a f
18650 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72  ull_fsync occurr
18660 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a  ed above,.    **
18670 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74   then the direct
18680 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65  ory sync is supe
18690 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a  rfluous..    */.
186a0 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46      if( (!HAVE_F
186b0 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46  ULLFSYNC || !isF
186c0 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c  ullsync) && full
186d0 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69  _fsync(pFile->di
186e0 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  rfd,0,0) ){.    
186f0 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20     /*.       ** 
18700 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64  We have received
18710 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74   multiple report
18720 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74  s of fsync() ret
18730 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a  urning.       **
18740 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70   errors when app
18750 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72  lied to director
18760 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66  ies on certain f
18770 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ile systems..   
18780 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20      ** A failed 
18790 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
187a0 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c  s not a big deal
187b0 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20  .  So it seems. 
187c0 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
187d0 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72  to ignore the er
187e0 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36  ror.  Ticket #16
187f0 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  57.       */.   
18800 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61      /* pFile->la
18810 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18820 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65   */.       /* re
18830 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18840 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  R; */.    }.#end
18850 69 66 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6e  if.    /* Only n
18860 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65  eed to sync once
18870 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 20  , so close the  
18880 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77  directory when w
18890 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20  e are done */.  
188a0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
188b0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72  File, pFile->dir
188c0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
188d0 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20     pFile->dirfd 
188e0 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
188f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18900 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
18910 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
18920 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
18930 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
18940 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
18950 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
18960 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
18970 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18980 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b   *)id;.  int rc;
18990 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
189a0 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
189b0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
189c0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
189d0 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ATE );..  /* If 
189e0 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
189f0 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
18a00 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
18a10 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
18a20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
18a30 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
18a40 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
18a50 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
18a60 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
18a70 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
18a80 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
18a90 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
18aa0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
18ab0 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
18ac0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
18ad0 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >szChunk ){.    
18ae0 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
18af0 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
18b00 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
18b10 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
18b20 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72  zChunk;.  }..  r
18b30 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  c = robust_ftrun
18b40 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28  cate(pFile->h, (
18b50 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20  off_t)nByte);.  
18b60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
18b70 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
18b80 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
18b90 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
18ba0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
18bb0 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
18bc0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
18bd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e  );.  }else{.#ifn
18be0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
18bf0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
18c00 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
18c10 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
18c20 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
18c30 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
18c40 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
18c50 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
18c60 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
18c70 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
18c80 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
18c90 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
18ca0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
18cb0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
18cc0 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
18cd0 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
18ce0 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
18cf0 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
18d00 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
18d10 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
18d20 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
18d30 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
18d40 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
18d50 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
18d60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18d70 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
18d80 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
18d90 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
18da0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
18db0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
18dc0 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ..    return SQL
18dd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
18de0 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
18df0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
18e00 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
18e10 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
18e20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71   unixFileSize(sq
18e30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18e40 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
18e50 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
18e60 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
18e70 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d  rt( id );.  rc =
18e80 20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c   fstat(((unixFil
18e90 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
18ea0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
18eb0 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
18ec0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
18ed0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
18ee0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
18ef0 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
18f00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
18f10 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
18f20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
18f30 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
18f40 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
18f50 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
18f60 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
18f70 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
18f80 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
18f90 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
18fa0 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
18fb0 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
18fc0 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
18fd0 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
18fe0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
18ff0 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
19000 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
19010 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
19020 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
19030 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
19040 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
19050 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
19060 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
19070 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
19080 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
19090 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
190a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
190b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
190c0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
190d0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
190e0 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
190f0 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
19100 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
19110 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
19120 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
19130 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
19140 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
19150 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
19160 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
19170 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
19180 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
19190 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
191a0 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
191b0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
191c0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
191d0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
191e0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
191f0 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
19200 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
19210 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
19220 66 69 6c 65 2c 20 69 74 20 63 6f 75 6c 64 20 62  file, it could b
19230 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69  e.** that the fi
19240 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 65  le needs to be e
19250 78 74 65 6e 64 65 64 20 61 74 20 74 68 69 73 20  xtended at this 
19260 70 6f 69 6e 74 2e 20 4f 74 68 65 72 77 69 73 65  point. Otherwise
19270 2c 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  , the.** SQLITE_
19280 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
19290 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 6e  operation is a n
192a0 6f 2d 6f 70 20 66 6f 72 20 55 6e 69 78 2e 0a 2a  o-op for Unix..*
192b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e  /.static int fcn
192c0 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46  tlSizeHint(unixF
192d0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20  ile *pFile, i64 
192e0 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46  nByte){.  if( pF
192f0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a  ile->szChunk ){.
19300 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
19330 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
19340 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19360 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
19370 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
19380 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
19390 20 69 66 28 20 66 73 74 61 74 28 70 46 69 6c 65   if( fstat(pFile
193a0 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72 65 74  ->h, &buf) ) ret
193b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
193c0 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e 53 69  _FSTAT;..    nSi
193d0 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69  ze = ((nByte+pFi
193e0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f  le->szChunk-1) /
193f0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29   pFile->szChunk)
19400 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
19410 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  k;.    if( nSize
19420 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a  >(i64)buf.st_siz
19430 65 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  e ){.#if defined
19440 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
19450 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
19460 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
19470 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
19480 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72     do{.        r
19490 63 20 3d 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  c = posix_falloc
194a0 61 74 65 28 70 46 69 6c 65 2d 2e 68 2c 20 62 75  ate(pFile-.h, bu
194b0 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65  f.st_size, nSize
194c0 2d 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20  -buf.st_size;.  
194d0 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30      }while( rc<0
194e0 20 26 26 20 65 72 72 6e 6f 3d 45 49 4e 54 52 20   && errno=EINTR 
194f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
19500 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19510 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c  IOERR_WRITE;.#el
19520 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  se.      /* If t
19530 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68  he OS does not h
19540 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ave posix_falloc
19550 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20  ate(), fake it. 
19560 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20 20  First use.      
19570 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  ** ftruncate() t
19580 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 73  o set the file s
19590 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  ize, then write 
195a0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
195b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
195c0 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
195d0 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65  block within the
195e0 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e   extended region
195f0 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
19600 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63 68  is the same tech
19610 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67 6c  nique used by gl
19620 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ibc to implement
19630 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
19640 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73  ().      ** on s
19650 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e  ystems that do n
19660 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66  ot have a real f
19670 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65  allocate() syste
19680 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  m call..      */
19690 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
196a0 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
196b0 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
196c0 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
196d0 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
196e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
196f0 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
19700 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
19710 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
19720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19730 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
19740 65 20 66 72 6f 6d 20 73 65 65 6b 41 6e 64 57 72  e from seekAndWr
19750 69 74 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  ite() */..      
19760 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
19770 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
19780 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Size) ){.       
19790 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
197a0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
197b0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
197c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
197d0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
197e0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
197f0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
19800 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  }.      iWrite =
19810 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b   ((buf.st_size +
19820 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c   2*nBlk - 1)/nBl
19830 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20  k)*nBlk-1;.     
19840 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 6e 57   do {.        nW
19850 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rite = seekAndWr
19860 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74  ite(pFile, iWrit
19870 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  e, "", 1);.     
19880 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c     iWrite += nBl
19890 6b 3b 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65  k;.      } while
198a0 28 20 6e 57 72 69 74 65 3d 3d 31 20 26 26 20 69  ( nWrite==1 && i
198b0 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 3b 0a 20  Write<nSize );. 
198c0 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
198d0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
198e0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
198f0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
19900 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
19910 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
19920 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
19930 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
19940 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
19950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19960 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
19970 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
19980 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
19990 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  g){.  switch( op
199a0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
199b0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
199c0 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
199d0 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69  nt*)pArg = ((uni
199e0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 65 46 69 6c  xFile*)id)->eFil
199f0 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74  eLock;.      ret
19a00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19a10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
19a20 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
19a30 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
19a40 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c  pArg = ((unixFil
19a50 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
19a60 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
19a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
19a80 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19a90 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
19aa0 45 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  E: {.      ((uni
19ab0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 73 7a 43 68  xFile*)id)->szCh
19ac0 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
19ad0 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
19ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19af0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
19b00 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
19b10 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
19b20 6e 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  n fcntlSizeHint(
19b30 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 2c 20  (unixFile *)id, 
19b40 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
19b50 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
19b60 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  BUG.    /* The p
19b70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ager calls this 
19b80 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c  method to signal
19b90 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e   that it has don
19ba0 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  e.    ** a rollb
19bb0 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
19bc0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
19bd0 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64  refore unchanged
19be0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68   and.    ** it h
19bf0 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f  ence it is OK fo
19c00 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
19c10 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  n change counter
19c20 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e   to be.    ** un
19c30 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a  changed..    */.
19c40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19c50 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
19c60 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e  ED: {.      ((un
19c70 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55  ixFile*)id)->dbU
19c80 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  pdate = 0;.     
19c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19ca0 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  K;.    }.#endif.
19cb0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
19cc0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
19cd0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
19ce0 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  LE__).    case S
19cf0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
19d00 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73  OXYFILE:.    cas
19d10 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
19d20 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
19d30 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
19d40 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f  FileControl(id,o
19d50 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23  p,pArg);.    }.#
19d60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19d70 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19d80 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
19d90 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20  __APPLE__) */.  
19da0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
19db0 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44  NTL_SYNC_OMITTED
19dc0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
19dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
19de0 41 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  A no-op */.    }
19df0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
19e00 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
19e10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
19e20 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
19e30 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
19e40 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
19e50 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
19e60 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
19e70 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
19e80 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
19e90 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
19ea0 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
19eb0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
19ec0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
19ed0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
19ee0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
19ef0 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
19f00 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
19f10 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
19f20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
19f30 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
19f40 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
19f50 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
19f60 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
19f70 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
19f80 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
19f90 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
19fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19fb0 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
19fc0 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
19fd0 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
19fe0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
19ff0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a000 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1a010 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
1a020 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
1a030 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1a040 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54   for the file. T
1a050 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 30 20  his is always 0 
1a060 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61  for unix..*/.sta
1a070 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69  tic int unixDevi
1a080 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1a090 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
1a0a0 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1a0b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1a0c0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1a0d0 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
1a0e0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a  LITE_OMIT_WAL...
1a0f0 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
1a100 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
1a110 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
1a120 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20  buffer.  .**.** 
1a130 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
1a140 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
1a150 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c  nce the same wal
1a160 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72  -index, each thr
1a170 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f  ead.** has its o
1a180 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  wn unixShm objec
1a190 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20  t, but they all 
1a1a0 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
1a1b0 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66  e instance.** of
1a1c0 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1a1d0 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  e object.  In ot
1a1e0 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20  her words, each 
1a1f0 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65  wal-index is ope
1a200 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65  ned.** only once
1a210 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
1a220 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d  .** Each unixShm
1a230 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
1a240 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69  onnected to a si
1a250 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ngle unixInodeIn
1a260 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65  fo object..** We
1a270 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20   could coalesce 
1a280 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f  this object into
1a290 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20   unixInodeInfo, 
1a2a0 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  but that would m
1a2b0 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65  ean.** every ope
1a2c0 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73  n file that does
1a2d0 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20   not use shared 
1a2e0 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72  memory (in other
1a2f0 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20   words, most.** 
1a300 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c  open files) woul
1a310 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20  d have to carry 
1a320 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72  around this extr
1a330 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  a information.  
1a340 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e  So.** the unixIn
1a350 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  odeInfo object c
1a360 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1a370 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68  r to this unixSh
1a380 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  mNode object.** 
1a390 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  and the unixShmN
1a3a0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  ode object is cr
1a3b0 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20  eated only when 
1a3c0 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e  needed..**.** un
1a3d0 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  ixMutexHeld() mu
1a3e0 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
1a3f0 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
1a400 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
1a410 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
1a420 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1a430 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1a440 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
1a450 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68     nRef.**.** Th
1a460 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1a470 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
1a480 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
1a490 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
1a4a0 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
1a4b0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
1a4c0 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69  **.** Either uni
1a4d0 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  xShmNode.mutex m
1a4e0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75  ust be held or u
1a4f0 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
1a500 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75  =0 and.** unixMu
1a510 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
1a520 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
1a530 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
1a540 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
1a550 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
1a560 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
1a570 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e  mNode {.  unixIn
1a580 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
1a590 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64       /* unixInod
1a5a0 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20  eInfo that owns 
1a5b0 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f  this SHM node */
1a5c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a5d0 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
1a5e0 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
1a5f0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1a600 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1a610 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1a620 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70  Name of the mmap
1a630 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1a640 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1a650 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
1a660 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a670 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
1a680 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1a690 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
1a6a0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1a6b0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69  s */.  int nRegi
1a6c0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1a6d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
1a6e0 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
1a6f0 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e   char **apRegion
1a700 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
1a710 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73  rray of mapped s
1a720 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1a730 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
1a740 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
1a750 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a760 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  f unixShm object
1a770 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
1a780 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  is */.  unixShm 
1a790 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
1a7a0 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68     /* All unixSh
1a7b0 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
1a7c0 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69  ng to this */.#i
1a7d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a7e0 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b  G.  u8 exclMask;
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a800 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1a810 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1a820 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73  /.  u8 sharedMas
1a830 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
1a840 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
1a850 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
1a860 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
1a870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a880 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e  ext available un
1a890 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  ixShm.id value *
1a8a0 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
1a8b0 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
1a8c0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
1a8d0 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
1a8e0 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
1a8f0 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
1a900 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
1a910 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1a920 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
1a930 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
1a940 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
1a950 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
1a960 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
1a970 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
1a980 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46  **    unixShm.pF
1a990 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  ile.**    unixSh
1a9a0 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
1a9b0 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
1a9c0 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
1a9d0 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e   unixShm.pFile->
1a9e0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1a9f0 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
1aa00 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
1aa10 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
1aa20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b  struct unixShm {
1aa30 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1aa40 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a  pShmNode;     /*
1aa50 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1aa60 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1aa70 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ct */.  unixShm 
1aa80 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
1aa90 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53     /* Next unixS
1aaa0 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
1aab0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
1aac0 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aae0 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
1aaf0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1ab00 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73  mutex */.  u16 s
1ab10 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
1ab20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1ab30 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
1ab40 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
1ab50 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1ab60 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
1ab70 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
1ab80 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ld */.#ifdef SQL
1ab90 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69  ITE_DEBUG.  u8 i
1aba0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1abb0 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
1abc0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1abd0 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53  within its unixS
1abe0 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  hmNode */.#endif
1abf0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
1ac00 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
1ac10 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
1ac20 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
1ac30 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
1ac40 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
1ac50 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
1ac60 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
1ac70 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
1ac80 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
1ac90 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1aca0 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
1acb0 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
1acc0 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
1acd0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
1ace0 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
1acf0 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
1ad00 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
1ad10 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
1ad20 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
1ad30 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
1ad40 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
1ad50 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1ad60 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
1ad70 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
1ad80 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
1ad90 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ode, /* Apply lo
1ada0 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
1adb0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
1adc0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
1add0 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
1ade0 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46     /* F_UNLCK, F
1adf0 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c  _RDLCK, or F_WRL
1ae00 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
1ae10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ae20 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
1ae30 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1ae40 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20  e */.  int n    
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ae60 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1ae70 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20   to lock */.){. 
1ae80 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
1ae90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
1aea0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
1aeb0 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
1aec0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1aed0 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73  ITE_OK;   /* Res
1aee0 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63  ult code form fc
1aef0 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41  ntl() */..  /* A
1af00 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69  ccess to the uni
1af10 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
1af20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
1af30 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
1af40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1af50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d  _mutex_held(pShm
1af60 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  Node->mutex) || 
1af70 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
1af80 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65  0 );..  /* Share
1af90 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70  d locks never sp
1afa0 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  an more than one
1afb0 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72   byte */.  asser
1afc0 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54  t( n==1 || lockT
1afd0 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a  ype!=F_RDLCK );.
1afe0 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20  .  /* Locks are 
1aff0 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a  within range */.
1b000 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26    assert( n>=1 &
1b010 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  & n<SQLITE_SHM_N
1b020 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  LOCK );..  /* In
1b030 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
1b040 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
1b050 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  */.  memset(&f, 
1b060 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
1b070 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b   f.l_type = lock
1b080 54 79 70 65 3b 0a 20 20 66 2e 6c 5f 77 68 65 6e  Type;.  f.l_when
1b090 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
1b0a0 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73   f.l_start = ofs
1b0b0 74 3b 0a 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  t;.  f.l_len = n
1b0c0 3b 0a 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28  ;..  rc = fcntl(
1b0d0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
1b0e0 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 72 63 20  ETLK, &f);.  rc 
1b0f0 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
1b100 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
1b110 45 5f 42 55 53 59 3b 0a 0a 20 20 2f 2a 20 55 70  E_BUSY;..  /* Up
1b120 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  date the global 
1b130 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64  lock state and d
1b140 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20  o debug tracing 
1b150 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1b160 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d  _DEBUG.  { u16 m
1b170 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ask;.  OSTRACE((
1b180 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20  "SHM-LOCK "));. 
1b190 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
1b1a0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
1b1b0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b1c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1b1d0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
1b1e0 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
1b1f0 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
1b200 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
1b210 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
1b220 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1b230 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1b240 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
1b250 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  mask;.    }else 
1b260 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
1b270 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
1b280 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
1b290 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
1b2a0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
1b2b0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
1b2c0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
1b2d0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1b2e0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65   |= mask;.    }e
1b2f0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1b300 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
1b310 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
1b320 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
1b330 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
1b340 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
1b350 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  e->exclMask |= m
1b360 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
1b370 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
1b380 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a  &= ~mask;.    }.
1b390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1b3a0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
1b3b0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1b3c0 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
1b3d0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
1b3e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1b3f0 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
1b400 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1b410 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61  E(("read-lock fa
1b420 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c  iled"));.    }el
1b430 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1b440 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
1b450 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
1b460 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
1b470 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
1b480 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
1b490 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61    OSTRACE((" - a
1b4a0 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25  fterwards %03x,%
1b4b0 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
1b4c0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1b4d0 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64  redMask, pShmNod
1b4e0 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  e->exclMask));. 
1b4f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
1b500 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a  urn rc;        .
1b510 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  }.../*.** Purge 
1b520 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c  the unixShmNodeL
1b530 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
1b540 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69  entries with uni
1b550 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
1b560 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1b570 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
1b580 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
1b590 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
1b5a0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
1b5b0 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
1b5c0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
1b5d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b5e0 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69  unixShmPurge(uni
1b5f0 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75  xFile *pFd){.  u
1b600 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20  nixShmNode *p = 
1b610 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  pFd->pInode->pSh
1b620 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
1b630 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1b640 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
1b650 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1b660 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
1b670 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70  rt( p->pInode==p
1b680 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
1b690 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
1b6a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
1b6b0 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
1b6c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
1b6d0 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
1b6e0 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e        munmap(p->
1b6f0 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
1b700 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 7d  szRegion);.    }
1b710 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b720 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a  e(p->apRegion);.
1b730 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
1b740 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  ){.      robust_
1b750 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c  close(pFd, p->h,
1b760 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
1b770 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20    p->h = -1;.   
1b780 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65   }.    p->pInode
1b790 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a  ->pShmNode = 0;.
1b7a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b7b0 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
1b7c0 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d  * Open a shared-
1b7d0 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
1b7e0 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e  ciated with open
1b7f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1b800 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20  DbFd.  .** This 
1b810 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65  particular imple
1b820 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d  mentation uses m
1b830 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a  mapped files..**
1b840 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65  .** The file use
1b850 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
1b860 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20  hared-memory is 
1b870 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
1b880 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20  ctory.** as the 
1b890 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1b8a0 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  le and has the s
1b8b0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
1b8c0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  open database.**
1b8d0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22   file with the "
1b8e0 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64  -shm" suffix add
1b8f0 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
1b900 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  , if the databas
1b910 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68  e file.** is "/h
1b920 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
1b930 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69  .db" then the fi
1b940 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74  le that is creat
1b950 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a  ed and mmapped.*
1b960 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  * for shared mem
1b970 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ory will be call
1b980 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f  ed "/home/user1/
1b990 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20  config.db-shm". 
1b9a0 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20   .**.** Another 
1b9b0 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74  approach to is t
1b9c0 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f  o use files in /
1b9d0 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f  dev/shm or /dev/
1b9e0 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d  tmp or an.** som
1b9f0 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f  e other tmpfs mo
1ba00 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69  unt. But if a fi
1ba10 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  le in a differen
1ba20 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66  t directory.** f
1ba30 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1ba40 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74   file is used, t
1ba50 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63  hen differing ac
1ba60 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
1ba70 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28  .** or a chroot(
1ba80 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77  ) might cause tw
1ba90 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  o different proc
1baa0 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  esses on the sam
1bab0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f  e.** database to
1bac0 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69   end up using di
1bad0 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f  fferent files fo
1bae0 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
1baf0 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68  - .** meaning th
1bb00 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  at their memory 
1bb10 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79  would not really
1bb20 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73   be shared - res
1bb30 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74  ulting.** in dat
1bb40 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1bb50 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
1bb60 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65   this tmpfs file
1bb70 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65   usage.** can be
1bb80 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
1bb90 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d  ile-time using -
1bba0 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  DSQLITE_SHM_DIRE
1bbb0 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22  CTORY="/dev/shm"
1bbc0 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76  .** or the equiv
1bbd0 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20  alent.  The use 
1bbe0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48  of the SQLITE_SH
1bbf0 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
1bc00 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69  ile-time.** opti
1bc10 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  on results in an
1bc20 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75   incompatible bu
1bc30 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20  ild of SQLite;  
1bc40 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65  builds of SQLite
1bc50 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69  .** that with di
1bc60 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53  ffering SQLITE_S
1bc70 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74  HM_DIRECTORY set
1bc80 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f  tings attempt to
1bc90 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   use the.** same
1bca0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1bcb0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
1bcc0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1bcd0 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  tion will likely
1bce0 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20  .** result. The 
1bcf0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1bd00 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
1bd10 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73  e option is cons
1bd20 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70  idered.** "unsup
1bd30 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20  ported" and may 
1bd40 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74  go away in a fut
1bd50 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61  ure SQLite relea
1bd60 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  se..**.** When o
1bd70 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
1bd80 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1bd90 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
1bda0 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
1bdb0 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
1bdc0 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
1bdd0 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
1bde0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1bdf0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
1be00 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
1be10 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
1be20 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
1be30 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
1be40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1be50 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
1be60 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  ry(unixFile *pDb
1be70 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  Fd){.  struct un
1be80 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20  ixShm *p = 0;   
1be90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1bea0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
1beb0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
1bec0 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70  t unixShmNode *p
1bed0 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68  ShmNode;   /* Th
1bee0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
1bef0 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
1bf00 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf20 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1bf30 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1bf40 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1bf50 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20     /* The inode 
1bf60 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  of fd */.  char 
1bf70 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20  *zShmFilename;  
1bf80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1bf90 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75  me of the file u
1bfa0 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20  sed for SHM */. 
1bfb0 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d   int nShmFilenam
1bfc0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1bfd0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1bfe0 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  SHM filename in 
1bff0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41  bytes */..  /* A
1c000 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
1c010 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68  r the new unixSh
1c020 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70  m object. */.  p
1c030 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1c040 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
1c050 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1c060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1c070 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  M;.  memset(p, 0
1c080 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1c090 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
1c0a0 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pShm==0 );..  /*
1c0b0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1c0c0 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f   a unixShmNode o
1c0d0 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78  bject already ex
1c0e0 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65  ists. Reuse an e
1c0f0 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65  xisting.  ** one
1c100 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65   if present. Cre
1c110 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
1c120 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
1c130 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1c140 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
1c150 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
1c160 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f   pShmNode = pIno
1c170 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
1c180 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
1c190 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
1c1a0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
1c1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74            /* fst
1c1c0 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61  at() info for da
1c1d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
1c1e0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61      /* Call fsta
1c1f0 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
1c200 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  t the permission
1c210 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
1c220 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a  e file. If.    *
1c230 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69  * a new *-shm fi
1c240 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61  le is created, a
1c250 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62  n attempt will b
1c260 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65  e made to create
1c270 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20   it.    ** with 
1c280 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
1c290 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75 61 6c  ions. The actual
1c2a0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65   permissions the
1c2b0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
1c2c0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 72 65  .    ** with are
1c2d0 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
1c2e0 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20 73 65  current umask se
1c2f0 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  tting..    */.  
1c300 20 20 69 66 28 20 66 73 74 61 74 28 70 44 62 46    if( fstat(pDbF
1c310 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  d->h, &sStat) ){
1c320 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c330 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1c340 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1c350 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1c360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
1c370 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
1c380 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
1c390 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
1c3a0 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30  _DIRECTORY) + 30
1c3b0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
1c3c0 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28  Filename = 5 + (
1c3d0 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64  int)strlen(pDbFd
1c3e0 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  ->zPath);.#endif
1c3f0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
1c400 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1c410 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
1c420 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ) + nShmFilename
1c430 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   );.    if( pShm
1c440 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
1c450 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1c460 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1c470 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1c480 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53   }.    memset(pS
1c490 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  hmNode, 0, sizeo
1c4a0 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20  f(*pShmNode));. 
1c4b0 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20     zShmFilename 
1c4c0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
1c4d0 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
1c4e0 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66  pShmNode[1];.#if
1c4f0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
1c500 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c  IRECTORY.    sql
1c510 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53  ite3_snprintf(nS
1c520 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d  hmFilename, zShm
1c530 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20  Filename, .     
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1c560 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68  TORY "/sqlite-sh
1c570 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20  m-%x-%x",.      
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c590 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f  u32)sStat.st_ino
1c5a0 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f  , (u32)sStat.st_
1c5b0 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  dev);.#else.    
1c5c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1c5d0 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
1c5e0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ShmFilename, "%s
1c5f0 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
1c600 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ath);.#endif.   
1c610 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d   pShmNode->h = -
1c620 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49  1;.    pDbFd->pI
1c630 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
1c640 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70   pShmNode;.    p
1c650 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20  ShmNode->pInode 
1c660 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
1c670 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
1c680 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1c690 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1c6a0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
1c6b0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1c6c0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
1c6d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1c6e0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1c6f0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1c700 20 20 20 7d 0a 0a 20 20 20 20 70 53 68 6d 4e 6f     }..    pShmNo
1c710 64 65 2d 3e 68 20 3d 20 6f 70 65 6e 28 7a 53 68  de->h = open(zSh
1c720 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57  mFilename, O_RDW
1c730 52 7c 4f 5f 43 52 45 41 54 2c 20 28 73 53 74 61  R|O_CREAT, (sSta
1c740 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37  t.st_mode & 0777
1c750 29 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  ));.    if( pShm
1c760 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20  Node->h<0 ){.   
1c770 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
1c780 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1c790 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
1c7a0 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
1c7b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1c7c0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1c7d0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
1c7e0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
1c7f0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1c800 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
1c810 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20   switch..    ** 
1c820 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
1c830 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1c840 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a  o length. .    *
1c850 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
1c860 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  E_OK;.    if( un
1c870 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
1c880 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43  pShmNode, F_WRLC
1c890 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
1c8a0 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   1)==SQLITE_OK )
1c8b0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75  {.      if( robu
1c8c0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
1c8d0 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
1c8e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
1c8f0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1c900 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
1c910 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68  "ftruncate", zSh
1c920 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
1c930 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1c940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c950 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
1c960 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
1c970 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
1c980 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
1c990 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1c9a0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d  f( rc ) goto shm
1c9b0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a  _open_err;.  }..
1c9c0 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
1c9d0 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
1c9e0 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78  hild of the unix
1c9f0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
1ca00 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
1ca10 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
1ca20 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
1ca30 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
1ca40 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
1ca50 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1ca60 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1ca70 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65  hm = p;.  unixLe
1ca80 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
1ca90 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
1caa0 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
1cab0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1cac0 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
1cad0 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
1cae0 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45  ver of the unixE
1caf0 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
1cb00 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
1cb10 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
1cb20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78  new (struct unix
1cb30 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
1cb40 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
1cb50 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
1cb60 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
1cb70 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
1cb80 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1cb90 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
1cba0 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
1cbb0 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
1cbc0 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
1cbd0 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
1cbe0 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
1cbf0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a  Node->mutex .  *
1cc00 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20  * mutex..  */.  
1cc10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1cc20 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1cc30 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  tex);.  p->pNext
1cc40 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69   = pShmNode->pFi
1cc50 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  rst;.  pShmNode-
1cc60 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73  >pFirst = p;.  s
1cc70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1cc80 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1cc90 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
1cca0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
1ccb0 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20  ump here on any 
1ccc0 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65  error */.shm_ope
1ccd0 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d  n_err:.  unixShm
1cce0 50 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20  Purge(pDbFd);   
1ccf0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1cd00 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
1cd10 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
1cd20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1cd30 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
1cd40 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
1cd50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1cd60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1cd70 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
1cd80 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f  pointer to regio
1cd90 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65  n iRegion of the
1cda0 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f   .** shared-memo
1cdb0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
1cdc0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1cdd0 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d  file fd. Shared-
1cde0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a  memory regions .
1cdf0 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  ** are numbered 
1ce00 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65  starting from ze
1ce10 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d  ro. Each shared-
1ce20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73  memory region is
1ce30 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79   szRegion .** by
1ce40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
1ce50 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1ce60 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1ce70 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1ce80 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
1ce90 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
1cea0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1ceb0 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74   bExtend paramet
1cec0 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
1ced0 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
1cee0 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
1cef0 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
1cf00 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
1cf10 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
1cf20 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
1cf30 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
1cf40 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
1cf50 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
1cf60 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
1cf70 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a  returned. If .**
1cf80 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d   bExtend is non-
1cf90 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71  zero and the req
1cfa0 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1cfb0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
1cfc0 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e  not yet .** been
1cfd0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
1cfe0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
1cff0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1d000 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65  .** If the share
1d010 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1d020 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1d030 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73   allocated or is
1d040 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
1d050 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65   this call as de
1d060 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74  scribed above, t
1d070 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64  hen it is mapped
1d080 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1d090 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73  sses .** address
1d0a0 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73   space (if it is
1d0b0 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a   not already), *
1d0c0 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  pp is set to poi
1d0d0 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64  nt to the mapped
1d0e0 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
1d0f0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1d100 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1d110 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20  t unixShmMap(.  
1d120 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1d130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d140 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
1d150 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1d160 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
1d170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d180 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
1d190 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
1d1a0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1c0 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
1d1d0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74  ns */.  int bExt
1d1e0 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  end,            
1d1f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d200 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
1d210 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
1d220 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
1d230 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
1d240 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
1d250 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75  memory */.){.  u
1d260 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
1d270 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
1d280 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20    unixShm *p;.  
1d290 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
1d2a0 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
1d2b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d2c0 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  /* If the shared
1d2d0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73  -memory file has
1d2e0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
1d2f0 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
1d300 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46  w. */.  if( pDbF
1d310 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20  d->pShm==0 ){.  
1d320 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53    rc = unixOpenS
1d330 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
1d340 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
1d350 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1d360 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20  rn rc;.  }..  p 
1d370 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1d380 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
1d390 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74  ShmNode;.  sqlit
1d3a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1d3b0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1d3c0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
1d3d0 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
1d3e0 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
1d3f0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
1d400 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
1d410 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1d420 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
1d430 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d450 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
1d460 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
1d470 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
1d480 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
1d490 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
1d4a0 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1d4b0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
1d4c0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
1d4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1d4e0 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
1d4f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
1d500 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
1d510 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
1d520 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
1d530 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
1d540 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1d550 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
1d560 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
1d570 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
1d580 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
1d590 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
1d5a0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
1d5b0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
1d5c0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1d5d0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1d5e0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1d5f0 28 20 66 73 74 61 74 28 70 53 68 6d 4e 6f 64 65  ( fstat(pShmNode
1d600 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ->h, &sStat) ){.
1d610 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d620 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b  E_IOERR_SHMSIZE;
1d630 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1d640 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
1d650 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
1d660 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
1d670 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
1d680 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1d690 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
1d6a0 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69  st. If bExtend i
1d6b0 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a  s set to.      *
1d6c0 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
1d6d0 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
1d6e0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1d6f0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1d700 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
1d710 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
1d720 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
1d730 20 69 73 20 74 72 75 65 2c 20 75 73 65 20 66 74   is true, use ft
1d740 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c  runcate() to all
1d750 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  ocate.      ** t
1d760 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1d770 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20  ory region..    
1d780 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
1d790 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73  bExtend ) goto s
1d7a0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1d7b0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1d7c0 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
1d7d0 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  >h, nByte) ){.  
1d7e0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
1d7f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1d800 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 22 66 74  OERR_SHMSIZE,"ft
1d810 72 75 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f 64  runcate",pShmNod
1d820 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
1d830 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
1d840 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
1d850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
1d860 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
1d870 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
1d880 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1d890 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
1d8a0 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
1d8b0 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
1d8c0 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
1d8d0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
1d8e0 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
1d8f0 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a  1)*sizeof(char *
1d900 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
1d910 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
1d920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1d930 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
1d940 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1d950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
1d960 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d  Node->apRegion =
1d970 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c   apNew;.    whil
1d980 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  e(pShmNode->nReg
1d990 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20  ion<=iRegion){. 
1d9a0 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 20       void *pMem 
1d9b0 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65 67 69  = mmap(0, szRegi
1d9c0 6f 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 52  on, PROT_READ|PR
1d9d0 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20  OT_WRITE, .     
1d9e0 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c       MAP_SHARED,
1d9f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53   pShmNode->h, pS
1da00 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a  hmNode->nRegion*
1da10 73 7a 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 29  szRegion.      )
1da20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1da30 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
1da40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1da50 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
1da60 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1da70 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1da80 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
1da90 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
1daa0 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b  nRegion] = pMem;
1dab0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1dac0 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
1dad0 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
1dae0 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
1daf0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
1db00 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d  ion ){.    *pp =
1db10 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
1db20 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20  ion[iRegion];.  
1db30 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
1db40 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1db50 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1db60 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1db70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1db80 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1db90 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
1dba0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1dbb0 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  segment..**.** N
1dbc0 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c  ote that the rel
1dbd0 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
1dbe0 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43  n SHAREd and EXC
1dbf0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20  LUSIVE locks is 
1dc00 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66  a little.** diff
1dc10 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20  erent here than 
1dc20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53  in posix.  In xS
1dc30 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61  hmLock(), one ca
1dc40 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  n go from unlock
1dc50 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20  ed.** to shared 
1dc60 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d  and back or from
1dc70 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63   unlocked to exc
1dc80 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e  lusive and back.
1dc90 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a    But one may.**
1dca0 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61   not go from sha
1dcb0 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  red to exclusive
1dcc0 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69   or from exclusi
1dcd0 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f  ve to shared..*/
1dce0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1dcf0 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74  ShmLock(.  sqlit
1dd00 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1dd10 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1dd20 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
1dd30 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1dd40 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74   /* First lock t
1dd70 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
1dd80 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c  ease */.  int n,
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ddb0 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69  f locks to acqui
1ddc0 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
1ddd0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ddf0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
1de00 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a   the lock */.){.
1de10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
1de20 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
1de30 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  d;      /* Conne
1de40 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68  ction holding sh
1de50 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1de60 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44   unixShm *p = pD
1de70 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
1de80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
1de90 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e  ared memory bein
1dea0 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  g locked */.  un
1deb0 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  ixShm *pX;      
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1dee0 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c  ng over all sibl
1def0 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ings */.  unixSh
1df00 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
1df10 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20  = p->pShmNode;  
1df20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1df30 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a  g file iNode */.
1df40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1df50 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1df60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1df70 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
1df80 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
1dfb0 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
1dfc0 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
1dfd0 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
1dfe0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
1dff0 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
1e000 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
1e010 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
1e020 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
1e030 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
1e040 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
1e050 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1e060 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
1e070 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
1e080 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
1e090 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1e0a0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1e0b0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1e0c0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
1e0d0 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
1e0e0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1e0f0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1e100 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1e110 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
1e120 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1e130 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
1e140 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
1e150 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
1e160 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
1e170 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1e180 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  E)!=0 );..  mask
1e190 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   = (1<<(ofst+n))
1e1a0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
1e1b0 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
1e1c0 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
1e1d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1e1e0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1e1f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
1e200 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1e210 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
1e220 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
1e230 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
1e240 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
1e250 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
1e260 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
1e270 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
1e280 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
1e290 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1e2a0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1e2b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1e2c0 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
1e2d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
1e2e0 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
1e2f0 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
1e300 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
1e310 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
1e320 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
1e330 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1e340 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
1e350 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
1e360 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
1e370 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
1e380 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1e390 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1e3a0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55  ck(pShmNode, F_U
1e3b0 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  NLCK, ofst+UNIX_
1e3c0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1e3d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1e3e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e3f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64     }..    /* Und
1e400 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  o the local lock
1e410 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
1e420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e430 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
1e440 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1e450 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
1e460 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20   ~mask;.    } . 
1e470 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1e480 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
1e490 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
1e4a0 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
1e4b0 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
1e4c0 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
1e4d0 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
1e4e0 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
1e4f0 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
1e500 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
1e510 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
1e520 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1e530 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
1e540 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
1e550 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
1e560 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
1e570 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
1e580 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
1e590 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
1e5a0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1e5b0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1e5c0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1e5d0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1e5e0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1e5f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1e600 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1e610 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e620 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
1e630 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
1e640 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1e650 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
1e660 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1e670 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
1e680 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
1e690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e6a0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
1e6b0 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
1e6c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1e6d0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
1e6e0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
1e6f0 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  RDLCK, ofst+UNIX
1e700 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1e710 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e720 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e730 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1e740 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
1e750 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
1e760 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1e770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e780 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1e790 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1e7a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1e7b0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
1e7c0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1e7d0 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
1e7e0 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
1e7f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
1e800 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
1e810 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1e820 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
1e830 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1e840 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1e850 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1e860 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
1e870 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
1e880 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
1e890 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1e8a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1e8b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1e8c0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1e8d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e8e0 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
1e8f0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
1e900 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
1e910 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
1e920 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
1e930 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
1e940 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
1e950 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
1e960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e980 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
1e990 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1e9a0 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
1e9b0 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
1e9c0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
1e9d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e9f0 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
1ea00 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
1ea10 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
1ea20 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1ea30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ea40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ea50 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1ea60 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
1ea70 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d  E(("SHM-LOCK shm
1ea80 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f  id-%d, pid-%d go
1ea90 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a  t %03x,%03x\n",.
1eaa0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64             p->id
1eab0 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73  , getpid(), p->s
1eac0 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
1ead0 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75  clMask));.  retu
1eae0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1eaf0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
1eb00 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
1eb10 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
1eb20 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
1eb30 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
1eb40 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
1eb50 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
1eb60 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
1eb70 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
1eb80 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
1eb90 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
1eba0 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
1ebb0 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72  void unixShmBarr
1ebc0 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
1ebd0 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
1ebe0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1ebf0 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
1ec00 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1ec10 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
1ec20 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1ec30 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1ec40 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ();.  unixLeaveM
1ec50 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
1ec60 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
1ec70 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
1ec80 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
1ec90 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
1eca0 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
1ecb0 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
1ecc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
1ecd0 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f  s no shared memo
1ece0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
1ecf0 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  th the connectio
1ed00 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  n then this.** r
1ed10 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d  outine is a harm
1ed20 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  less no-op..*/.s
1ed30 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1ed40 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65  mUnmap(.  sqlite
1ed50 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1ed60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ed70 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
1ed80 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
1ed90 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1edb0 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d  * Delete shared-
1edc0 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a  memory if true *
1edd0 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  /.){.  unixShm *
1ede0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1edf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1ee00 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
1ee10 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  losed */.  unixS
1ee20 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1ee30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
1ee40 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
1ee50 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
1ee60 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70  */.  unixShm **p
1ee70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1ee80 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1ee90 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
1eea0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
1eeb0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
1eec0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1eed0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1eee0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
1eef0 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  e */..  pDbFd = 
1ef00 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
1ef10 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
1ef20 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1ef30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ef40 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1ef50 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73  >pShmNode;..  as
1ef60 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
1ef70 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
1ef80 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
1ef90 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
1efa0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
1efb0 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  node );..  /* Re
1efc0 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
1efd0 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
1efe0 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
1eff0 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
1f000 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
1f010 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1f020 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1f030 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
1f040 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
1f050 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
1f060 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
1f070 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
1f080 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
1f090 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
1f0a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1f0b0 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
1f0c0 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
1f0d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1f0e0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1f0f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
1f100 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
1f110 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
1f120 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
1f130 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
1f140 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
1f150 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
1f160 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
1f170 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
1f180 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
1f190 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
1f1a0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1f1b0 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65   ){.    if( dele
1f1c0 74 65 46 6c 61 67 20 29 20 75 6e 6c 69 6e 6b 28  teFlag ) unlink(
1f1d0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
1f1e0 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68  ame);.    unixSh
1f1f0 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20  mPurge(pDbFd);. 
1f200 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
1f210 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
1f220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1f230 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
1f240 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  nixShmMap     0.
1f250 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
1f260 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
1f270 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  ne unixShmBarrie
1f280 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  r 0.# define uni
1f290 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65  xShmUnmap   0.#e
1f2a0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
1f2b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
1f2c0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  */../*.** Here e
1f2d0 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
1f2e0 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
1f2f0 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
1f300 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
1f310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
1f320 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
1f330 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1f340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f350 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1f360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f3a0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
1f3b0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
1f3c0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
1f3d0 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
1f3e0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
1f3f0 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
1f400 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
1f410 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
1f420 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
1f430 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
1f440 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
1f450 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
1f460 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
1f470 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
1f480 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
1f490 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
1f4a0 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
1f4b0 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1f4c0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
1f4d0 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
1f4e0 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
1f4f0 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
1f500 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
1f510 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
1f520 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
1f530 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
1f540 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
1f550 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
1f560 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
1f570 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f580 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
1f590 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
1f5a0 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
1f5b0 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
1f5c0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
1f5d0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
1f5e0 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
1f5f0 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
1f600 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
1f610 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
1f620 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
1f630 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
1f640 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
1f650 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74  der-funtion F, t
1f660 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
1f670 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
1f680 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
1f690 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
1f6a0 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
1f6b0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
1f6c0 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
1f6d0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1f6e0 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
1f6f0 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
1f700 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
1f710 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
1f720 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
1f730 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
1f740 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
1f750 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
1f760 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
1f770 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
1f780 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
1f790 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
1f7a0 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
1f7b0 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
1f7c0 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
1f7d0 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
1f7e0 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
1f7f0 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
1f800 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
1f810 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
1f820 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
1f830 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
1f840 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1f850 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
1f860 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
1f870 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
1f880 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
1f890 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
1f8a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
1f8b0 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
1f8c0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1f8d0 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
1f8e0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
1f8f0 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
1f900 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
1f910 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
1f920 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
1f930 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
1f940 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e   METHOD, VERSION
1f950 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  , CLOSE, LOCK, U
1f960 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20  NLOCK, CKLOCK)  
1f970 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
1f980 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1f990 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c     \.   VERSION,
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
1f9f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fb00 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
1fb10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fb20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fb50 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb70 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1fba0 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fbc0 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1fbf0 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc10 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1fc40 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fc60 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
1fc90 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
1fca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1fcb0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1fcc0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1fcd0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1fce0 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
1fcf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1fd00 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1fd30 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
1fd40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1fd50 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1fd80 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1fd90 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
1fda0 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
1fdb0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1fdc0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1fdd0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
1fde0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
1fdf0 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
1fe20 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
1fe30 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
1fe40 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
1fe70 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
1fe80 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
1fe90 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ier */          
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55     \.   unixShmU
1fec0 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20 20  nmap            
1fed0 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
1fee0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
1ff60 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1ff70 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
1ff80 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1ff90 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20  unixFile *p){   
1ffa0 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
1ffb0 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
1ffc0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fff0 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
20000 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
20040 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
20090 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
200a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
200b0 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
200c0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
200d0 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20  File *p)    \.  
200e0 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
200f0 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
20100 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
20110 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
20120 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
20130 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
20140 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
20150 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
20160 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
20170 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
20180 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
20190 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
201a0 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
201b0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
201c0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
201d0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
201e0 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
201f0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
20200 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
20210 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20  ct name */.  2, 
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20230 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
20240 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c   memory is enabl
20250 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
20260 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20270 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
20280 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
20290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
202a0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
202b0 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  d */.  unixUnloc
202c0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
202d0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
202e0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
202f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
20300 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
20310 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
20320 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
20330 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c   nolockIoFinder,
20340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20350 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
20360 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  me */.  nolockIo
20370 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
20380 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
20390 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
203a0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
203d0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
203e0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  */.  nolockClose
203f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
20400 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
20410 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c  */.  nolockLock,
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20430 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
20440 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  /.  nolockUnlock
20450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
20460 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
20470 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b  */.  nolockCheck
20480 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f  ReservedLock   /
20490 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
204a0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
204b0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f  .IOMETHODS(.  do
204c0 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  tlockIoFinder,  
204d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
204e0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
204f0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65  */.  dotlockIoMe
20500 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f  thods,         /
20510 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
20520 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
20530 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
20560 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
20570 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20    dotlockClose, 
20580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20590 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
205a0 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20    dotlockLock,  
205b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
205c0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
205d0 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20   dotlockUnlock, 
205e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
205f0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
20600 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65    dotlockCheckRe
20610 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78  servedLock  /* x
20620 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20630 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23  k method */.)..#
20640 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
20650 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
20660 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  & !OS_VXWORKS.IO
20670 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b  METHODS(.  flock
20680 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
20690 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
206a0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
206b0 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73    flockIoMethods
206c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
206d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
206e0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
206f0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20710 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
20720 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66   disabled */.  f
20730 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
20740 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
20750 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  se method */.  f
20760 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
20770 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
20780 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
20790 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
207a0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
207b0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
207c0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
207d0 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65  dLock    /* xChe
207e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
207f0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
20800 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f..#if OS_VXWORK
20810 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73  S.IOMETHODS(.  s
20820 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  emIoFinder,     
20830 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
20840 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
20850 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f   */.  semIoMetho
20860 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
20870 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
20880 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
20890 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
208c0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
208d0 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20  .  semClose,    
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
208f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
20900 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20  .  semLock,     
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20920 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
20930 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20    semUnlock,    
20940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20950 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
20960 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  .  semCheckReser
20970 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
20980 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
20990 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
209a0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
209b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
209c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
209d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
209e0 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46  ETHODS(.  afpIoF
209f0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
20a00 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
20a10 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
20a20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20   afpIoMethods,  
20a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
20a40 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
20a50 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
20a60 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
20a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
20a80 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
20a90 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66  disabled */.  af
20aa0 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  pClose,         
20ab0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
20ac0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  e method */.  af
20ad0 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  pLock,          
20ae0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
20af0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
20b00 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
20b10 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
20b20 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
20b30 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
20b40 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
20b50 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
20b60 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
20b70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
20b80 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  y locking method
20b90 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74   is a "super-met
20ba0 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73  hod" in the sens
20bb0 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65  e that it.** ope
20bc0 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ns secondary fil
20bd0 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
20be0 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20  r the conch and 
20bf0 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a  lock files and.*
20c00 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c  * it uses proxy,
20c10 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20   dot-file, AFP, 
20c20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  and flock() lock
20c30 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74  ing methods on t
20c40 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72  hose.** secondar
20c50 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68  y files.  For th
20c60 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
20c70 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
20c80 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79  lements.** proxy
20c90 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61   locking is loca
20ca0 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72  ted much further
20cb0 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c   down in the fil
20cc0 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a  e.  But we need.
20cd0 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ** to go ahead a
20ce0 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71  nd define the sq
20cf0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
20d00 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63   and finder func
20d10 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78  tion.** for prox
20d20 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20  y locking here. 
20d30 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64   So we forward d
20d40 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d  eclare the I/O m
20d50 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64  ethods..*/.#if d
20d60 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
20d70 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
20d80 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
20d90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
20da0 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
20db0 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
20dc0 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
20dd0 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
20de0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
20df0 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
20e00 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
20e10 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
20e20 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
20e30 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
20e40 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  t*);.IOMETHODS(.
20e50 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c    proxyIoFinder,
20e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20e70 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
20e80 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f  ame */.  proxyIo
20e90 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
20ea0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
20eb0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
20ec0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ee0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
20ef0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
20f00 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65   */.  proxyClose
20f10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20f20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
20f30 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c   */.  proxyLock,
20f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f50 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
20f60 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b  */.  proxyUnlock
20f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
20f80 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
20f90 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b   */.  proxyCheck
20fa0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
20fb0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
20fc0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
20fd0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73  ).#endif../* nfs
20fe0 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30   lockd on OSX 10
20ff0 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61  .3+ doesn't clea
21000 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68  r write locks wh
21010 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
21020 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66  s set */.#if def
21030 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
21040 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
21050 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
21060 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49  OMETHODS(.  nfsI
21070 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
21080 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
21090 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
210a0 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73  /.  nfsIoMethods
210b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
210c0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
210d0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
210e0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
21110 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
21120 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21140 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
21150 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21170 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
21180 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20  /.  nfsUnlock,  
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
211a0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
211b0 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
211c0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
211d0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
211e0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
211f0 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
21200 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
21210 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
21220 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
21230 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69  ./* .** This "fi
21240 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61  nder" function a
21250 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72  ttempts to deter
21260 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f  mine the best lo
21270 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a  cking strategy .
21280 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ** for the datab
21290 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61  ase file "filePa
212a0 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65  th".  It then re
212b0 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65  turns the sqlite
212c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
212d0 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c  object that impl
212e0 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61  ements that stra
212f0 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tegy..**.** This
21300 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f   is for MacOSX o
21310 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
21320 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
21330 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
21340 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
21350 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
21360 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
21370 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21380 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
21390 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
213a0 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c       /* open fil
213b0 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  e object for the
213c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
213d0 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
213e0 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69  nst struct Mappi
213f0 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ng {.    const c
21400 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d  har *zFilesystem
21410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21420 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70  * Filesystem typ
21430 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f  e name */.    co
21440 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
21450 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73  ethods *pMethods
21460 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61  ;   /* Appropria
21470 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  te locking metho
21480 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20  d */.  } aMap[] 
21490 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c  = {.    { "hfs",
214a0 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
214b0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66  ods },.    { "uf
214c0 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
214d0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
214e0 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f  "afpfs",  &afpIo
214f0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
21500 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49   "smbfs",  &afpI
21510 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
21520 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c  { "webdav", &nol
21530 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  ockIoMethods },.
21540 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d      { 0, 0 }.  }
21550 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
21560 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
21570 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  o;.  struct floc
21580 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
21590 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
215a0 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
215b0 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
215c0 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
215d0 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
215e0 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
215f0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
21600 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
21610 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
21620 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
21630 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66  .  }.  if( statf
21640 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49  s(filePath, &fsI
21650 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20  nfo) != -1 ){.  
21660 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66    if( fsInfo.f_f
21670 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c  lags & MNT_RDONL
21680 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  Y ){.      retur
21690 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
216a0 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ds;.    }.    fo
216b0 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a  r(i=0; aMap[i].z
216c0 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29  Filesystem; i++)
216d0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
216e0 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
216f0 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e  pename, aMap[i].
21700 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20  zFilesystem)==0 
21710 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21720 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f  n aMap[i].pMetho
21730 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ds;.      }.    
21740 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61  }.  }..  /* Defa
21750 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65  ult case. Handle
21760 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72  s, amongst other
21770 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54  s, "nfs"..  ** T
21780 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  est byte-range l
21790 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  ock using fcntl(
217a0 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73  ). If the call s
217b0 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61  ucceeds, .  ** a
217c0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
217d0 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
217e0 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20  rts POSIX style 
217f0 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c  locks. .  */.  l
21800 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
21810 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
21820 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
21830 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
21840 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
21850 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
21860 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63  _RDLCK;.  if( fc
21870 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
21880 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
21890 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28  !=-1 ) {.    if(
218a0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
218b0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66  _fstypename, "nf
218c0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
218d0 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74  return &nfsIoMet
218e0 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65  hods;.    } else
218f0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
21900 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
21910 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21920 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c      return &dotl
21930 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
21940 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
21950 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21960 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
21970 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
21980 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
21990 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
219a0 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
219b0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
219c0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
219d0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
219e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
219f0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
21a00 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
21a10 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
21a20 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
21a30 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
21a40 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
21a50 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
21a60 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
21a70 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
21a80 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
21a90 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
21aa0 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
21ab0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
21ac0 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
21ad0 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
21ae0 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
21af0 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f  is for VXWorks o
21b00 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
21b10 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
21b20 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
21b30 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
21b40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
21b50 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
21b60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21b70 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
21b80 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
21b90 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e       /* the open
21ba0 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   file object */.
21bb0 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
21bc0 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
21bd0 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
21be0 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
21bf0 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
21c00 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
21c10 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
21c20 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
21c30 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
21c40 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
21c50 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
21c60 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
21c70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
21c80 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75  if fcntl() is su
21c90 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20  pported and use 
21ca0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
21cb0 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  s..  ** Otherwis
21cc0 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  e fall back to t
21cd0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
21ce0 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a  re method..  */.
21cf0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
21d00 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
21d10 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
21d20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
21d30 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
21d40 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
21d50 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
21d60 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20   fcntl(pNew->h, 
21d70 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
21d80 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
21d90 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
21da0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
21db0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
21dc0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
21dd0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
21de0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
21df0 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
21e00 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
21e10 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
21e20 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
21e30 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
21e40 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
21e50 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
21e60 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
21e70 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  LE */../*.** An 
21e80 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
21e90 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
21ea0 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
21eb0 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
21ec0 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
21ed0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
21ee0 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
21ef0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
21f00 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
21f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f50 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
21f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f70 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
21f80 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
21f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21fa0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
21fb0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
21fc0 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
21fd0 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
21fe0 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
21ff0 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
22000 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
22010 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
22020 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
22030 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
22040 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
22050 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
22060 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
22070 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
22080 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22090 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
220a0 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
220b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
220c0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
220d0 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
220e0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
220f0 74 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20  t dirfd,        
22100 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
22110 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
22120 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
22130 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
22140 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
22150 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
22160 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
22170 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
22180 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
22190 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
221a0 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  pened */.  int n
221b0 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  oLock,          
221c0 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69     /* Omit locki
221d0 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ng if true */.  
221e0 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
221f0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
22200 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
22210 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ue */.){.  const
22220 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22230 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
22240 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
22250 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
22260 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
22270 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
22280 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
22290 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
222a0 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69    /* Parameter i
222b0 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20  sDelete is only 
222c0 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  used on vxworks.
222d0 20 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78   Express this ex
222e0 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68  plicitly .  ** h
222f0 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63  ere to prevent c
22300 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
22310 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61   about unused pa
22320 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
22330 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22340 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20  R(isDelete);..  
22350 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
22360 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
22370 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
22380 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
22390 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
223a0 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
223b0 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
223c0 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
223d0 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
223e0 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
223f0 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
22400 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
22410 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
22420 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
22430 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
22440 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
22450 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
22460 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
22470 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
22480 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
22490 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
224a0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
224b0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
224c0 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
224d0 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
224e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
224f0 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
22500 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
22510 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
22520 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20    pNew->dirfd = 
22530 64 69 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e 66  dirfd;.  pNew->f
22540 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  ileFlags = 0;.  
22550 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46  pNew->zPath = zF
22560 69 6c 65 6e 61 6d 65 3b 0a 0a 23 69 66 20 4f 53  ilename;..#if OS
22570 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d  _VXWORKS.  pNew-
22580 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69  >pId = vxworksFi
22590 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61  ndFileId(zFilena
225a0 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  me);.  if( pNew-
225b0 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  >pId==0 ){.    n
225c0 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72  oLock = 1;.    r
225d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
225e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
225f0 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20  if( noLock ){.  
22600 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
22610 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  = &nolockIoMetho
22620 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
22630 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
22640 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65   (**(finder_type
22650 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  *)pVfs->pAppData
22660 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  )(zFilename, pNe
22670 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  w);.#if SQLITE_E
22680 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
22690 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65  YLE.    /* Cache
226a0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68   zFilename in th
226b0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
226c0 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f  t (AFP and dotlo
226d0 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72  ck override) for
226e0 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63  .    ** proxyLoc
226f0 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20  k activation is 
22700 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65  possible (remote
22710 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20   proxy is based 
22720 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20  on db name).    
22730 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d  ** zFilename rem
22740 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
22750 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c   file is closed,
22760 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20   to support */. 
22770 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
22780 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a  Context = (void*
22790 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64  )zFilename;.#end
227a0 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  if.  }..  if( pL
227b0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
227c0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23  posixIoMethods.#
227d0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
227e0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
227f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
22800 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63  TYLE.    || pLoc
22810 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66  kingStyle == &nf
22820 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69  sIoMethods.#endi
22830 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45  f.  ){.    unixE
22840 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
22850 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
22860 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
22870 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
22880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22890 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
228a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
228b0 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  in findInodeInfo
228c0 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
228d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
228e0 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
228f0 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
22900 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
22910 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
22920 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a  may fail.      *
22930 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  * in two scenari
22940 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  os:.      **.   
22950 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61     **   (a) A ca
22960 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61  ll to fstat() fa
22970 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20  iled..      **  
22980 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61   (b) A malloc fa
22990 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  iled..      **. 
229a0 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f       ** Scenario
229b0 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63   (b) may only oc
229c0 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65  cur if the proce
229d0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f  ss is holding no
229e0 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
229f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
22a00 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
22a10 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
22a20 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65   were other file
22a30 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
22a40 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69  ptors on this fi
22a50 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c  le, then no mall
22a60 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  oc would be requ
22a70 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
22a80 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
22a90 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
22aa0 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
22ab0 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
22ac0 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
22ad0 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
22ae0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
22af0 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
22b00 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
22b10 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
22b20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
22b30 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
22b40 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
22b50 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
22b60 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
22b70 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
22b80 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
22b90 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
22ba0 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
22bb0 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
22bc0 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
22bd0 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
22be0 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
22bf0 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
22c00 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
22c10 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
22c20 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
22c30 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
22c40 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   h = -1;.    }. 
22c50 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
22c60 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  x();.  }..#if SQ
22c70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
22c80 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
22c90 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
22ca0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
22cb0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70  ingStyle == &afp
22cc0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
22cd0 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20   /* AFP locking 
22ce0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
22cf0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
22d00 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
22d10 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c  .    ** the afpL
22d20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20  ockingContext.. 
22d30 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63     */.    afpLoc
22d40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
22d50 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  x;.    pNew->loc
22d60 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
22d70 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
22d80 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  loc( sizeof(*pCt
22d90 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
22da0 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
22db0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
22dc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22dd0 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
22de0 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
22df0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
22e00 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
22e10 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
22e20 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
22e30 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
22e40 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
22e50 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
22e60 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
22e70 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
22e80 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
22e90 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
22ea0 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
22eb0 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
22ec0 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
22ed0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
22ee0 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
22ef0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
22f00 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
22f10 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
22f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22f40 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
22f50 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
22f60 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
22f70 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
22f80 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
22f90 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
22fa0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
22fb0 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
22fc0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
22fd0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
22fe0 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
22ff0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
23000 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
23010 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
23020 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
23030 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
23040 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
23050 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
23060 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
23070 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
23080 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
23090 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c  lename;.    nFil
230a0 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72  ename = (int)str
230b0 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  len(zFilename) +
230c0 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c   6;.    zLockFil
230d0 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
230e0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65  te3_malloc(nFile
230f0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  name);.    if( z
23100 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  LockFile==0 ){. 
23110 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23120 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
23130 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
23140 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e  _snprintf(nFilen
23150 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20  ame, zLockFile, 
23160 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  "%s" DOTLOCK_SUF
23170 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  FIX, zFilename);
23180 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
23190 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
231a0 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d  = zLockFile;.  }
231b0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
231c0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
231d0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65  kingStyle == &se
231e0 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  mIoMethods ){.  
231f0 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70    /* Named semap
23200 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  hore locking use
23210 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
23220 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
23230 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65  e.    ** include
23240 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b  d in the semLock
23250 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a  ingContext.    *
23260 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  /.    unixEnterM
23270 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
23280 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
23290 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
232a0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  de);.    if( (rc
232b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
232c0 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70  (pNew->pInode->p
232d0 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20  Sem==NULL) ){.  
232e0 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61      char *zSemNa
232f0 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  me = pNew->pInod
23300 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20  e->aSemName;.   
23310 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
23320 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
23330 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
23340 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65  SemName, "/%s.se
23350 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  m",.            
23360 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
23370 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
23380 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  Name);.      for
23390 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b  ( n=1; zSemName[
233a0 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20  n]; n++ ).      
233b0 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e    if( zSemName[n
233c0 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d  ]=='/' ) zSemNam
233d0 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20  e[n] = '_';.    
233e0 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
233f0 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28  pSem = sem_open(
23400 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41  zSemName, O_CREA
23410 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20  T, 0666, 1);.   
23420 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e     if( pNew->pIn
23430 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d  ode->pSem == SEM
23440 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
23450 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
23460 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e  OMEM;.        pN
23470 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d  ew->pInode->aSem
23480 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  Name[0] = '\0';.
23490 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
234a0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
234b0 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ();.  }.#endif. 
234c0 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72   .  pNew->lastEr
234d0 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f  rno = 0;.#if OS_
234e0 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
234f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23500 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
23510 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
23520 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
23530 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 75     h = -1;.    u
23540 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
23550 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d  ;.    isDelete =
23560 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
23570 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c  isDelete = isDel
23580 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ete;.#endif.  if
23590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
235a0 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  ){.    if( dirfd
235b0 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
235c0 73 65 28 70 4e 65 77 2c 20 64 69 72 66 64 2c 20  se(pNew, dirfd, 
235d0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 69  __LINE__);.    i
235e0 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
235f0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
23600 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c  __LINE__);.  }el
23610 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  se{.    pNew->pM
23620 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67  ethod = pLocking
23630 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43  Style;.    OpenC
23640 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a  ounter(+1);.  }.
23650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23660 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
23670 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
23680 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
23690 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46  ntaining file zF
236a0 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73  ilename..** If s
236b0 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20  uccessful, *pFd 
236c0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70  is set to the op
236d0 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ened file descri
236e0 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ptor and.** SQLI
236f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
23700 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
23710 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51  ccurs, either SQ
23720 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72  LITE_NOMEM.** or
23730 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
23740 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
23750 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
23760 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20  an undefined.** 
23770 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  value..**.** If 
23780 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
23790 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
237a0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
237b0 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
237c0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
237d0 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
237e0 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
237f0 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
23800 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
23810 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
23820 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
23830 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
23840 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
23850 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
23860 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
23870 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
23880 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
23890 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
238a0 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
238b0 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
238c0 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >1 && zDirname[i
238d0 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
238e0 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
238f0 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
23900 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20   '\0';.    fd = 
23910 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f  open(zDirname, O
23920 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59  _RDONLY|O_BINARY
23930 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
23940 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44  >=0 ){.#ifdef FD
23950 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66  _CLOEXEC.      f
23960 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
23970 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  , fcntl(fd, F_GE
23980 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
23990 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
239a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
239b0 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
239c0 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29  , fd, zDirname))
239d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
239e0 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72  Fd = fd;.  retur
239f0 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f  n (fd>=0?SQLITE_
23a00 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  OK:unixLogError(
23a10 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
23a20 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44  BKPT, "open", zD
23a30 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a  irname));.}../*.
23a40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
23a50 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
23a60 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75  y in which to pu
23a70 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
23a80 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  s..** If no suit
23a90 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  able temporary f
23aa0 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61  ile directory ca
23ab0 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
23ac0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
23ad0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
23ae0 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76  nixTempFileDir(v
23af0 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
23b00 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
23b10 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
23b20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
23b30 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
23b40 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
23b50 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20  /tmp",.     0   
23b60 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72       /* List ter
23b70 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a  minator */.  };.
23b80 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
23b90 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
23ba0 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
23bb0 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
23bc0 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69  azDirs[0] = sqli
23bd0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
23be0 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ry;.  if( !azDir
23bf0 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
23c00 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
23c10 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  R");.  for(i=0; 
23c20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
23c30 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
23c40 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
23c50 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a  i++]){.    if( z
23c60 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
23c70 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28  e;.    if( stat(
23c80 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f  zDir, &buf) ) co
23c90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
23ca0 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
23cb0 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  mode) ) continue
23cc0 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73  ;.    if( access
23cd0 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e  (zDir, 07) ) con
23ce0 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b  tinue;.    break
23cf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
23d00 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  Dir;.}../*.** Cr
23d10 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
23d20 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
23d30 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
23d40 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
23d50 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
23d60 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
23d70 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
23d80 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
23d90 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
23da0 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
23db0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
23dc0 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
23dd0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
23de0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
23df0 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
23e00 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
23e10 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
23e20 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
23e30 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
23e40 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
23e50 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
23e60 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
23e70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
23e80 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  r;..  /* It's od
23e90 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
23ea0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
23eb0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
23ec0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
23ed0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
23ee0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
23ef0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
23f00 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
23f10 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
23f20 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
23f30 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
23f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
23f50 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d  ERR );..  zDir =
23f60 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
23f70 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d  ();.  if( zDir==
23f80 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  0 ) zDir = ".";.
23f90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
23fa0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
23fb0 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
23fc0 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
23fd0 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
23fe0 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
23ff0 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
24000 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
24010 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
24020 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
24030 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
24040 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69  IX) + 17) >= (si
24050 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20  ze_t)nBuf ){.   
24060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24070 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
24080 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
24090 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a  rintf(nBuf-17, z
240a0 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
240b0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
240c0 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
240d0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  = (int)strlen(zB
240e0 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
240f0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
24100 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
24110 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
24120 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
24130 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
24140 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
24150 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
24160 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
24170 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
24180 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  zBuf[j] = 0;.  }
24190 77 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42  while( access(zB
241a0 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
241b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
241c0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
241d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
241e0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
241f0 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52  APPLE__)./*.** R
24200 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66  outine to transf
24210 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69  orm a unixFile i
24220 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b  nto a proxy-lock
24230 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a  ing unixFile..**
24240 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
24250 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63  in the proxy-loc
24260 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20  k division, but 
24270 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  used by unixOpen
24280 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ().** if SQLITE_
24290 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
242a0 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e  KING is defined.
242b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
242c0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
242d0 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c  xFile(unixFile*,
242e0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23   const char*);.#
242f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  endif../*.** Sea
24300 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
24310 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
24320 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65  r that was opene
24330 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
24340 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20  e .** file (not 
24350 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73  a journal or mas
24360 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
24370 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  ) identified by 
24380 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74  pathname.** zPat
24390 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50  h with SQLITE_OP
243a0 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74  EN_XXX flags mat
243b0 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73  ching those pass
243c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
243d0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
243e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
243f0 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65  *.** Such a file
24400 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20   descriptor may 
24410 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62  exist if a datab
24420 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ase connection w
24430 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74  as closed.** but
24440 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
24450 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
24460 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f  could not be clo
24470 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65  sed because some
24480 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64  .** other file d
24490 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
244a0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  n the same file 
244b0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c  is holding a fil
244c0 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72  e-lock..** Refer
244d0 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   to comments in 
244e0 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20  the unixClose() 
244f0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  function and the
24500 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74   lengthy comment
24510 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22  .** describing "
24520 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
24530 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73  ocking" at the s
24540 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c  tart of this fil
24550 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65  e for .** furthe
24560 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c  r details. Also,
24570 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a   ticket #4018..*
24580 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62  *.** If a suitab
24590 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
245a0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
245b0 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  n it is returned
245c0 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20  . If no.** such 
245d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
245e0 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69  is located, -1 i
245f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
24600 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64  tatic UnixUnused
24610 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65  Fd *findReusable
24620 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Fd(const char *z
24630 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29  Path, int flags)
24640 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  {.  UnixUnusedFd
24650 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a   *pUnused = 0;..
24660 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72    /* Do not sear
24670 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
24680 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
24690 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74   on vxworks. Not
246a0 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78   because.  ** vx
246b0 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20  works would not 
246c0 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65  benefit from the
246d0 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68   change (it migh
246e0 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72  t, we're not sur
246f0 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63  e),.  ** but bec
24700 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74  ause no way to t
24710 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e  est it is curren
24720 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49  tly available. I
24730 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a  t is better .  *
24740 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72  * not to risk br
24750 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73  eaking vxworks s
24760 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73  upport for the s
24770 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f  ake of such an o
24780 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61  bscure .  ** fea
24790 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f  ture.  */.#if !O
247a0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
247b0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247d0 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73   /* Results of s
247e0 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20  tat() call */.. 
247f0 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c   /* A stat() cal
24800 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76  l may fail for v
24810 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20  arious reasons. 
24820 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
24830 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f   it is.  ** almo
24840 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  st certain that 
24850 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f  an open() call o
24860 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20  n the same path 
24870 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a  will also fail..
24880 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65    ** For this re
24890 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f  ason, if an erro
248a0 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
248b0 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65  stat() call here
248c0 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e  , it is.  ** ign
248d0 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72  ored and -1 is r
248e0 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
248f0 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20  ler will try to 
24900 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a  open a new file.
24910 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
24920 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
24930 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75  , fail, and retu
24940 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
24950 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  QLite..  **.  **
24960 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65   Even if a subse
24970 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c  quent open() cal
24980 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20  l does succeed, 
24990 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73  the consequences
249a0 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61   of.  ** not sea
249b0 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73  rching for a res
249c0 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  usable file desc
249d0 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64  riptor are not d
249e0 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30  ire.  */.  if( 0
249f0 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20 26 73  ==stat(zPath, &s
24a00 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69  Stat) ){.    uni
24a10 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
24a20 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74  de;..    unixEnt
24a30 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70  erMutex();.    p
24a40 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73  Inode = inodeLis
24a50 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49  t;.    while( pI
24a60 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d  node && (pInode-
24a70 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74  >fileId.dev!=sSt
24a80 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20  at.st_dev.      
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
24aa0 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  | pInode->fileId
24ab0 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69  .ino!=sStat.st_i
24ac0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49  no) ){.       pI
24ad0 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
24ae0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
24af0 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
24b00 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
24b10 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72   **pp;.      for
24b20 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e  (pp=&pInode->pUn
24b30 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70  used; *pp && (*p
24b40 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73  p)->flags!=flags
24b50 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
24b60 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e  ext));.      pUn
24b70 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20  used = *pp;.    
24b80 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
24b90 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70  .        *pp = p
24ba0 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20  Unused->pNext;. 
24bb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24bc0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
24bd0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20  );.  }.#endif   
24be0 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52   /* if !OS_VXWOR
24bf0 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  KS */.  return p
24c00 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Unused;.}../*.**
24c10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
24c20 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78  s called by unix
24c30 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d  Open() to determ
24c40 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72  ine the unix per
24c50 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63  missions.** to c
24c60 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20  reate new files 
24c70 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f  with. If no erro
24c80 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
24c90 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24ca0 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61  rned.** and a va
24cb0 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  lue suitable for
24cc0 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20   passing as the 
24cd0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
24ce0 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20  o open(2) is.** 
24cf0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64  written to *pMod
24d00 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  e. If an IO erro
24d10 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
24d20 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
24d30 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  s .** returned a
24d40 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
24d50 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f  *pMode is not mo
24d60 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
24d70 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
24d80 6f 70 65 6e 65 64 20 69 73 20 61 20 74 65 6d 70  opened is a temp
24d90 6f 72 61 72 79 20 66 69 6c 65 2c 20 69 74 20 69  orary file, it i
24da0 73 20 61 6c 77 61 79 73 20 63 72 65 61 74 65 64  s always created
24db0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f 63 74   with.** the oct
24dc0 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 30  al permissions 0
24dd0 36 30 30 20 28 72 65 61 64 2f 77 72 69 74 61 62  600 (read/writab
24de0 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e 6c 79  le by owner only
24df0 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a  ). If the file.*
24e00 2a 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  * is a database 
24e10 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  or master journa
24e20 6c 20 66 69 6c 65 2c 20 69 74 20 69 73 20 63 72  l file, it is cr
24e30 65 61 74 65 64 20 77 69 74 68 20 74 68 65 20 70  eated with the p
24e40 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 6d  ermissions .** m
24e50 61 73 6b 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ask SQLITE_DEFAU
24e60 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
24e70 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  ONS..**.** Final
24e80 6c 79 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ly, if the file 
24e90 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20  being opened is 
24ea0 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72  a WAL or regular
24eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
24ec0 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e  hen .** this fun
24ed0 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68  ction queries th
24ee0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
24ef0 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  r the permission
24f00 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72  s on the .** cor
24f10 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62  responding datab
24f20 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ase file and set
24f30 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73  s *pMode to this
24f40 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72   value. Whenever
24f50 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57   .** possible, W
24f60 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  AL and journal f
24f70 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
24f80 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
24f90 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20  permissions .** 
24fa0 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  as the associate
24fb0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
24fc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
24fd0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
24fe0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
24ff0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
25000 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
25010 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
25020 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
25030 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
25060 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
25070 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
25080 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
250b0 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
250c0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20  ile with */.){. 
250d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
250e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
250f0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
25100 2a 2f 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  */.  if( flags &
25110 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
25120 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
25130 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
25140 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f     char zDb[MAX_
25150 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20  PATHNAME+1];    
25160 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
25170 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
25180 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20  t nDb;          
25190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
251a0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62  umber of valid b
251b0 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20  ytes in zDb */. 
251c0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
251d0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
251e0 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74   /* Output of st
251f0 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65  at() on database
25200 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
25210 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68   zPath is a path
25220 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75   to a WAL or jou
25230 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66  rnal file. The f
25240 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64  ollowing block d
25250 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68  erives.    ** th
25260 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73  e path to the as
25270 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
25280 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74  e file from zPat
25290 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  h. This block ha
252a0 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  ndles.    ** the
252b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e   following namin
252c0 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20  g conventions:. 
252d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22     **.    **   "
252e0 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
252f0 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  rnal".    **   "
25300 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
25310 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
25320 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
25330 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20  -NNNN".    **   
25340 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
25350 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20  l-NNNN".    **. 
25360 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 4e 4e     ** where NNNN
25370 20 69 73 20 61 20 34 20 64 69 67 69 74 20 64 65   is a 4 digit de
25380 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68  cimal number. Th
25390 65 20 4e 4e 4e 4e 20 6e 61 6d 69 6e 67 20 73 63  e NNNN naming sc
253a0 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a  hemes are .    *
253b0 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  * used by the te
253c0 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d  st_multiplex.c m
253d0 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  odule..    */.  
253e0 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53    nDb = sqlite3S
253f0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d  trlen30(zPath) -
25400 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20   1; .    while( 
25410 6e 44 62 3e 30 20 26 26 20 7a 50 61 74 68 5b 6e  nDb>0 && zPath[n
25420 44 62 5d 21 3d 27 6c 27 20 29 20 6e 44 62 2d 2d  Db]!='l' ) nDb--
25430 3b 0a 20 20 20 20 6e 44 62 20 2d 3d 20 28 28 66  ;.    nDb -= ((f
25440 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
25450 45 4e 5f 57 41 4c 29 20 3f 20 33 20 3a 20 37 29  EN_WAL) ? 3 : 7)
25460 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  ;.    memcpy(zDb
25470 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20  , zPath, nDb);. 
25480 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c     zDb[nDb] = '\
25490 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d  0';..    if( 0==
254a0 73 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74  stat(zDb, &sStat
254b0 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64  ) ){.      *pMod
254c0 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
254d0 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 7d 65  e & 0777;.    }e
254e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
254f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
25500 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AT;.    }.  }els
25510 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
25520 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
25530 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a  ONCLOSE ){.    *
25540 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20  pMode = 0600;.  
25550 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4d 6f 64  }else{.    *pMod
25560 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
25570 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
25580 4f 4e 53 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ONS;.  }.  retur
25590 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
255a0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
255b0 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
255c0 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
255d0 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
255e0 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
255f0 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
25600 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
25610 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
25620 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
25630 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
25640 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
25650 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
25660 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
25670 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
25680 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
25690 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
256a0 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
256b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
256c0 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
256d0 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
256e0 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
256f0 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
25700 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
25710 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
25720 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
25730 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
25740 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
25750 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
25760 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
25770 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
25780 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
25790 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
257a0 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
257b0 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
257c0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
257d0 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
257e0 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
257f0 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
25800 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
25810 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
25820 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
25830 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
25840 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
25850 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
25860 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
25870 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
25880 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
25890 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
258a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
258b0 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
258c0 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
258d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
258e0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
258f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
25900 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
25910 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
25920 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
25930 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
25940 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
25950 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
25960 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
25970 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
25980 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
25990 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
259a0 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
259b0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
259c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
259d0 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
259e0 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
259f0 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   core */.){.  un
25a00 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
25a10 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  xFile *)pFile;. 
25a20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20   int fd = -1;   
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a40 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
25a50 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
25a60 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64  pen() */.  int d
25a70 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  irfd = -1;      
25a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
25a90 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
25aa0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
25ab0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20  openFlags = 0;  
25ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
25ad0 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
25ae0 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
25af0 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
25b00 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
25b10 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
25b20 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  n */.  int noLoc
25b30 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
25b40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
25b50 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
25b60 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
25b70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25b90 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
25ba0 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  Code */..  int i
25bb0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
25bc0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
25bd0 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
25be0 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
25bf0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
25c00 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
25c10 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
25c20 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
25c30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
25c40 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
25c50 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
25c60 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25c70 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
25c80 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
25c90 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
25ca0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
25cb0 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54  RITE);.#if SQLIT
25cc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
25cd0 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41  _STYLE.  int isA
25ce0 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61  utoProxy  = (fla
25cf0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
25d00 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e  _AUTOPROXY);.#en
25d10 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65  dif..  /* If cre
25d20 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f  ating a master o
25d30 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72  r main-file jour
25d40 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nal, this functi
25d50 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a  on will open.  *
25d60 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70  * a file-descrip
25d70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63  tor on the direc
25d80 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69  tory too. The fi
25d90 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e  rst time unixSyn
25da0 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  c().  ** is call
25db0 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ed the directory
25dc0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
25dd0 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29   will be fsync()
25de0 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e  ed and close()d.
25df0 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70  .  */.  int isOp
25e00 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28 69  enDirectory = (i
25e10 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
25e20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
25e30 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
25e40 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
25e50 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
25e60 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
25e70 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
25e80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
25e90 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
25ea0 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
25eb0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
25ec0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25ed0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
25ee0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
25ef0 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
25f00 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
25f10 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
25f20 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
25f30 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
25f40 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e  THNAME+1];.  con
25f50 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
25f60 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
25f70 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
25f80 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
25f90 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
25fa0 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
25fb0 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
25fc0 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
25fd0 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
25fe0 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
25ff0 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
26000 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
26010 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
26020 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
26030 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
26040 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
26050 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
26060 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
26070 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
26080 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
26090 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
260a0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
260b0 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
260c0 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
260d0 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
260e0 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
260f0 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
26100 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
26110 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
26120 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
26130 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
26140 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
26150 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
26160 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
26170 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
26180 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
26190 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
261a0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
261b0 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
261c0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
261d0 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
261e0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
261f0 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
26200 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
26210 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
26220 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
26230 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
26240 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
26250 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
26260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
26270 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
26280 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
26290 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
262a0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
262b0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
262c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
262d0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
262e0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
262f0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
26300 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
26310 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
26320 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
26330 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
26340 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
26350 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
26360 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
26370 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
26380 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
26390 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
263a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
263b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
263c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
263d0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
263e0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
263f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
26400 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
26410 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
26420 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
26430 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
26440 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
26450 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
26460 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
26470 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d  _WAL.  );..  mem
26480 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
26490 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20  (unixFile));..  
264a0 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
264b0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
264c0 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64  {.    UnixUnused
264d0 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20  Fd *pUnused;.   
264e0 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
264f0 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c  eusableFd(zName,
26500 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
26510 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
26520 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
26530 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  fd;.    }else{. 
26540 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73       pUnused = s
26550 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
26560 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
26570 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75  .      if( !pUnu
26580 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sed ){.        r
26590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
265a0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
265b0 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  }.    p->pUnused
265c0 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 7d 65   = pUnused;.  }e
265d0 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  lse if( !zName )
265e0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
265f0 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75  e is NULL, the u
26600 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65  pper layer is re
26610 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20  questing a temp 
26620 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
26630 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
26640 21 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  !isOpenDirectory
26650 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  );.    rc = unix
26660 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  GetTempname(MAX_
26670 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70  PATHNAME+1, zTmp
26680 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
26690 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
266a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
266b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
266c0 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
266d0 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
266e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
266f0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
26700 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
26710 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
26720 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
26730 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
26740 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
26750 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
26760 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
26770 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
26780 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
26790 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
267a0 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
267b0 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
267c0 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
267d0 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
267e0 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
267f0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
26800 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
26810 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
26820 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
26830 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
26840 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
26850 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
26860 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
26870 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
26880 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
26890 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
268a0 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
268b0 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
268c0 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
268d0 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  nMode;          
268e0 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
268f0 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c  ns to create fil
26900 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 72 63  e with */.    rc
26910 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c   = findCreateFil
26920 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61  eMode(zName, fla
26930 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a  gs, &openMode);.
26940 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
26960 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73  ssert( !p->pUnus
26970 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ed );.      asse
26980 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
26990 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54  E_OPEN_WAL || eT
269a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
269b0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
269c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
269d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d  ;.    }.    fd =
269e0 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65   open(zName, ope
269f0 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
26a00 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
26a10 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
26a20 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
26a30 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b  me, openFlags));
26a40 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
26a50 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26   errno!=EISDIR &
26a60 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  & isReadWrite &&
26a70 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
26a80 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64  .      /* Failed
26a90 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
26aa0 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
26ab0 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
26ac0 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  d-only. */.     
26ad0 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
26ae0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
26af0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
26b00 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65  EATE);.      ope
26b10 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44  nFlags &= ~(O_RD
26b20 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20  WR|O_CREAT);.   
26b30 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
26b40 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
26b50 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
26b60 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
26b70 20 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a       fd = open(z
26b80 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
26b90 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
26ba0 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  }.    if( fd<0 )
26bb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
26bc0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
26bd0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
26be0 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a  "open", zName);.
26bf0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
26c00 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
26c10 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
26c20 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
26c30 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
26c40 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
26c50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
26c60 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
26c70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
26c80 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
26c90 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
26ca0 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
26cb0 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
26cc0 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
26cd0 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73  th = zName;.#els
26ce0 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61  e.    unlink(zNa
26cf0 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  me);.#endif.  }.
26d00 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
26d10 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
26d20 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f    else{.    p->o
26d30 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
26d40 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  lags;.  }.#endif
26d50 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69  ..  if( isOpenDi
26d60 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72  rectory ){.    r
26d70 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  c = openDirector
26d80 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29  y(zPath, &dirfd)
26d90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
26da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26db0 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65 20 74   /* It is safe t
26dc0 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68  o close fd at th
26dd0 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73  is point, becaus
26de0 65 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  e it is guarante
26df0 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  ed not.      ** 
26e00 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20  to be open on a 
26e10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
26e20 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f  f it were open o
26e30 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
26e40 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77  e,.      ** it w
26e50 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
26e60 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69   to close as thi
26e70 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20  s would release 
26e80 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20  any locks held. 
26e90 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66       ** on the f
26ea0 69 6c 65 20 62 79 20 74 68 69 73 20 70 72 6f 63  ile by this proc
26eb0 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  ess.  */.      a
26ec0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
26ed0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
26ee0 42 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  B );.      robus
26ef0 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
26f00 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
26f10 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
26f20 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ed;.    }.  }..#
26f30 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
26f40 0a 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53  .  fcntl(fd, F_S
26f50 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20  ETFD, fcntl(fd, 
26f60 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
26f70 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
26f80 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54  f..  noLock = eT
26f90 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
26fa0 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69  _MAIN_DB;..  .#i
26fb0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
26fc0 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
26fd0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
26fe0 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61  YLE.  struct sta
26ff0 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66  tfs fsInfo;.  if
27000 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66  ( fstatfs(fd, &f
27010 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a  sInfo) == -1 ){.
27020 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
27030 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e  pFile)->lastErrn
27040 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
27050 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 72 6f  f( dirfd>=0 ) ro
27060 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 64 69  bust_close(p, di
27070 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
27080 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
27090 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
270a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
270b0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
270c0 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
270d0 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73  = strncmp("msdos
270e0 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
270f0 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
27100 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
27110 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
27120 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
27130 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65  IS_MSDOS;.  }.#e
27140 6e 64 69 66 0a 20 20 0a 23 69 66 20 53 51 4c 49  ndif.  .#if SQLI
27150 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
27160 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
27170 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
27180 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
27190 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
271a0 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
271b0 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
271c0 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
271d0 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
271e0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
271f0 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
27200 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
27210 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
27220 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
27230 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
27240 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
27250 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
27260 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
27270 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
27280 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
27290 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
272a0 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
272b0 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
272c0 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
272d0 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
272e0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
272f0 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
27300 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
27310 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72 75 63  lse{.      struc
27320 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
27330 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
27340 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
27350 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  ) == -1 ){.     
27360 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
27370 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63   the close(fd) c
27380 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d  all is sub-optim
27390 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  al. If the file 
273a0 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a  opened.        *
273b0 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64  * with fd is a d
273c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
273d0 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  d there are othe
273e0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70  r connections op
273f0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
27400 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
27410 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f  are currently ho
27420 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c  lding advisory l
27430 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20  ocks on it,.    
27440 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
27450 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20  call to close() 
27460 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73  will cancel thos
27470 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63  e locks. In prac
27480 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tice,.        **
27490 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
274a0 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f  that statfs() do
274b0 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20  esn't fail very 
274c0 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a  often. At least.
274d0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77          ** not w
274e0 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20  hile other file 
274f0 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
27500 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ed by the same p
27510 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20  rocess on.      
27520 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69    ** the same fi
27530 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20  le are working. 
27540 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   */.        p->l
27550 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
27560 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 69  ;.        if( di
27570 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rfd>=0 ){.      
27580 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
27590 28 70 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  (p, dirfd, __LIN
275a0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E__);.        }.
275b0 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
275c0 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
275d0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72  NE__);.        r
275e0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
275f0 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20  _ACCESS;.       
27600 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
27610 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
27620 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
27630 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
27640 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
27650 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
27660 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
27670 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
27680 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
27690 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
276a0 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
276b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
276c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
276d0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
276e0 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
276f0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
27700 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
27710 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27730 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
27740 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
27750 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
27760 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
27770 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
27780 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
27790 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
277a0 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
277b0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
277c0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
277d0 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
277e0 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
277f0 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
27800 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
27810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27820 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
27830 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
27840 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27850 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27860 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
27870 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
27880 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
27890 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
278a0 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
278b0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
278c0 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29  oLock, isDelete)
278d0 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ;.open_finished:
278e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
278f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
27900 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
27910 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
27920 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
27930 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
27940 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
27950 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
27960 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
27970 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
27980 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
27990 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
279a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
279b0 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
279c0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
279d0 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
279e0 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
279f0 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
27a00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
27a10 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
27a20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
27a30 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
27a40 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27a60 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
27a70 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
27a80 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
27a90 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
27aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
27ab0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
27ac0 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
27ad0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
27ae0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
27af0 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 75 6e 6c  LETE);.  if( unl
27b00 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29  ink(zPath)==(-1)
27b10 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e   && errno!=ENOEN
27b20 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
27b30 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
27b40 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
27b50 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74  , "unlink", zPat
27b60 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  h);.  }.#ifndef 
27b70 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
27b80 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72  IRSYNC.  if( dir
27b90 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
27ba0 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
27bb0 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
27bc0 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
27bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27be0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
27bf0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
27c00 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
27c10 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
27c20 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
27c30 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
27c40 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
27c50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
27c60 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20  FSYNC, "fsync", 
27c70 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
27c80 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
27c90 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
27ca0 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  __);.    }.  }.#
27cb0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
27cc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
27cd0 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   the existance o
27ce0 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
27cf0 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
27d00 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
27d10 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
27d20 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
27d30 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
27d40 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
27d50 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
27d60 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
27d70 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
27d80 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
27d90 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
27da0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
27db0 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
27dc0 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
27dd0 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
27de0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
27df0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
27e00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
27e10 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
27e20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27e30 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
27e40 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
27e50 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
27e60 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
27e70 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
27e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
27e90 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
27ea0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
27eb0 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
27ec0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
27ed0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
27ee0 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
27ef0 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
27f00 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
27f10 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
27f20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
27f30 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
27f40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f   */.){.  int amo
27f50 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44  de = 0;.  UNUSED
27f60 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
27f70 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
27f80 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
27f90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
27fa0 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28  SS; );.  switch(
27fb0 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
27fc0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
27fd0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61  _EXISTS:.      a
27fe0 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20  mode = F_OK;.   
27ff0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
28000 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
28010 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
28020 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52    amode = W_OK|R
28030 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
28040 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
28050 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
28060 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f       amode = R_O
28070 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
28080 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
28090 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
280a0 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
280b0 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
280c0 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73 73 28  esOut = (access(
280d0 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
280e0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  );.  if( flags==
280f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
28100 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74  ISTS && *pResOut
28110 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
28120 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28  tat buf;.    if(
28130 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c 20   0==stat(zPath, 
28140 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f  &buf) && buf.st_
28150 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  size==0 ){.     
28160 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
28170 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28190 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
281a0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
281b0 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
281c0 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
281d0 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
281e0 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
281f0 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
28200 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
28210 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
28220 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
28230 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
28240 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
28250 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
28260 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
28270 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
28280 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
28290 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
282a0 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
282b0 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
282c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
282d0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
282e0 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
282f0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
28300 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
28310 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
28320 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
28330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
28340 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
28350 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
28360 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
28370 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
283a0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
283b0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
283c0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
283d0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
283e0 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
283f0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
28400 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
28410 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
28420 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
28430 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
28440 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
28450 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
28460 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
28470 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
28480 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
28490 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
284a0 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
284b0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
284c0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
284d0 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
284e0 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
284f0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
28500 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
28510 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
28520 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
28530 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
28540 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
28550 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28560 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b  (pVfs);..  zOut[
28570 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
28580 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
28590 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
285a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
285b0 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
285c0 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
285d0 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
285e0 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75 74   if( getcwd(zOut
285f0 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
28600 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
28610 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
28620 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
28630 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
28640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
28650 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
28660 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
28670 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
28680 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
28690 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
286a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
286b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
286c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
286d0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
286e0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
286f0 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
28700 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
28710 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
28720 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
28730 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
28740 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
28750 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
28760 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
28770 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
28780 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
28790 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
287a0 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
287b0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
287c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
287d0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
287e0 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
287f0 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
28800 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
28810 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
28820 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
28830 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
28840 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
28850 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
28860 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
28870 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
28880 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
28890 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
288a0 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
288b0 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
288c0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
288d0 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
288e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
288f0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
28900 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
28910 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
28920 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
28930 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
28940 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
28950 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
28960 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
28970 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
28980 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
28990 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
289a0 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
289b0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
289c0 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
289d0 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
289e0 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
289f0 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
28a00 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
28a10 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
28a20 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
28a30 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
28a40 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
28a50 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
28a60 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
28a70 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
28a80 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
28a90 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
28aa0 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
28ab0 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
28ac0 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
28ad0 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
28ae0 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
28af0 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
28b00 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
28b10 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
28b20 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
28b30 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
28b40 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
28b50 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
28b60 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
28b70 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
28b80 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
28b90 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
28ba0 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
28bb0 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
28bc0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
28bd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
28be0 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
28bf0 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
28c00 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
28c10 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
28c20 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
28c30 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
28c40 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
28c50 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
28c60 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
28c70 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
28c80 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
28c90 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
28ca0 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
28cb0 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
28cc0 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
28cd0 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
28ce0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
28cf0 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
28d00 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
28d10 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
28d20 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
28d30 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
28d40 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
28d50 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
28d60 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
28d70 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
28d80 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
28d90 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
28da0 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
28db0 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
28dc0 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
28dd0 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
28de0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
28df0 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
28e00 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
28e10 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
28e20 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
28e30 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
28e40 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
28e50 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
28e60 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
28e70 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
28e80 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
28e90 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
28ea0 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
28eb0 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
28ec0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
28ed0 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
28ee0 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
28ef0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
28f00 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
28f10 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
28f20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
28f30 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
28f40 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
28f50 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
28f60 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
28f70 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
28f80 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
28f90 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
28fa0 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
28fb0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
28fc0 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
28fd0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
28fe0 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
28ff0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
29000 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
29010 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
29020 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
29030 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
29040 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
29050 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
29060 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
29070 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
29080 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
29090 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
290a0 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
290b0 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
290c0 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
290d0 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
290e0 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
290f0 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
29100 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
29110 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
29120 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
29130 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
29140 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
29150 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
29160 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
29170 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
29180 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
29190 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
291a0 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
291b0 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
291c0 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
291d0 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
291e0 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
291f0 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
29200 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
29210 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
29220 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
29230 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
29240 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
29250 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
29260 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
29270 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
29280 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
29290 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
292a0 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
292b0 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
292c0 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
292d0 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
292e0 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
292f0 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
29300 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
29310 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
29320 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f  , fd;.    fd = o
29330 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
29340 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  m", O_RDONLY);. 
29350 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
29360 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20       time_t t;. 
29370 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20       time(&t);. 
29380 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
29390 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29  , &t, sizeof(t))
293a0 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65  ;.      pid = ge
293b0 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65  tpid();.      me
293c0 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
293d0 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a  f(t)], &pid, siz
293e0 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20  eof(pid));.     
293f0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
29400 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d  t)+sizeof(pid)<=
29410 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a  (size_t)nBuf );.
29420 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a        nBuf = siz
29430 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28  eof(t) + sizeof(
29440 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pid);.    }else{
29450 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42 75 66 20  .      do{ nBuf 
29460 3d 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c  = read(fd, zBuf,
29470 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20   nBuf); }while( 
29480 6e 42 75 66 3c 30 20 26 26 20 65 72 72 6e 6f 3d  nBuf<0 && errno=
29490 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
294a0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
294b0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
294c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
294d0 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d    return nBuf;.}
294e0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
294f0 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
29500 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
29510 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
29520 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  ept..** The argu
29530 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  ment is the numb
29540 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
29550 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c  ds we want to sl
29560 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  eep..** The retu
29570 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
29580 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
29590 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20  econds of sleep 
295a0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75  actually.** requ
295b0 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75  ested from the u
295c0 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
295d0 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75  ing system, a nu
295e0 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69  mber which.** mi
295f0 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
29600 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
29610 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75  the argument, bu
29620 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68  t not less.** th
29630 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  an the argument.
29640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
29650 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nixSleep(sqlite3
29660 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
29670 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  nt microseconds)
29680 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
29690 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
296a0 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f  ec sp;..  sp.tv_
296b0 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e  sec = microsecon
296c0 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20  ds / 1000000;.  
296d0 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69  sp.tv_nsec = (mi
296e0 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30  croseconds % 100
296f0 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20  0000) * 1000;.  
29700 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e  nanosleep(&sp, N
29710 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ULL);.  UNUSED_P
29720 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
29730 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
29740 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20  oseconds;.#elif 
29750 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
29760 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
29770 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
29780 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  roseconds);.  UN
29790 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
297a0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
297b0 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
297c0 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f  #else.  int seco
297d0 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  nds = (microseco
297e0 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30  nds+999999)/1000
297f0 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63  000;.  sleep(sec
29800 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
29810 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
29820 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63  d);.  return sec
29830 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65  onds*1000000;.#e
29840 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
29850 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
29860 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
29870 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
29880 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
29890 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
298a0 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
298b0 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
298c0 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
298d0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
298e0 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
298f0 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
29900 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
29910 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
29920 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
29930 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
29940 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
29950 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
29960 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
29970 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
29980 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
29990 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
299a0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
299b0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
299c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
299d0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
299e0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
299f0 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
29a00 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
29a10 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
29a20 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
29a30 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
29a40 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
29a50 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
29a60 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
29a70 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
29a80 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
29a90 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
29aa0 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
29ab0 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
29ac0 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
29ad0 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
29ae0 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
29af0 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
29b00 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
29b10 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
29b20 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
29b30 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
29b40 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
29b50 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
29b60 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
29b70 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
29b80 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
29b90 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
29ba0 30 30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  000;.#if defined
29bb0 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
29bc0 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
29bd0 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28  t);.  *piNow = (
29be0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74  (sqlite3_int64)t
29bf0 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f  )*1000 + unixEpo
29c00 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57  ch;.#elif OS_VXW
29c10 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
29c20 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63  mespec sNow;.  c
29c30 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f  lock_gettime(CLO
29c40 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e  CK_REALTIME, &sN
29c50 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  ow);.  *piNow = 
29c60 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
29c70 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
29c80 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
29c90 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30  ow.tv_nsec/10000
29ca0 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  00;.#else.  stru
29cb0 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b  ct timeval sNow;
29cc0 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  .  gettimeofday(
29cd0 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69  &sNow, 0);.  *pi
29ce0 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
29cf0 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
29d00 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
29d10 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  c + sNow.tv_usec
29d20 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  /1000;.#endif..#
29d30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
29d40 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
29d50 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
29d60 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
29d70 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
29d80 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
29d90 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
29da0 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
29db0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29dc0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
29dd0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29de0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
29df0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
29e00 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
29e10 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
29e20 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
29e30 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
29e40 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
29e50 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
29e60 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
29e70 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
29e80 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
29e90 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
29ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
29eb0 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
29ec0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
29ed0 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  d, double *prNow
29ee0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
29ef0 36 34 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50  64 i;.  UNUSED_P
29f00 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
29f10 29 3b 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74  );.  unixCurrent
29f20 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29  TimeInt64(0, &i)
29f30 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38  ;.  *prNow = i/8
29f40 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74  6400000.0;.  ret
29f50 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29f60 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
29f70 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
29f80 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
29f90 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
29fa0 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
29fb0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
29fc0 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
29fd0 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
29fe0 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
29ff0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
2a000 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
2a010 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
2a020 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
2a030 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
2a040 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
2a050 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
2a060 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
2a070 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
2a080 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
2a090 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2a0a0 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
2a0b0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2a0c0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
2a0d0 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
2a0e0 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
2a0f0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2a100 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
2a110 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2a120 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
2a130 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
2a140 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2a150 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
2a160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
2a170 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
2a180 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
2a190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1a0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2a1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1f0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
2a200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a240 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2a250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a260 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
2a270 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
2a280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a290 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
2a2a0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
2a2b0 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
2a2c0 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
2a2d0 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
2a2e0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
2a2f0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
2a300 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
2a310 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
2a320 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
2a330 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
2a340 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
2a350 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
2a360 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
2a370 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
2a380 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
2a390 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
2a3a0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2a3b0 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
2a3c0 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
2a3d0 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
2a3e0 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
2a3f0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
2a400 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
2a410 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
2a420 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
2a430 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
2a440 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
2a450 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
2a460 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
2a470 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
2a480 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
2a490 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
2a4a0 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
2a4b0 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
2a4c0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2a4d0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
2a4e0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
2a4f0 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
2a500 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
2a510 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
2a520 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
2a530 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
2a540 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
2a550 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
2a560 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
2a570 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
2a580 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
2a590 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
2a5a0 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
2a5b0 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
2a5c0 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
2a5d0 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
2a5e0 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
2a5f0 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
2a600 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
2a610 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
2a620 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
2a630 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
2a640 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
2a650 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
2a660 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
2a670 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
2a680 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
2a690 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
2a6a0 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
2a6b0 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
2a6c0 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
2a6d0 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
2a6e0 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
2a6f0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
2a700 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
2a710 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
2a720 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
2a730 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
2a740 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
2a750 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
2a760 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
2a770 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
2a780 09 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52  ..   ..**      R
2a790 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
2a7a0 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
2a7b0 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
2a7c0 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
2a7d0 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
2a7e0 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
2a7f0 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
2a800 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2a810 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
2a820 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
2a830 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
2a840 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
2a850 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
2a860 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
2a870 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
2a880 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
2a890 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
2a8a0 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
2a8b0 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
2a8c0 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
2a8d0 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
2a8e0 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
2a8f0 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
2a900 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
2a910 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
2a920 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
2a930 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
2a940 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
2a950 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
2a960 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
2a970 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
2a980 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
2a990 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
2a9a0 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
2a9b0 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
2a9c0 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
2a9d0 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
2a9e0 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
2a9f0 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
2aa00 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
2aa10 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
2aa20 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
2aa30 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
2aa40 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
2aa50 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
2aa60 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
2aa70 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
2aa80 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
2aa90 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
2aaa0 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
2aab0 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
2aac0 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
2aad0 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
2aae0 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
2aaf0 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
2ab00 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
2ab10 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
2ab20 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
2ab30 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
2ab40 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
2ab50 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
2ab60 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
2ab70 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
2ab80 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
2ab90 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
2aba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
2abb0 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
2abc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
2abd0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
2abe0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
2abf0 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac10 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
2ac20 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
2ac30 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
2ac40 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
2ac50 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
2ac60 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70  CKPROXYFILE, &<p
2ac70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
2ac80 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
2ac90 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
2aca0 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
2acb0 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
2acc0 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
2acd0 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2ace0 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2acf0 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
2ad00 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
2ad10 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
2ad20 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
2ad30 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
2ad40 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
2ad50 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
2ad60 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
2ad70 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
2ad80 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
2ad90 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
2ada0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
2adb0 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
2adc0 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
2add0 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2ade0 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
2adf0 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
2ae00 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
2ae10 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
2ae20 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
2ae30 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
2ae40 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2ae50 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
2ae60 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
2ae70 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
2ae80 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
2ae90 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
2aea0 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
2aeb0 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
2aec0 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
2aed0 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
2aee0 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
2aef0 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
2af00 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
2af10 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2af20 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
2af30 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
2af40 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
2af50 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
2af60 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
2af70 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
2af80 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
2af90 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
2afa0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
2afb0 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
2afc0 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
2afd0 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
2afe0 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
2aff0 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
2b000 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
2b010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2b020 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
2b030 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
2b040 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
2b050 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
2b060 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
2b070 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
2b080 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
2b090 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2b0a0 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
2b0b0 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
2b0c0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
2b0d0 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
2b0e0 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
2b0f0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
2b100 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
2b110 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
2b120 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
2b130 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
2b140 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
2b150 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
2b160 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
2b170 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
2b180 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
2b190 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
2b1a0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
2b1b0 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
2b1c0 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
2b1d0 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
2b1e0 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
2b1f0 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
2b200 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
2b210 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
2b220 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
2b230 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
2b240 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
2b250 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
2b260 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
2b270 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
2b280 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
2b290 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
2b2a0 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
2b2b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2b2c0 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
2b2d0 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
2b2e0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
2b2f0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2b300 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e  ist, or it's con
2b310 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  tents do not mat
2b320 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49  ch the.** host I
2b330 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70  D and/or proxy p
2b340 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  ath, then the lo
2b350 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20  ck is escalated 
2b360 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  to an exclusive.
2b370 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ** lock and the 
2b380 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65  conch file conte
2b390 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77  nts is updated w
2b3a0 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20  ith the host ID 
2b3b0 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74  and proxy.** pat
2b3c0 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69  h and the lock i
2b3d0 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  s downgraded to 
2b3e0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67  a shared lock ag
2b3f0 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e  ain.  If the con
2b400 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79  ch.** is held by
2b410 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
2b420 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20   (with a shared 
2b430 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75  lock), the exclu
2b440 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c  sive lock.** wil
2b450 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54  l fail and SQLIT
2b460 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
2b470 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
2b480 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e  oxy file - a sin
2b490 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73  gle-byte file us
2b4a0 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73  ed for all advis
2b4b0 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a  ory file locks.*
2b4c0 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e  * normally taken
2b4d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2b4e0 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c   file.   This al
2b4f0 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68  lows for safe sh
2b500 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20  aring.** of the 
2b510 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
2b520 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  r multiple reade
2b530 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f  rs and writers o
2b540 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f  n the same.** ho
2b550 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e  st (the conch en
2b560 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20  sures that they 
2b570 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65  all use the same
2b580 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65   local lock file
2b590 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74  )..**.** Request
2b5a0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f  ing the lock pro
2b5b0 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65  xy does not imme
2b5c0 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65  diately take the
2b5d0 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a   conch, it is.**
2b5e0 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e   only taken when
2b5f0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65   the first reque
2b600 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62  st to lock datab
2b610 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65  ase file is made
2b620 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63  .  .** This matc
2b630 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63  hes the semantic
2b640 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69  s of the traditi
2b650 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68  onal locking beh
2b660 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20  avior, where.** 
2b670 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63  opening a connec
2b680 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61  tion to a databa
2b690 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  se file does not
2b6a0 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20   take a lock on 
2b6b0 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65  it..** The share
2b6c0 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70  d lock and an op
2b6d0 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
2b6e0 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65  or are maintaine
2b6f0 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20  d until .** the 
2b700 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
2b710 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  e database is cl
2b720 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  osed. .**.** The
2b730 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20   proxy file and 
2b740 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72  the lock file ar
2b750 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20  e never deleted 
2b760 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65  so they only nee
2b770 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74  d.** to be creat
2b780 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ed the first tim
2b790 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e  e they are used.
2b7a0 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  .**.** Configura
2b7b0 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20  tion options.** 
2b7c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b7d0 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  -----.**.**  SQL
2b7e0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2b7f0 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  _LOCKING.**.**  
2b800 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2b810 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20  les accessed on 
2b820 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73  non-local file s
2b830 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20  ystems are.**   
2b840 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c      automaticall
2b850 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
2b860 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20   proxy locking, 
2b870 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a  lock files are.*
2b880 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75  *       named au
2b890 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e  tomatically usin
2b8a0 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63  g the same logic
2b8b0 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41   as.**       PRA
2b8c0 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  GMA lock_proxy_f
2b8d0 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20  ile=":auto:".** 
2b8e0 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50     .**  SQLITE_P
2b8f0 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a  ROXY_DEBUG.**.**
2b900 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74         Enables t
2b910 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72  he logging of er
2b920 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72  ror messages dur
2b930 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65  ing host id file
2b940 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65  .**       retrie
2b950 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e  val and creation
2b960 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58  .**.**  LOCKPROX
2b970 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  YDIR.**.**      
2b980 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64   Overrides the d
2b990 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79  efault directory
2b9a0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70   used for lock p
2b9b0 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a  roxy files that.
2b9c0 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d  **       are nam
2b9d0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2b9e0 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a   via the ":auto:
2b9f0 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20  " setting.**.** 
2ba00 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ba10 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
2ba20 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  IONS.**.**      
2ba30 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2ba40 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  use when creatin
2ba50 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f  g a directory fo
2ba60 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a  r storing the.**
2ba70 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78         lock prox
2ba80 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73  y files, only us
2ba90 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58  ed when LOCKPROX
2baa0 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e  YDIR is not set.
2bab0 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a  .**    .**    .*
2bac0 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61  * As mentioned a
2bad0 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69  bove, when compi
2bae0 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
2baf0 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2bb00 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67  KING,.** setting
2bb10 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
2bb20 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45   variable SQLITE
2bb30 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2bb40 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a  KING to 1 will.*
2bb50 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f  * force proxy lo
2bb60 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  cking to be used
2bb70 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62   for every datab
2bb80 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  ase file opened,
2bb90 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66   and 0.** will f
2bba0 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70  orce automatic p
2bbb0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
2bbc0 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  be disabled for 
2bbd0 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
2bbe0 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79  files (explicity
2bbf0 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
2bc00 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2bc10 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a  YFILE pragma or.
2bc20 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63  ** sqlite_file_c
2bc30 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f  ontrol API is no
2bc40 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51  t affected by SQ
2bc50 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2bc60 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f  _LOCKING)..*/../
2bc70 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
2bc80 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
2bc90 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a  able on MacOSX .
2bca0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2bcb0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2bcc0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2bcd0 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
2bce0 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  The proxyLocking
2bcf0 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20  Context has the 
2bd00 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74  path and file st
2bd10 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
2bd20 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20   remote .** and 
2bd30 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  local proxy file
2bd40 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64  s in it.*/.typed
2bd50 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c  ef struct proxyL
2bd60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72  ockingContext pr
2bd70 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2bd80 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c  t;.struct proxyL
2bd90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
2bda0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2bdb0 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  hFile;         /
2bdc0 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  * Open conch fil
2bdd0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  e */.  char *con
2bde0 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20  chFilePath;     
2bdf0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2be00 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
2be10 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63  .  unixFile *loc
2be20 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20  kProxy;         
2be30 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f  /* Open proxy lo
2be40 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
2be50 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  r *lockProxyPath
2be60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
2be70 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  e of the proxy l
2be80 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
2be90 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
2bea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2beb0 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
2bec0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ile */.  int con
2bed0 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20  chHeld;         
2bee0 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68        /* 1 if th
2bef0 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c  e conch is held,
2bf00 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20   -1 if lockless 
2bf10 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
2bf20 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
2bf30 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
2bf40 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
2bf50 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
2bf60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
2bf70 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
2bf80 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
2bf90 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
2bfa0 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
2bfb0 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
2bfc0 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
2bfd0 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
2bfe0 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
2bff0 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
2c000 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
2c010 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
2c020 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
2c030 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
2c040 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
2c050 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
2c060 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
2c070 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
2c080 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
2c090 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
2c0a0 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
2c0b0 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
2c0c0 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
2c0d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
2c0e0 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
2c0f0 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
2c100 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
2c110 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
2c120 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
2c130 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
2c140 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
2c150 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
2c160 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2c170 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
2c180 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
2c190 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
2c1a0 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
2c1b0 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
2c1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c1d0 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65  lPath, errno, ge
2c1e0 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20  tpid()));.      
2c1f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2c200 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  ERR_LOCK;.    }.
2c210 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
2c220 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65  t(lPath, "sqlite
2c230 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29  plocks", maxLen)
2c240 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65  ;    .  }.# else
2c250 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
2c260 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c  (lPath, "/tmp/",
2c270 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69   maxLen);.# endi
2c280 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  f.#endif..  if( 
2c290 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f  lPath[len-1]!='/
2c2a0 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  ' ){.    len = s
2c2b0 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f  trlcat(lPath, "/
2c2c0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a  ", maxLen);.  }.
2c2d0 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72    .  /* transfor
2c2e0 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f  m the db path to
2c2f0 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20   a unique cache 
2c300 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20  name */.  dbLen 
2c310 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
2c320 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d  Path);.  for( i=
2c330 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69  0; i<dbLen && (i
2c340 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78  +len+7)<(int)max
2c350 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Len; i++){.    c
2c360 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69  har c = dbPath[i
2c370 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c  ];.    lPath[i+l
2c380 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27  en] = (c=='/')?'
2c390 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74  _':c;.  }.  lPat
2c3a0 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20  h[i+len]='\0';. 
2c3b0 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
2c3c0 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e  ":auto:", maxLen
2c3d0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47  );.  OSTRACE(("G
2c3e0 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  ETLOCKPATH  prox
2c3f0 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
2c400 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c  id=%d\n", lPath,
2c410 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72   getpid()));.  r
2c420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c430 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61  .}../* . ** Crea
2c440 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  tes the lock fil
2c450 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e  e and any missin
2c460 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e  g directories in
2c470 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74   lockPath. */.st
2c480 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
2c490 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  eateLockPath(con
2c4a0 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74  st char *lockPat
2c4b0 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e  h){.  int i, len
2c4c0 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58  ;.  char buf[MAX
2c4d0 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20  PATHLEN];.  int 
2c4e0 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20  start = 0;.  .  
2c4f0 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21  assert(lockPath!
2c500 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79  =NULL);.  /* try
2c510 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74   to create all t
2c520 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
2c530 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20  directories */. 
2c540 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c   len = (int)strl
2c550 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  en(lockPath);.  
2c560 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[0] = lockPat
2c570 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31  h[0];.  for( i=1
2c580 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a  ; i<len; i++ ){.
2c590 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68      if( lockPath
2c5a0 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69  [i] == '/' && (i
2c5b0 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b   - start > 0) ){
2c5c0 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d  .      /* only m
2c5d0 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72  kdir if leaf dir
2c5e0 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f   != "." or "/" o
2c5f0 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20  r ".." */.      
2c600 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c  if( i-start>2 ||
2c610 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20   (i-start==1 && 
2c620 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
2c630 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  ' && buf[start] 
2c640 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20  != '/') .       
2c650 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32    || (i-start==2
2c660 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
2c670 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
2c680 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b  rt+1] != '.') ){
2c690 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d  .        buf[i]=
2c6a0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66  '\0';.        if
2c6b0 28 20 6d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c  ( mkdir(buf, SQL
2c6c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
2c6d0 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
2c6e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
2c6f0 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20  nt err=errno;.  
2c700 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21          if( err!
2c710 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20  =EEXIST ) {.    
2c720 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
2c730 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
2c740 20 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e    FAILED creatin
2c750 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20  g %s, ".        
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25               "'%
2c770 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  s' proxy lock pa
2c780 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
2c790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c7a0 20 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72        buf, strer
2c7b0 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61  ror(err), lockPa
2c7c0 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2c7e0 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20  rn err;.        
2c7f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2c800 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
2c810 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t=i+1;.    }.   
2c820 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61   buf[i] = lockPa
2c830 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54  th[i];.  }.  OST
2c840 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
2c850 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
2c860 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
2c870 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67  \n", lockPath, g
2c880 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74  etpid()));.  ret
2c890 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2c8a0 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
2c8b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c8c0 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
2c8d0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
2c8e0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
2c8f0 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
2c900 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
2c910 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
2c920 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
2c930 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
2c940 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
2c950 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
2c960 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2c970 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
2c980 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
2c990 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
2c9a0 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
2c9b0 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
2c9c0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2c9d0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
2c9e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
2c9f0 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
2ca00 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
2ca10 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
2ca20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
2ca30 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
2ca40 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
2ca50 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
2ca60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
2ca70 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
2ca80 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
2ca90 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
2caa0 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
2cab0 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
2cac0 31 3b 0a 20 20 69 6e 74 20 64 69 72 66 64 20 3d  1;.  int dirfd =
2cad0 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   -1;.  unixFile 
2cae0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20  *pNew;.  int rc 
2caf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2cb00 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
2cb10 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
2cb20 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
2cb30 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74  ummyVfs;.  int t
2cb40 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69  errno = 0;.  Uni
2cb50 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2cb60 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a  ed = NULL;..  /*
2cb70 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f   1. first try to
2cb80 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
2cb90 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66   file.  ** 2. if
2cba0 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64   that fails, and
2cbb0 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20   this is a lock 
2cbc0 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29  file (not-conch)
2cbd0 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20  , try creating. 
2cbe0 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64   ** the parent d
2cbf0 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74  irectories and t
2cc00 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20  hen try again.. 
2cc10 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66   ** 3. if that f
2cc20 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65  ails, try to ope
2cc30 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d  n the file read-
2cc40 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77  only.  ** otherw
2cc50 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20  ise return BUSY 
2cc60 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f  (if lock file) o
2cc70 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74  r CANTOPEN for t
2cc80 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20  he conch file.  
2cc90 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66  */.  pUnused = f
2cca0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61  indReusableFd(pa
2ccb0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  th, openFlags);.
2ccc0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2ccd0 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65  .    fd = pUnuse
2cce0 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d->fd;.  }else{.
2ccf0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
2cd00 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2cd10 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
2cd20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
2cd30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2cd40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2cd50 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
2cd60 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20  d<0 ){.    fd = 
2cd70 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
2cd80 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46  lags, SQLITE_DEF
2cd90 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2cda0 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72  SIONS);.    terr
2cdb0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2cdc0 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
2cdd0 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c  o==ENOENT && isl
2cde0 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
2cdf0 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65   if( proxyCreate
2ce00 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d  LockPath(path) =
2ce10 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
2ce20 20 20 20 20 20 20 20 66 64 20 3d 20 6f 70 65 6e         fd = open
2ce30 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2ce40 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2ce50 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2ce60 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  S);.      }.    
2ce70 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
2ce80 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67   ){.    openFlag
2ce90 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
2cea0 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68    fd = open(path
2ceb0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c  , openFlags, SQL
2cec0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2ced0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2cee0 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
2cef0 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
2cf00 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
2cf10 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
2cf20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
2cf30 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
2cf40 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
2cf50 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
2cf60 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
2cf70 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
2cf80 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
2cf90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2cfa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
2cfb0 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
2cfc0 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
2cfd0 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
2cfe0 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
2cff0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
2d000 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2d010 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
2d020 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
2d030 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
2d040 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
2d050 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
2d060 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2d070 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  MEM;.    goto en
2d080 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
2d090 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
2d0a0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
2d0b0 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
2d0c0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
2d0d0 6e 46 6c 61 67 73 3b 0a 20 20 64 75 6d 6d 79 56  nFlags;.  dummyV
2d0e0 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76  fs.pAppData = (v
2d0f0 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
2d100 46 69 6e 64 65 72 3b 0a 20 20 70 55 6e 75 73 65  Finder;.  pUnuse
2d110 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55  d->fd = fd;.  pU
2d120 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f  nused->flags = o
2d130 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  penFlags;.  pNew
2d140 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
2d150 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66  sed;.  .  rc = f
2d160 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64  illInUnixFile(&d
2d170 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72  ummyVfs, fd, dir
2d180 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  fd, (sqlite3_fil
2d190 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30  e*)pNew, path, 0
2d1a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
2d1b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d1c0 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b   *ppFile = pNew;
2d1d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d1e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63  TE_OK;.  }.end_c
2d1f0 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20  reate_proxy:    
2d200 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
2d210 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  pNew, fd, __LINE
2d220 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  __);.  sqlite3_f
2d230 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c  ree(pNew);.  sql
2d240 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65  ite3_free(pUnuse
2d250 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
2d260 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2d270 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61  E_TEST./* simula
2d280 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
2d290 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
2d2a0 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
2d2b0 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71   paths */.int sq
2d2c0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2d2d0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64   = 0;.#endif..#d
2d2e0 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54  efine PROXY_HOST
2d2f0 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20  IDLEN    16  /* 
2d300 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20  conch file host 
2d310 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a  id length */../*
2d320 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69   Not always defi
2d330 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ned in the heade
2d340 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20 74  rs as it ought t
2d350 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69  o be */.extern i
2d360 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28 75  nt gethostuuid(u
2d370 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20  uid_t id, const 
2d380 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
2d390 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20  *wait);../* get 
2d3a0 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20  the host ID via 
2d3b0 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70  gethostuuid(), p
2d3c0 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e  HostID must poin
2d3d0 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49  t to PROXY_HOSTI
2d3e0 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f  DLEN .** bytes o
2d3f0 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  f writable memor
2d400 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
2d410 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
2d420 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2d430 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72  HostID, int *pEr
2d440 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50  ror){.  assert(P
2d450 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
2d460 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
2d470 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
2d480 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
2d490 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64 65  STIDLEN);.#if de
2d4a0 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58  fined(__MAX_OS_X
2d4b0 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
2d4c0 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20 20  UIRED)\.        
2d4d0 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f         && __MAC_
2d4e0 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
2d4f0 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a 20  _REQUIRED<1050. 
2d500 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
2d510 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73  nst struct times
2d520 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31  pec timeout = {1
2d530 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74  , 0}; /* 1 sec t
2d540 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66  imeout */.    if
2d550 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48  ( gethostuuid(pH
2d560 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29  ostID, &timeout)
2d570 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
2d580 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
2d590 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
2d5a0 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d         *pError =
2d5b0 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20   err;.      }.  
2d5c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d5d0 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
2d5e0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
2d5f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
2d600 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
2d610 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
2d620 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
2d630 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
2d640 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
2d650 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29  hostid_num != 0)
2d660 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d  {.    pHostID[0]
2d670 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49   = (char)(pHostI
2d680 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71  D[0] + (char)(sq
2d690 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2d6a0 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23   & 0xFF));.  }.#
2d6b0 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
2d6c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2d6d0 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  /* The conch fil
2d6e0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68  e contains the h
2d6f0 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61  eader, host id a
2d700 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
2d710 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  h. */.#define PR
2d720 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
2d730 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68   2   /* 1-byte h
2d740 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68  eader, 16-byte h
2d750 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a  ost id, path */.
2d760 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45  #define PROXY_HE
2d770 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f  ADERLEN    1   /
2d780 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61  * conch file hea
2d790 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64  der length */.#d
2d7a0 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48  efine PROXY_PATH
2d7b0 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f  INDEX    (PROXY_
2d7c0 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
2d7d0 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69  HOSTIDLEN).#defi
2d7e0 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  ne PROXY_MAXCONC
2d7f0 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41  HLEN  (PROXY_HEA
2d800 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
2d810 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45  TIDLEN+MAXPATHLE
2d820 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73  N)../* .** Takes
2d830 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66   an open conch f
2d840 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20  ile, copies the 
2d850 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65  contents to a ne
2d860 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20  w path and then 
2d870 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63  moves .** it bac
2d880 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72  k.  The newly cr
2d890 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c  eated file's fil
2d8a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2d8b0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a  assigned to the.
2d8c0 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74  ** conch file st
2d8d0 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61  ructure and fina
2d8e0 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  lly the original
2d8f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63   conch file desc
2d900 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c  riptor is .** cl
2d910 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a  osed.  Returns z
2d920 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75  ero if successfu
2d930 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2d940 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68   proxyBreakConch
2d950 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
2d960 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
2d970 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c  ostID){.  proxyL
2d980 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2d990 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2d9a0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
2d9b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2d9c0 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
2d9d0 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
2d9e0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
2d9f0 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41  char tPath[MAXPA
2da00 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62  THLEN];.  char b
2da10 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
2da20 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63  HLEN];.  char *c
2da30 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  Path = pCtx->con
2da40 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69  chFilePath;.  si
2da50 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30  ze_t readLen = 0
2da60 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c  ;.  size_t pathL
2da70 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65  en = 0;.  char e
2da80 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a  rrmsg[64] = "";.
2da90 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
2daa0 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20   int rc = -1;.  
2dab0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2dac0 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f  (myHostID);..  /
2dad0 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  * create a new p
2dae0 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74  ath by replace t
2daf0 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f  he trailing '-co
2db00 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61  nch' with '-brea
2db10 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20  k' */.  pathLen 
2db20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c  = strlcpy(tPath,
2db30 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c   cPath, MAXPATHL
2db40 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c  EN);.  if( pathL
2db50 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c  en>MAXPATHLEN ||
2db60 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20   pathLen<6 || . 
2db70 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50      (strlcpy(&tP
2db80 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20  ath[pathLen-5], 
2db90 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35  "break", 6) != 5
2dba0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2dbb0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2dbc0 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
2dbd0 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e  "path error (len
2dbe0 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c   %d)",(int)pathL
2dbf0 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
2dc00 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2dc10 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63  .  /* read the c
2dc20 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  onch content */.
2dc30 20 20 72 65 61 64 4c 65 6e 20 3d 20 70 72 65 61    readLen = prea
2dc40 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
2dc50 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  buf, PROXY_MAXCO
2dc60 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66  NCHLEN, 0);.  if
2dc70 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f  ( readLen<PROXY_
2dc80 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20  PATHINDEX ){.   
2dc90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2dca0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
2dcb0 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72  ,errmsg,"read er
2dcc0 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
2dcd0 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20  nt)readLen);.   
2dce0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
2dcf0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72  ock;.  }.  /* wr
2dd00 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
2dd10 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61  e temporary brea
2dd20 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d  k file */.  fd =
2dd30 20 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f   open(tPath, (O_
2dd40 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  RDWR|O_CREAT|O_E
2dd50 58 43 4c 29 2c 20 53 51 4c 49 54 45 5f 44 45 46  XCL), SQLITE_DEF
2dd60 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2dd70 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64  SIONS);.  if( fd
2dd80 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
2dd90 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2dda0 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
2ddb0 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c 65  g, "create faile
2ddc0 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
2ddd0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
2dde0 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69  eaklock;.  }.  i
2ddf0 66 28 20 70 77 72 69 74 65 28 66 64 2c 20 62 75  f( pwrite(fd, bu
2de00 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21  f, readLen, 0) !
2de10 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c  = (ssize_t)readL
2de20 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
2de30 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2de40 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
2de50 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64  g, "write failed
2de60 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
2de70 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
2de80 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  aklock;.  }.  if
2de90 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20  ( rename(tPath, 
2dea0 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71  cPath) ){.    sq
2deb0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2dec0 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
2ded0 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66  rrmsg, "rename f
2dee0 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
2def0 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
2df00 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2df10 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72  .  rc = 0;.  fpr
2df20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72  intf(stderr, "br
2df30 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  oke stale lock o
2df40 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b  n %s\n", cPath);
2df50 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
2df60 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65  pFile, conchFile
2df70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
2df80 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d    conchFile->h =
2df90 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65   fd;.  conchFile
2dfa0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  ->openFlags = O_
2dfb0 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
2dfc0 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a  .end_breaklock:.
2dfd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2dfe0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
2dff0 20 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68 29     unlink(tPath)
2e000 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
2e010 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20  lose(pFile, fd, 
2e020 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
2e030 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
2e040 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  err, "failed to 
2e050 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b  break stale lock
2e060 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63   on %s, %s\n", c
2e070 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20  Path, errmsg);. 
2e080 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e090 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72  }../* Take the r
2e0a0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e  equested lock on
2e0b0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2e0c0 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c  and break a stal
2e0d0 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a  e lock if the .*
2e0e0 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  * host id matche
2e0f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2e100 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
2e110 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
2e120 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
2e130 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b  , int lockType){
2e140 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
2e150 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2e160 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2e170 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
2e180 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
2e190 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2e1a0 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
2e1b0 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  hFile;.  int rc 
2e1c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2e1d0 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20  nt nTries = 0;. 
2e1e0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
2e1f0 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20   conchModTime;. 
2e200 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20   .  do {.    rc 
2e210 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
2e220 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
2e230 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2e240 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
2e250 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a  .    nTries ++;.
2e260 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e270 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
2e280 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20   /* If the lock 
2e290 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20  failed (busy):. 
2e2a0 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a        * 1st try:
2e2b0 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d   get the mod tim
2e2c0 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20  e of the conch, 
2e2d0 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72  wait 0.5s and tr
2e2e0 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20  y again. .      
2e2f0 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c   * 2nd try: fail
2e300 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65   if the mod time
2e310 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74   changed or host
2e320 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74   id is different
2e330 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a  , wait .       *
2e340 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65             10 se
2e350 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a  c and try again.
2e360 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79         * 3rd try
2e370 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  : break the lock
2e380 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20   unless the mod 
2e390 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64  time has changed
2e3a0 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
2e3b0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
2e3c0 66 3b 0a 20 20 20 20 20 20 69 66 28 20 66 73 74  f;.      if( fst
2e3d0 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  at(conchFile->h,
2e3e0 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20   &buf) ){.      
2e3f0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
2e400 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2e410 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e420 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
2e430 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
2e440 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31     if( nTries==1
2e450 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63   ){.        conc
2e460 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73  hModTime = buf.s
2e470 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20  t_mtimespec;.   
2e480 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30       usleep(5000
2e490 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35  00); /* wait 0.5
2e4a0 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
2e4b0 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20   lock again*/.  
2e4c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
2e4d0 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
2e4e0 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e   assert( nTries>
2e4f0 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  1 );.      if( c
2e500 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73  onchModTime.tv_s
2e510 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
2e520 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c  mespec.tv_sec ||
2e530 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68   .         conch
2e540 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20  ModTime.tv_nsec 
2e550 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
2e560 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20  pec.tv_nsec ){. 
2e570 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2e580 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2e590 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2e5a0 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b  if( nTries==2 ){
2e5b0 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20    .        char 
2e5c0 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  tBuf[PROXY_MAXCO
2e5d0 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
2e5e0 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72 65 61 64   int len = pread
2e5f0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74  (conchFile->h, t
2e600 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
2e610 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
2e620 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b      if( len<0 ){
2e630 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
2e640 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2e650 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
2e660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2e670 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
2e680 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
2e690 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en>PROXY_PATHIND
2e6a0 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28  EX && tBuf[0]==(
2e6b0 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
2e6c0 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20  VERSION){.      
2e6d0 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65      /* don't bre
2e6e0 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74  ak the lock if t
2e6f0 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e  he host id doesn
2e700 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  't match */.    
2e710 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d        if( 0!=mem
2e720 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f  cmp(&tBuf[PROXY_
2e730 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
2e740 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
2e750 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  IDLEN) ){.      
2e760 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e770 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
2e780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2e790 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2e7a0 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
2e7b0 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20  e lock on short 
2e7c0 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f  read or a versio
2e7d0 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20  n mismatch */.  
2e7e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e7f0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2e800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73      }.        us
2e810 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20  leep(10000000); 
2e820 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61  /* wait 10 sec a
2e830 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
2e840 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
2e850 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20   continue; .    
2e860 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2e870 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d   assert( nTries=
2e880 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
2e890 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  0==proxyBreakCon
2e8a0 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
2e8b0 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20  HostID) ){.     
2e8c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e8d0 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  K;.        if( l
2e8e0 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49  ockType==EXCLUSI
2e8f0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
2e900 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
2e910 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
2e920 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
2e930 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
2e940 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20  ARED_LOCK);     
2e950 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
2e960 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20          if( !rc 
2e970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2e980 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
2e990 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
2e9a0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2e9b0 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
2e9c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e9d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69   }.    }.  } whi
2e9e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
2e9f0 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20  USY && nTries<3 
2ea00 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  );.  .  return r
2ea10 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74  c;.}../* Takes t
2ea20 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69  he conch by taki
2ea30 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
2ea40 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f   and read the co
2ea50 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66  ntents conch, if
2ea60 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73   .** lockPath is
2ea70 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68   non-NULL, the h
2ea80 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20  ost ID and lock 
2ea90 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d  file path must m
2eaa0 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a  atch.  A NULL .*
2eab0 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73  * lockPath means
2eac0 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61   that the lockPa
2ead0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
2eae0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
2eaf0 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  d if the .** hos
2eb00 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20  t IDs match, or 
2eb10 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20  a new lock path 
2eb20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2eb30 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
2eb40 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20  .** and written 
2eb50 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  to the conch fil
2eb60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2eb70 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
2eb80 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
2eb90 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
2eba0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
2ebb0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
2ebc0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
2ebd0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
2ebe0 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f   .  if( pCtx->co
2ebf0 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20  nchHeld!=0 ){.  
2ec00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec10 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2ec20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
2ec30 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
2ec40 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64  chFile;.    uuid
2ec50 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20  _t myHostID;.   
2ec60 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b   int pError = 0;
2ec70 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75  .    char readBu
2ec80 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
2ec90 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c  LEN];.    char l
2eca0 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  ockPath[MAXPATHL
2ecb0 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74  EN];.    char *t
2ecc0 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55  empLockPath = NU
2ecd0 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  LL;.    int rc =
2ece0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2ecf0 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20  int createConch 
2ed00 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73  = 0;.    int hos
2ed10 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20  tIdMatch = 0;.  
2ed20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20    int readLen = 
2ed30 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c  0;.    int tryOl
2ed40 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
2ed50 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c     int forceNewL
2ed60 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
2ed70 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22   .    OSTRACE(("
2ed80 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  TAKECONCH  %d fo
2ed90 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
2eda0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
2edb0 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78             (pCtx
2edc0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2edd0 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ? pCtx->lockProx
2ede0 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  yPath : ":auto:"
2edf0 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a  ), getpid()));..
2ee00 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65      rc = proxyGe
2ee10 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44  tHostID(myHostID
2ee20 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  , &pError);.    
2ee30 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
2ee40 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
2ee50 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
2ee60 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a  Errno = pError;.
2ee70 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
2ee80 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
2ee90 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
2eea0 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
2eeb0 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f  yHostID, SHARED_
2eec0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
2eed0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2eee0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
2eef0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
2ef00 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20      /* read the 
2ef10 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66  existing conch f
2ef20 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c  ile */.    readL
2ef30 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  en = seekAndRead
2ef40 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63  ((unixFile*)conc
2ef50 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75  hFile, 0, readBu
2ef60 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
2ef70 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  HLEN);.    if( r
2ef80 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  eadLen<0 ){.    
2ef90 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20    /* I/O error: 
2efa0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
2efb0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
2efc0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
2efd0 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69  tErrno = conchFi
2efe0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
2eff0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f000 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20  _IOERR_READ;.   
2f010 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
2f020 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65  conch;.    }else
2f030 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50   if( readLen<=(P
2f040 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
2f050 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
2f060 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
2f070 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68   readBuf[0]!=(ch
2f080 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
2f090 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f  RSION ){.      /
2f0a0 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f  * a short read o
2f0b0 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74  r version format
2f0c0 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20   mismatch means 
2f0d0 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
2f0e0 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a  e a new .      *
2f0f0 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20  * conch file. . 
2f100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72       */.      cr
2f110 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20  eateConch = 1;. 
2f120 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74     }.    /* if t
2f130 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
2f140 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  es and the lock 
2f150 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69  path already exi
2f160 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  sts in the conch
2f170 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72  .    ** we'll tr
2f180 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74  y to use the pat
2f190 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63  h there, if we c
2f1a0 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70  an't open that p
2f1b0 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20  ath, we'll .    
2f1c0 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20  ** retry with a 
2f1d0 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  new auto-generat
2f1e0 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a  ed path .    */.
2f1f0 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63      do { /* in c
2f200 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74  ase we need to t
2f210 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20  ry again for an 
2f220 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63  :auto: named loc
2f230 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  k file */..     
2f240 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63   if( !createConc
2f250 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f  h && !forceNewLo
2f260 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
2f270 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20    hostIdMatch = 
2f280 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66  !memcmp(&readBuf
2f290 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
2f2a0 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20  ], myHostID, .  
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2d0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2f2e0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ;.        /* if 
2f2f0 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61  the conch has da
2f300 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  ta compare the c
2f310 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  ontents */.     
2f320 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
2f330 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
2f340 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20           /* for 
2f350 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c  auto-named local
2f360 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74   lock file, just
2f370 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20   check the host 
2f380 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20  ID and we'll.   
2f390 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74          ** use t
2f3a0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
2f3b0 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61  le path that's a
2f3c0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a  lready in there.
2f3d0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2f3e0 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74          if( host
2f3f0 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  IdMatch ){.     
2f400 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61         size_t pa
2f410 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e  thLen = (readLen
2f420 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   - PROXY_PATHIND
2f430 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EX);.           
2f440 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
2f450 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41  ( pathLen>=MAXPA
2f460 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  THLEN ){.       
2f470 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d         pathLen=M
2f480 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20  AXPATHLEN-1;.   
2f490 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f4a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f         memcpy(lo
2f4b0 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  ckPath, &readBuf
2f4c0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
2f4d0 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  ], pathLen);.   
2f4e0 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74           lockPat
2f4f0 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a  h[pathLen] = 0;.
2f500 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70              temp
2f510 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
2f520 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ath;.           
2f530 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
2f540 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2f550 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
2f560 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
2f570 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  th if the conch 
2f580 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
2f590 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f5a0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
2f5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f5c0 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64  }else if( hostId
2f5d0 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  Match.          
2f5e0 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70       && !strncmp
2f5f0 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
2f600 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50  Path, &readBuf[P
2f610 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
2f620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f630 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
2f640 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len-PROXY_PATHIN
2f650 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  DEX).        ){.
2f660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e            /* con
2f670 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b  ch host and lock
2f680 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20   path match */. 
2f690 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2f6a0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20  d_takeconch; .  
2f6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f6c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
2f6d0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e  if the conch isn
2f6e0 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20  't writable and 
2f6f0 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77  doesn't match, w
2f700 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20  e can't take it 
2f710 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f  */.      if( (co
2f720 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
2f730 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20  gs&O_RDWR) == 0 
2f740 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2f750 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2f760 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
2f770 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d  keconch;.      }
2f780 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
2f790 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e 63   either the conc
2f7a0 68 20 64 69 64 6e 27 74 20 6d 61 74 63 68 20 6f  h didn't match o
2f7b0 72 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  r we need to cre
2f7c0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f  ate a new one */
2f7d0 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78  .      if( !pCtx
2f7e0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
2f7f0 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  ){.        proxy
2f800 47 65 74 4c 6f 63 6b 50 61 74 68 28 70 43 74 78  GetLockPath(pCtx
2f810 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61  ->dbPath, lockPa
2f820 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
2f830 0a 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63  .        tempLoc
2f840 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
2f850 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65  ;.        /* cre
2f860 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
2f870 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c  e lock path _onl
2f880 79 5f 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  y_ if the conch 
2f890 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
2f8a0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2f8b0 20 2f 2a 20 75 70 64 61 74 65 20 63 6f 6e 63 68   /* update conch
2f8c0 20 77 69 74 68 20 68 6f 73 74 20 61 6e 64 20 70   with host and p
2f8d0 61 74 68 20 28 74 68 69 73 20 77 69 6c 6c 20 66  ath (this will f
2f8e0 61 69 6c 20 69 66 20 6f 74 68 65 72 20 70 72 6f  ail if other pro
2f8f0 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 68 61  cess.      ** ha
2f900 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
2f910 61 6c 72 65 61 64 79 29 2c 20 69 66 20 74 68 65  already), if the
2f920 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
2f930 2c 20 75 73 65 20 74 68 65 20 62 69 67 0a 20 20  , use the big.  
2f940 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20      ** stick..  
2f950 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 75 74      */.      fut
2f960 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  imes(conchFile->
2f970 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  h, NULL);.      
2f980 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20  if( hostIdMatch 
2f990 26 26 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20  && !createConch 
2f9a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
2f9b0 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  onchFile->pInode
2f9c0 20 26 26 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70   && conchFile->p
2f9d0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
2f9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2f9f0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
2fa00 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
2fa10 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
2fa20 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
2fa30 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
2fa40 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
2fa50 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
2fa60 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
2fa70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2fa80 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
2fa90 20 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20    } else {      
2faa0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72      .          r
2fab0 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
2fac0 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
2fad0 49 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ID, EXCLUSIVE_LO
2fae0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
2faf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fb00 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
2fb10 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
2fb20 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2fb30 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43  *)conchFile, EXC
2fb40 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2fb50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fb60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fb70 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72  .        char wr
2fb80 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2fb90 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
2fba0 20 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53        int writeS
2fbb0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
2fbc0 20 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42   .        writeB
2fbd0 75 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72  uffer[0] = (char
2fbe0 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
2fbf0 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ION;.        mem
2fc00 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
2fc10 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
2fc20 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
2fc30 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20  XY_HOSTIDLEN);. 
2fc40 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
2fc50 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d  >lockProxyPath!=
2fc60 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
2fc70 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65    strlcpy(&write
2fc80 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
2fc90 48 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c  HINDEX], pCtx->l
2fca0 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41  ockProxyPath, MA
2fcb0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
2fcc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fcd0 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69      strlcpy(&wri
2fce0 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
2fcf0 41 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c  ATHINDEX], tempL
2fd00 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
2fd10 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEN);.        }.
2fd20 20 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a          writeSiz
2fd30 65 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  e = PROXY_PATHIN
2fd40 44 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72  DEX + strlen(&wr
2fd50 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2fd60 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20  PATHINDEX]);.   
2fd70 20 20 20 20 20 72 6f 62 75 73 74 5f 66 74 72 75       robust_ftru
2fd80 6e 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d  ncate(conchFile-
2fd90 3e 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0a  >h, writeSize);.
2fda0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
2fdb0 78 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f  xWrite((sqlite3_
2fdc0 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65  file *)conchFile
2fdd0 2c 20 77 72 69 74 65 42 75 66 66 65 72 2c 20 77  , writeBuffer, w
2fde0 72 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  riteSize, 0);.  
2fdf0 20 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e 63        fsync(conc
2fe00 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20  hFile->h);.     
2fe10 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61     /* If we crea
2fe20 74 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68 20  ted a new conch 
2fe30 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20 75  file (not just u
2fe40 70 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74 65  pdated the conte
2fe50 6e 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20 20  nts of a .      
2fe60 20 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63     ** valid conc
2fe70 68 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f 20  h file), try to 
2fe80 6d 61 74 63 68 20 74 68 65 20 70 65 72 6d 69 73  match the permis
2fe90 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74  sions of the dat
2fea0 61 62 61 73 65 20 0a 20 20 20 20 20 20 20 20 20  abase .         
2feb0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
2fec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fed0 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
2fee0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2fef0 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
2ff00 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 66 73      int err = fs
2ff10 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
2ff20 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  uf);.          i
2ff30 66 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20  f( err==0 ){.   
2ff40 20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20           mode_t 
2ff50 63 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d  cmode = buf.st_m
2ff60 6f 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49  ode&(S_IRUSR|S_I
2ff70 57 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53  WUSR | S_IRGRP|S
2ff80 5f 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20  _IWGRP |.       
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffb0 20 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48   S_IROTH|S_IWOTH
2ffc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  );.            /
2ffd0 2a 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  * try to match t
2ffe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fff0 20 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73   R/W permissions
30000 2c 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65  , ignore failure
30010 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
30020 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20  TE_PROXY_DEBUG. 
30030 20 20 20 20 20 20 20 20 20 20 20 66 63 68 6d 6f             fchmo
30040 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
30050 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20  cmode);.#else.  
30060 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20            do{.  
30070 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30080 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c   fchmod(conchFil
30090 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 20 20  e->h, cmode);.  
300a0 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65            }while
300b0 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20 65 72  ( rc==(-1) && er
300c0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
300d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
300e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
300f0 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
30100 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
30110 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
30120 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
30130 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20 25  FAILED with %d %
30140 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
30150 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f 64              cmod
30160 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f  e, code, strerro
30170 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  r(code));.      
30180 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
30190 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72               fpr
301a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
301b0 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44  hmod %o SUCCEDED
301c0 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20  \n",cmode);.    
301d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
301e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
301f0 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
30200 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
30210 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
30220 65 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45  err, "STAT FAILE
30230 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25 73  D[%d] with %d %s
30240 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
30250 20 20 20 20 20 20 20 20 20 20 65 72 72 2c 20 63            err, c
30260 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f  ode, strerror(co
30270 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  de));.#endif.   
30280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30290 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
302a0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
302b0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
302c0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
302d0 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
302e0 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  CK);.      .    
302f0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20  end_takeconch:. 
30300 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
30310 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45  RANSPROXY: CLOSE
30320 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e    %d\n", pFile->
30330 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  h));.      if( r
30340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30350 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
30360 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
30370 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
30380 20 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f           robust_
30390 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
303a0 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
303b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
303c0 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
303d0 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  1;.        int f
303e0 64 20 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64  d = open(pCtx->d
303f0 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70  bPath, pFile->op
30400 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  enFlags,.       
30410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
30420 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
30430 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
30440 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
30450 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f  (("TRANSPROXY: O
30460 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 29  PEN  %d\n", fd))
30470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 64  ;.        if( fd
30480 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
30490 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a   pFile->h = fd;.
304a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
304b0 20 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49           rc=SQLI
304c0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
304d0 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ; /* SQLITE_BUSY
304e0 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  ? proxyTakeConch
304f0 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20   called.        
30500 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e     during lockin
30510 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  g */.        }. 
30520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
30530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
30540 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  & !pCtx->lockPro
30550 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  xy ){.        ch
30560 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c  ar *path = tempL
30570 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f  ockPath ? tempLo
30580 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c  ckPath : pCtx->l
30590 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
305a0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
305b0 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70  CreateUnixFile(p
305c0 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b  ath, &pCtx->lock
305d0 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20  Proxy, 1);.     
305e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
305f0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
30600 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f  TE_NOMEM && tryO
30610 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  ldLockPath ){.  
30620 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f          /* we co
30630 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74 68  uldn't create th
30640 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
30650 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c  e with the old l
30660 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20  ock file path.  
30670 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
30680 72 79 20 61 67 61 69 6e 20 76 69 61 20 61 75 74  ry again via aut
30690 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20  o-naming .      
306a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
306b0 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61    forceNewLockPa
306c0 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
306d0 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
306e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
306f0 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20  continue; /* go 
30700 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b  back to the do {
30710 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f  } while start po
30720 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a  int, try again *
30730 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
30740 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
30750 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30760 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
30770 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
30780 20 70 61 74 68 20 69 66 20 77 65 20 65 78 74 72   path if we extr
30790 61 63 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a  acted the value.
307a0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d           ** from
307b0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
307c0 6f 72 20 74 68 65 20 70 61 74 68 20 77 61 73 20  or the path was 
307d0 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
307e0 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20   stack.         
307f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  */.        if( t
30800 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  empLockPath ){. 
30810 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c           pCtx->l
30820 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
30830 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
30840 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b  , tempLockPath);
30850 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
30860 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
30870 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
30880 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
30890 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
308a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
308b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
308c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
308d0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
308e0 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  chHeld = 1;.    
308f0 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66 28      .        if(
30900 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
30910 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
30920 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
30930 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69          afpLocki
30940 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74  ngContext *afpCt
30950 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  x;.          afp
30960 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  Ctx = (afpLockin
30970 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d  gContext *)pCtx-
30980 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b  >lockProxy->lock
30990 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
309a0 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62        afpCtx->db
309b0 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
309c0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
309d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
309e0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  se {.        con
309f0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
30a00 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
30a10 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
30a20 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  e, NO_LOCK);.   
30a30 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
30a40 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE(("TAKECONCH  
30a50 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
30a60 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
30a70 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
30a80 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65  E_OK?"ok":"faile
30a90 64 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  d"));.      retu
30aa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69  rn rc;.    } whi
30ab0 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61  le (1); /* in ca
30ac0 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  se we need to re
30ad0 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c  try the :auto: l
30ae0 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20 20  ock file - .    
30af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
30b00 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  we should never 
30b10 67 65 74 20 68 65 72 65 20 65 78 63 65 70 74 20  get here except 
30b20 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75  via the 'continu
30b30 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a  e' call. */.  }.
30b40 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c  }../*.** If pFil
30b50 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  e holds a lock o
30b60 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  n a conch file, 
30b70 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61  then release tha
30b80 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t lock..*/.stati
30b90 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61  c int proxyRelea
30ba0 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  seConch(unixFile
30bb0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
30bc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
30bd0 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
30be0 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64  utine return cod
30bf0 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  e */.  proxyLock
30c00 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
30c10 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  ;  /* The lockin
30c20 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  g context for th
30c30 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a  e proxy lock */.
30c40 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
30c50 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  hFile;        /*
30c60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
30c70 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43  ch file */..  pC
30c80 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
30c90 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
30ca0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
30cb0 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d  t;.  conchFile =
30cc0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
30cd0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
30ce0 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66  LEASECONCH  %d f
30cf0 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
30d00 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
30d10 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
30d20 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
30d30 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
30d40 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
30d50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  , .           ge
30d60 74 70 69 64 28 29 29 29 3b 0a 20 20 69 66 28 20  tpid()));.  if( 
30d70 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
30d80 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  0 ){.    rc = co
30d90 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
30da0 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
30db0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
30dc0 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
30dd0 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  }.  pCtx->conchH
30de0 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41  eld = 0;.  OSTRA
30df0 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43  CE(("RELEASECONC
30e00 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
30e10 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
30e20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54        (rc==SQLIT
30e30 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
30e40 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74  ailed")));.  ret
30e50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30e60 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
30e70 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
30e80 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20  le, compute the 
30e90 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63  name of its conc
30ea0 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65  h file..** Store
30eb0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e   the conch filen
30ec0 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ame in memory ob
30ed0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
30ee0 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
30ef0 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74   Make *pConchPat
30f00 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  h point to the n
30f10 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  ew name.  Return
30f20 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
30f30 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49  ccess.** or SQLI
30f40 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62  TE_NOMEM if unab
30f50 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d  le to obtain mem
30f60 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ory..**.** The c
30f70 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
30f80 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
30f90 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  g that the alloc
30fa0 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  ated memory.** s
30fb0 70 61 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c  pace is eventual
30fc0 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
30fd0 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73  *pConchPath is s
30fe0 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20  et to NULL if a 
30ff0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
31000 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
31010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
31020 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
31030 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50  thname(char *dbP
31040 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e  ath, char **pCon
31050 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  chPath){.  int i
31060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31070 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
31080 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
31090 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  t len = (int)str
310a0 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20  len(dbPath); /* 
310b0 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61  Length of databa
310c0 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62  se filename - db
310d0 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Path */.  char *
310e0 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20  conchPath;      
310f0 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65          /* buffe
31100 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f  r in which to co
31110 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61  nstruct conch na
31120 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  me */..  /* Allo
31130 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
31140 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
31150 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
31160 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a   the name to.  *
31170 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
31180 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
31190 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20  ase file. */  . 
311a0 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63   *pConchPath = c
311b0 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61 72  onchPath = (char
311c0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
311d0 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66  c(len + 8);.  if
311e0 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29  ( conchPath==0 )
311f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
31200 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
31210 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74   memcpy(conchPat
31220 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31  h, dbPath, len+1
31230 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69  );.  .  /* now i
31240 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f  nsert a "." befo
31250 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68  re the last / ch
31260 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72  aracter */.  for
31270 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d  ( i=(len-1); i>=
31280 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66  0; i-- ){.    if
31290 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d  ( conchPath[i]==
312a0 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  '/' ){.      i++
312b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
312c0 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68     }.  }.  conch
312d0 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77  Path[i]='.';.  w
312e0 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a  hile ( i<len ){.
312f0 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b      conchPath[i+
31300 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20  1]=dbPath[i];.  
31310 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
31320 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f   append the "-co
31330 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f 20 74  nch" suffix to t
31340 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d  he file */.  mem
31350 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69  cpy(&conchPath[i
31360 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37  +1], "-conch", 7
31370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
31380 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61  t)strlen(conchPa
31390 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a  th) == len+7 );.
313a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
313b0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65  _OK;.}.../* Take
313c0 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67  s a fully config
313d0 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69  ured proxy locki
313e0 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69  ng-style unix fi
313f0 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a  le and switches.
31400 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ** the local loc
31410 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a  k file path .*/.
31420 73 74 61 74 69 63 20 69 6e 74 20 73 77 69 74 63  static int switc
31430 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75  hLockProxyPath(u
31440 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
31450 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
31460 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
31470 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
31480 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
31490 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
314a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
314b0 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d   char *oldPath =
314c0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
314d0 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Path;.  int rc =
314e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
314f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
31500 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock!=NO_LOCK ){.
31510 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31520 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20  E_BUSY;.  }  .. 
31530 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   /* nothing to d
31540 6f 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73  o if the path is
31550 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72   NULL, :auto: or
31560 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78 69   matches the exi
31570 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20  sting path */.  
31580 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74  if( !path || pat
31590 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73  h[0]=='\0' || !s
315a0 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75  trcmp(path, ":au
315b0 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c  to:") ||.    (ol
315c0 64 50 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d  dPath && !strncm
315d0 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c  p(oldPath, path,
315e0 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b   MAXPATHLEN)) ){
315f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31600 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
31610 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f      unixFile *lo
31620 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e  ckProxy = pCtx->
31630 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70  lockProxy;.    p
31640 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e  Ctx->lockProxy=N
31650 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63  ULL;.    pCtx->c
31660 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20  onchHeld = 0;.  
31670 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21    if( lockProxy!
31680 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  =NULL ){.      r
31690 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  c=lockProxy->pMe
316a0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
316b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63  lite3_file *)loc
316c0 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
316d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
316e0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
316f0 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
31700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31710 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68  te3_free(oldPath
31720 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  );.    pCtx->loc
31730 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
31740 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
31750 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  path);.  }.  .  
31760 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
31770 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66  .** pFile is a f
31780 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65  ile that has bee
31790 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72  n opened by a pr
317a0 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20  ior xOpen call. 
317b0 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20   dbPath.** is a 
317c0 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 61 74  string buffer at
317d0 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45   least MAXPATHLE
317e0 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73 20 69  N+1 characters i
317f0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n size..**.** Th
31800 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20  is routine find 
31810 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  the filename ass
31820 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 46 69  ociated with pFi
31830 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20 69 74  le and writes it
31840 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a  .** int dbPath..
31850 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
31860 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
31870 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
31880 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64   *pFile, char *d
31890 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69  bPath){.#if defi
318a0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
318b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
318c0 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  hod == &afpIoMet
318d0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61  hods ){.    /* a
318e0 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61  fp style keeps a
318f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
31900 65 20 64 62 20 70 61 74 68 20 69 6e 20 74 68 65  e db path in the
31910 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20   filePath field 
31920 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
31930 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73  truct */.    ass
31940 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e  ert( (int)strlen
31950 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  ((char*)pFile->l
31960 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d  ockingContext)<=
31970 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20  MAXPATHLEN );.  
31980 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68    strlcpy(dbPath
31990 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  , ((afpLockingCo
319a0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
319b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
319c0 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  dbPath, MAXPATHL
319d0 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65  EN);.  } else.#e
319e0 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
319f0 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f  ->pMethod == &do
31a00 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
31a10 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63  {.    /* dot loc
31a20 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65  k style uses the
31a30 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
31a40 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f   to store the do
31a50 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69  t lock.    ** fi
31a60 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
31a70 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  nt len = strlen(
31a80 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
31a90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d  ockingContext) -
31aa0 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f   strlen(DOTLOCK_
31ab0 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d  SUFFIX);.    mem
31ac0 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
31ad0 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
31ae0 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b  ngContext, len +
31af0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
31b00 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73    /* all other s
31b10 74 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f  tyles use the lo
31b20 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f  cking context to
31b30 20 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69   store the db fi
31b40 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61  le path */.    a
31b50 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63  ssert( strlen((c
31b60 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
31b70 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
31b80 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
31b90 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28  trlcpy(dbPath, (
31ba0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
31bb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41  ckingContext, MA
31bc0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20  XPATHLEN);.  }. 
31bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31be0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65  K;.}../*.** Take
31bf0 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c  s an already fil
31c00 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65  led in unix file
31c10 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73   and alters it s
31c20 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69  o all file locki
31c30 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70  ng .** will be p
31c40 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
31c50 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b  local proxy lock
31c60 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c   file.  The foll
31c70 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20  owing fields.** 
31c80 61 72 65 20 70 72 65 73 65 72 76 65 64 20 69 6e  are preserved in
31c90 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
31ca0 74 65 78 74 20 73 6f 20 74 68 61 74 20 74 68 65  text so that the
31cb0 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
31cc0 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e  d and .** the un
31cd0 69 78 20 73 74 72 75 63 74 75 72 65 20 70 72 6f  ix structure pro
31ce0 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70  perly cleaned up
31cf0 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a   at close time:.
31d00 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  **  ->lockingCon
31d10 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68  text.**  ->pMeth
31d20 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  od.*/.static int
31d30 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
31d40 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
31d50 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
31d60 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
31d70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
31d80 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72  xt *pCtx;.  char
31d90 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c   dbPath[MAXPATHL
31da0 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20  EN+1];       /* 
31db0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
31dc0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
31dd0 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55  har *lockPath=NU
31de0 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  LL;.  int rc = S
31df0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69  QLITE_OK;.  .  i
31e00 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
31e10 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock!=NO_LOCK ){.
31e20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31e30 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72  E_BUSY;.  }.  pr
31e40 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
31e50 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64  nixFile(pFile, d
31e60 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70  bPath);.  if( !p
31e70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
31e80 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
31e90 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
31ea0 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d  ){.    lockPath=
31eb0 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
31ec0 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61     lockPath=(cha
31ed0 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20  r *)path;.  }.  
31ee0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41  .  OSTRACE(("TRA
31ef0 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20  NSPROXY  %d for 
31f00 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %s pid=%d\n", pF
31f10 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
31f20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c     (lockPath ? l
31f30 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  ockPath : ":auto
31f40 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b  :"), getpid()));
31f50 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74  ..  pCtx = sqlit
31f60 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
31f70 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66  f(*pCtx) );.  if
31f80 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
31f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
31fa0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
31fb0 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65  et(pCtx, 0, size
31fc0 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72  of(*pCtx));..  r
31fd0 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43  c = proxyCreateC
31fe0 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50  onchPathname(dbP
31ff0 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
32000 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66  hFilePath);.  if
32010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32020 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ){.    rc = prox
32030 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
32040 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
32050 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
32060 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69  hFile, 0);.    i
32070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
32080 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69 6c  NTOPEN && ((pFil
32090 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52  e->openFlags&O_R
320a0 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20  DWR) == 0) ){.  
320b0 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74 68      /* if (a) th
320c0 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72 65  e open flags are
320d0 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62 29   not O_RDWR, (b)
320e0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74   the conch isn't
320f0 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20 20   there, and.    
32100 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69 6c    ** (c) the fil
32110 65 20 73 79 73 74 65 6d 20 69 73 20 72 65 61 64  e system is read
32120 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62  -only, then enab
32130 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63  le no-locking ac
32140 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  cess..      ** U
32150 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e  gh, since O_RDON
32160 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74 65  LY==0x0000 we te
32170 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20 73  st for !O_RDWR s
32180 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61 73  ince unixOpen as
32190 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 74  serts.      ** t
321a0 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77 69  hat openFlags wi
321b0 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65  ll have only one
321c0 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20   of O_RDONLY or 
321d0 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f  O_RDWR..      */
321e0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
321f0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
32200 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 63     struct stat c
32210 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20  onchInfo;.      
32220 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d  int goLockless =
32230 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73   0;..      if( s
32240 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  tat(pCtx->conchF
32250 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63 68 49  ilePath, &conchI
32260 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20  nfo) == -1 ) {. 
32270 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
32280 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
32290 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54  if( (err==ENOENT
322a0 29 20 26 26 20 28 73 74 61 74 66 73 28 64 62 50  ) && (statfs(dbP
322b0 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
322c0 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20   -1) ){.        
322d0 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28    goLockless = (
322e0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
322f0 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e  NT_RDONLY) == MN
32300 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  T_RDONLY;.      
32310 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32320 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73    if( goLockless
32330 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78   ){.        pCtx
32340 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31  ->conchHeld = -1
32350 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46  ; /* read only F
32360 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  S/ lockless */. 
32370 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32380 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
32390 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28     }.  }  .  if(
323a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
323b0 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  & lockPath ){.  
323c0 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
323d0 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
323e0 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50  bStrDup(0, lockP
323f0 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ath);.  }..  if(
32400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32410 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61  {.    pCtx->dbPa
32420 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
32430 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b  rDup(0, dbPath);
32440 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 64  .    if( pCtx->d
32450 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  bPath==NULL ){. 
32460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32470 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
32480 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
32490 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
324a0 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c  all memory is al
324b0 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20  located, proxys 
324c0 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  are created and 
324d0 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a  assigned, .    *
324e0 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63  * switch the loc
324f0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64  king context and
32500 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65   pMethod then re
32510 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  turn..    */.   
32520 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
32530 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65  gContext = pFile
32540 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
32550 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ;.    pFile->loc
32560 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
32570 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f  tx;.    pCtx->pO
32580 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65  ldMethod = pFile
32590 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70  ->pMethod;.    p
325a0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
325b0 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b  &proxyIoMethods;
325c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
325d0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  ( pCtx->conchFil
325e0 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43 74 78  e ){ .      pCtx
325f0 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  ->conchFile->pMe
32600 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
32610 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74  lite3_file *)pCt
32620 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
32630 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
32640 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
32650 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
32660 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
32670 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
32680 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
32690 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
326a0 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20  hFilePath); .   
326b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
326c0 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  tx);.  }.  OSTRA
326d0 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20  CE(("TRANSPROXY 
326e0 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %d %s\n", pFile
326f0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
32700 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
32710 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
32720 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
32730 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
32740 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73   routine handles
32750 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
32760 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68  ntrol() calls th
32770 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63 0a  at are specific.
32780 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b  ** to proxy lock
32790 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
327a0 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
327b0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
327c0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
327d0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
327e0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
327f0 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  ase SQLITE_GET_L
32800 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
32810 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
32820 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
32830 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28  e*)id;.      if(
32840 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
32850 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f  == &proxyIoMetho
32860 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  ds ){.        pr
32870 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
32880 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
32890 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29  LockingContext*)
328a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
328b0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  ntext;.        p
328c0 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46  roxyTakeConch(pF
328d0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ile);.        if
328e0 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
328f0 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
32900 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
32910 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e  **)pArg = pCtx->
32920 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
32930 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
32940 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20          *(const 
32950 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22  char **)pArg = "
32960 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64  :auto: (not held
32970 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  )";.        }.  
32980 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
32990 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
329a0 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c  r **)pArg = NULL
329b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
329c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
329d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
329e0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
329f0 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
32a00 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
32a10 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
32a20 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  id;.      int rc
32a30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
32a40 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53      int isProxyS
32a50 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70  tyle = (pFile->p
32a60 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79  Method == &proxy
32a70 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20  IoMethods);.    
32a80 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c    if( pArg==NULL
32a90 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20   || (const char 
32aa0 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20  *)pArg==0 ){.   
32ab0 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79       if( isProxy
32ac0 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Style ){.       
32ad0 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70     /* turn off p
32ae0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e  roxy locking - n
32af0 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a  ot supported */.
32b00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
32b10 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51  QLITE_ERROR /*SQ
32b20 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53  LITE_PROTOCOL? S
32b30 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b  QLITE_MISUSE?*/;
32b40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
32b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
32b60 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b  n off proxy lock
32b70 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66  ing - already of
32b80 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20  f - NOOP */.    
32b90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32ba0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
32bb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32bc0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
32bd0 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f  *proxyPath = (co
32be0 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b  nst char *)pArg;
32bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50  .        if( isP
32c00 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20  roxyStyle ){.   
32c10 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b         proxyLock
32c20 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
32c30 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
32c40 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
32c50 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  text*)pFile->loc
32c60 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
32c70 20 20 20 20 20 20 20 69 66 28 20 21 73 74 72 63         if( !strc
32c80 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a  mp(pArg, ":auto:
32c90 22 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ") .           |
32ca0 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  | (pCtx->lockPro
32cb0 78 79 50 61 74 68 20 26 26 0a 20 20 20 20 20 20  xyPath &&.      
32cc0 20 20 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d           !strncm
32cd0 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  p(pCtx->lockProx
32ce0 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68  yPath, proxyPath
32cf0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20  , MAXPATHLEN)). 
32d00 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
32d10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
32d20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
32d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32d40 20 20 20 20 20 72 63 20 3d 20 73 77 69 74 63 68       rc = switch
32d50 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46  LockProxyPath(pF
32d60 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ile, proxyPath);
32d70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32d80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32d90 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e        /* turn on
32da0 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
32db0 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ing */.         
32dc0 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73   rc = proxyTrans
32dd0 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69  formUnixFile(pFi
32de0 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  le, proxyPath);.
32df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32e00 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
32e10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  c;.    }.    def
32e20 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
32e30 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54  sert( 0 );  /* T
32e40 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20  he call assures 
32e50 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20  that only valid 
32e60 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74  opcodes are sent
32e70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
32e80 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
32e90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
32ea0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  RROR;.}../*.** W
32eb0 69 74 68 69 6e 20 74 68 69 73 20 64 69 76 69 73  ithin this divis
32ec0 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e  ion (the proxyin
32ed0 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  g locking implem
32ee0 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72  entation) the pr
32ef0 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76  ocedures.** abov
32f00 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65  e this point are
32f10 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20   all utilities. 
32f20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65   The lock-relate
32f30 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  d methods of the
32f40 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  .** proxy-lockin
32f50 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  g sqlite3_io_met
32f60 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f  hod object follo
32f70 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  w..*/.../*.** Th
32f80 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
32f90 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
32fa0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
32fb0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
32fc0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
32fd0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
32fe0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
32ff0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
33000 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
33010 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
33020 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
33030 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
33040 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
33050 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
33060 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
33070 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
33080 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
33090 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
330a0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
330b0 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
330c0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
330d0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
330e0 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78  ResOut) {.  unix
330f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
33100 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
33110 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
33120 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
33130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33140 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
33150 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
33160 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
33170 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
33180 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
33190 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
331a0 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
331b0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
331c0 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
331d0 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
331e0 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d  return proxy->pM
331f0 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73  ethod->xCheckRes
33200 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74  ervedLock((sqlit
33210 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
33220 70 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65  pResOut);.    }e
33230 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c  lse{ /* conchHel
33240 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73  d < 0 is lockles
33250 73 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 4f  s */.      pResO
33260 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut=0;.    }.  }.
33270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33280 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
33290 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
332a0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
332b0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
332c0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
332d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
332e0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
332f0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
33300 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
33310 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
33320 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
33330 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
33340 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
33350 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
33360 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
33370 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
33380 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
33390 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
333a0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
333b0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
333c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
333d0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
333e0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
333f0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
33400 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
33410 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
33420 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
33430 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
33440 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
33450 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
33460 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
33470 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
33480 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
33490 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
334a0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
334b0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
334c0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
334d0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
334e0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
334f0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
33500 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
33510 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
33520 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
33530 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
33540 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
33550 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
33560 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
33570 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
33580 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
33590 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
335a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
335b0 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33  roxyLock(sqlite3
335c0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
335d0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
335e0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
335f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
33600 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
33610 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
33620 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
33630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
33640 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
33650 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
33660 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
33670 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
33680 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  text;.    if( pC
33690 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
336a0 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  ){.      unixFil
336b0 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d  e *proxy = pCtx-
336c0 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
336d0 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d    rc = proxy->pM
336e0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
336f0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
33700 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  y, eFileLock);. 
33710 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
33720 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65  eLock = proxy->e
33730 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65  FileLock;.    }e
33740 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
33750 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
33760 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
33770 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
33780 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
33790 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
337a0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
337b0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
337c0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
337d0 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
337e0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
337f0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
33800 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
33810 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
33820 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
33830 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
33840 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
33850 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
33860 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
33870 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
33880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33890 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69  proxyUnlock(sqli
338a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
338b0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
338c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
338d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
338e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
338f0 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
33900 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
33910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
33920 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33930 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
33940 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
33950 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
33960 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28  Context;.    if(
33970 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
33980 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78  >0 ){.      unix
33990 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
339a0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
339b0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d       rc = proxy-
339c0 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
339d0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
339e0 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63  )proxy, eFileLoc
339f0 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  k);.      pFile-
33a00 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f  >eFileLock = pro
33a10 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  xy->eFileLock;. 
33a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33a30 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
33a40 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
33a50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
33a60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
33a70 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61  Close a file tha
33a80 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63  t uses proxy loc
33a90 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ks..*/.static in
33aa0 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
33ab0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
33ac0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
33ad0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
33ae0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
33af0 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ;.    proxyLocki
33b00 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
33b10 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
33b20 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
33b30 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
33b40 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f      unixFile *lo
33b50 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e  ckProxy = pCtx->
33b60 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75  lockProxy;.    u
33b70 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
33b80 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
33b90 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63  File;.    int rc
33ba0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33bb0 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50    .    if( lockP
33bc0 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
33bd0 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
33be0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
33bf0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f  sqlite3_file*)lo
33c00 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b  ckProxy, NO_LOCK
33c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
33c20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
33c30 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78     rc = lockProx
33c40 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
33c50 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
33c60 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
33c70 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
33c80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
33c90 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
33ca0 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74  roxy);.      pCt
33cb0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30  x->lockProxy = 0
33cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33cd0 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20  conchFile ){.   
33ce0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
33cf0 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20  chHeld ){.      
33d00 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65    rc = proxyRele
33d10 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  aseConch(pFile);
33d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
33d30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
33d40 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
33d50 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
33d60 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
33d70 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
33d80 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
33d90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
33da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
33db0 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  ee(conchFile);. 
33dc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
33dd0 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
33de0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
33df0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
33e00 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
33e10 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
33e20 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78  e3DbFree(0, pCtx
33e30 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f  ->dbPath);.    /
33e40 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72  * restore the or
33e50 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63  iginal locking c
33e60 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68  ontext and pMeth
33e70 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74  od then close it
33e80 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   */.    pFile->l
33e90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
33ea0 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67  pCtx->oldLocking
33eb0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69  Context;.    pFi
33ec0 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43  le->pMethod = pC
33ed0 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a  tx->pOldMethod;.
33ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
33ef0 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75  (pCtx);.    retu
33f00 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  rn pFile->pMetho
33f10 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20  d->xClose(id);. 
33f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
33f30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64  TE_OK;.}....#end
33f40 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
33f50 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
33f60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
33f70 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
33f80 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
33f90 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65  ng style is inte
33fa0 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69 74  nded for use wit
33fb0 68 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  h AFP filesystem
33fc0 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20  s..** And since 
33fd0 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70  AFP is only supp
33fe0 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c  orted on MacOSX,
33ff0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   the proxy locki
34000 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65  ng is also.** re
34010 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f  stricted to MacO
34020 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  SX..** .**.*****
34030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
34040 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  nd of the proxy 
34050 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
34060 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
34070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
34080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
340d0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
340e0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
340f0 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  m interface..**.
34100 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
34110 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46  registers all VF
34120 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
34130 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20  s for unix-like 
34140 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73  operating.** sys
34150 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74  tems.  This rout
34160 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c  ine, and the sql
34170 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f  ite3_os_end() ro
34180 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f  utine that follo
34190 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65  ws,.** should be
341a0 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e   the only routin
341b0 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  es in this file 
341c0 74 68 61 74 20 61 72 65 20 76 69 73 69 62 6c 65  that are visible
341d0 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66   from other.** f
341e0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  iles..**.** This
341f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
34200 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53  ed once during S
34210 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61  QLite initializa
34220 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a  tion and by a.**
34230 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20   single thread. 
34240 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
34250 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78  cation and mutex
34260 20 73 75 62 73 79 73 74 65 6d 73 20 68 61 76 65   subsystems have
34270 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72   not.** necessar
34280 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ily been initial
34290 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 72  ized when this r
342a0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
342b0 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a  , and so they.**
342c0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75   should not be u
342d0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
342e0 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
342f0 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54  ){ .  /* .  ** T
34300 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
34310 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e  ro defines an in
34320 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e  itializer for an
34330 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
34340 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61  ect..  ** The na
34350 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 69 73  me of the VFS is
34360 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70   NAME.  The pApp
34370 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65  Data is a pointe
34380 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20  r to a pointer. 
34390 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64   ** to the "find
343a0 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28  er" function.  (
343b0 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70 6f  pAppData is a po
343c0 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74  inter to a point
343d0 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  er because.  ** 
343e0 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20  silly C90 rules 
343f0 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a  prohibit a void*
34400 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74   from being cast
34410 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70   to a function p
34420 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20  ointer.  ** and 
34430 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f  so we have to go
34440 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74   through the int
34450 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65  ermediate pointe
34460 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
34470 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f  ems.  ** when co
34480 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65  mpiling with -pe
34490 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e  dantic-errors on
344a0 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a   GCC.).  **.  **
344b0 20 54 68 65 20 46 49 4e 44 45 52 20 70 61 72 61   The FINDER para
344c0 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61  meter to this ma
344d0 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  cro is the name 
344e0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  of the pointer t
344f0 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65  o the.  ** finde
34500 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  r-function.  The
34510 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
34520 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
34530 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73  er to the.  ** s
34540 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73  qlite_io_methods
34550 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
34560 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69  lements the desi
34570 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  red locking.  **
34580 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65   behaviors.  See
34590 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62   the division ab
345a0 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ove that contain
345b0 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a  s the IOMETHODS.
345c0 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61    ** macro for a
345d0 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  ddition informat
345e0 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75  ion on finder-fu
345f0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  nctions..  **.  
34600 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20  ** Most finders 
34610 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20  simply return a 
34620 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
34630 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
34640 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63  thods.  ** objec
34650 74 2e 20 20 42 75 74 20 74 68 65 20 22 61 75 74  t.  But the "aut
34660 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61  olockIoFinder" a
34670 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f  vailable on MacO
34680 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65  SX does a little
34690 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  .  ** more than 
346a0 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61  that; it looks a
346b0 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
346c0 20 74 79 70 65 20 74 68 61 74 20 68 6f 73 74 73   type that hosts
346d0 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
346e0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69  ase file and tri
346f0 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20  es to choose an 
34700 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61  locking method a
34710 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20  ppropriate for. 
34720 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73   ** that filesys
34730 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  tem time..  */. 
34740 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53   #define UNIXVFS
34750 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52  (VFSNAME, FINDER
34760 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
34770 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
34780 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
34790 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
347a0 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  on */           
347b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73           \.    s
347c0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c  izeof(unixFile),
347d0 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
347e0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
347f0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58         \.    MAX
34800 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20  _PATHNAME,      
34810 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65     /* mxPathname
34820 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
34830 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20       \.    0,   
34840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34850 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20   /* pNext */    
34860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34870 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45     \.    VFSNAME
34880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
34890 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20  * zName */      
348a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
348b0 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29 26 46   \.    (void*)&F
348c0 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f 2a 20  INDER,       /* 
348d0 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20  pAppData */     
348e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
348f0 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20  .    unixOpen,  
34900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
34910 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  pen */          
34920 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
34930 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20     unixDelete,  
34940 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
34950 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ete */          
34960 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
34970 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20   unixAccess,    
34980 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
34990 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
349a0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
349b0 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  nixFullPathname,
349c0 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
349d0 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  hname */        
349e0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
349f0 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  xDlOpen,        
34a00 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
34a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
34a30 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
34a40 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20   /* xDlError */ 
34a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a60 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53     \.    unixDlS
34a70 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
34a80 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20  * xDlSym */     
34a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34aa0 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f   \.    unixDlClo
34ab0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
34ac0 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  xDlClose */     
34ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
34ae0 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e  .    unixRandomn
34af0 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52  ess,       /* xR
34b00 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20  andomness */    
34b10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
34b20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20     unixSleep,   
34b30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
34b40 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ep */           
34b50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
34b60 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
34b70 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
34b80 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20  ntTime */       
34b90 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
34ba0 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  nixGetLastError,
34bb0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
34bc0 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
34bd0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
34be0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
34bf0 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69  4, /* xCurrentTi
34c00 6d 65 49 6e 74 36 34 20 2a 2f 20 20 20 20 20 20  meInt64 */      
34c10 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a       \.  }..  /*
34c20 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c  .  ** All defaul
34c30 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78  t VFSes for unix
34c40 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
34c50 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
34c60 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  array..  **.  **
34c70 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
34c80 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74  qlite3_vfs.pNext
34c90 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46   field of the VF
34ca0 53 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69  S object is modi
34cb0 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  fied.  ** by the
34cc0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65   SQLite core whe
34cd0 6e 20 74 68 65 20 56 46 53 20 69 73 20 72 65 67  n the VFS is reg
34ce0 69 73 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65  istered.  So the
34cf0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
34d00 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20  array cannot be 
34d10 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74  const..  */.  st
34d20 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
34d30 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20   aVfs[] = {.#if 
34d40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
34d50 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28  CKING_STYLE && (
34d60 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65  OS_VXWORKS || de
34d70 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
34d80 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
34d90 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 61  nix",          a
34da0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  utolockIoFinder 
34db0 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49  ),.#else.    UNI
34dc0 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20  XVFS("unix",    
34dd0 20 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e        posixIoFin
34de0 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20  der ),.#endif.  
34df0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
34e00 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63  none",     noloc
34e10 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20  kIoFinder ),.   
34e20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64   UNIXVFS("unix-d
34e30 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63  otfile",  dotloc
34e40 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  kIoFinder ),.#if
34e50 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
34e60 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61  UNIXVFS("unix-na
34e70 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69  medsem", semIoFi
34e80 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23  nder ),.#endif.#
34e90 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
34ea0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
34eb0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
34ec0 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69  -posix",    posi
34ed0 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66  xIoFinder ),.#if
34ee0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20   !OS_VXWORKS.   
34ef0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66   UNIXVFS("unix-f
34f00 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49  lock",    flockI
34f10 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
34f20 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  f.#endif.#if SQL
34f30 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
34f40 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
34f50 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
34f60 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
34f70 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66 70 49  -afp",      afpI
34f80 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55  oFinder ),.    U
34f90 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 66 73  NIXVFS("unix-nfs
34fa0 22 2c 20 20 20 20 20 20 6e 66 73 49 6f 46 69 6e  ",      nfsIoFin
34fb0 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56  der ),.    UNIXV
34fc0 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c  FS("unix-proxy",
34fd0 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65      proxyIoFinde
34fe0 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b  r ),.#endif.  };
34ff0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
35000 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
35010 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
35020 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
35030 6c 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20  l VFSes defined 
35040 69 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72  in the aVfs[] ar
35050 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ray */.  for(i=0
35060 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73  ; i<(sizeof(aVfs
35070 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  )/sizeof(sqlite3
35080 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  _vfs)); i++){.  
35090 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
350a0 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c  gister(&aVfs[i],
350b0 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65   i==0);.  }.  re
350c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
350d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
350e0 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  wn the operating
350f0 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
35100 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70  e..**.** Some op
35110 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20  erating systems 
35120 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f  might need to do
35130 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e   some cleanup in
35140 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a   this routine,.*
35150 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e  * to release dyn
35160 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
35170 65 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74  ed objects.  But
35180 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a   not on unix..**
35190 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
351a0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69   a no-op for uni
351b0 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
351c0 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
351d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
351e0 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66  _OK; .}. .#endif
351f0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e   /* SQLITE_OS_UN
35200 49 58 20 2a 2f 0a                                IX */.