/ Hex Artifact Content
Login

Artifact af3aa6c091f501a590b45c95aa6af269ce728a94:


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 6e 63 6c 75 64 65 20 3c 75  .h>.# include <u
11b0: 75 69 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 66  uid/uuid.h>.# if
11c0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
11d0: 5f 5f 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f  __) && ((__MAC_O
11e0: 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
11f0: 52 45 51 55 49 52 45 44 20 3e 20 31 30 35 30 29  REQUIRED > 1050)
1200: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 28 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56    (__IPHONE_OS_V
1230: 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
1240: 52 45 44 20 3e 20 32 30 30 30 29 29 0a 23 20 20  RED > 2000)).#  
1250: 64 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48  define HAVE_GETH
1260: 4f 53 54 55 55 49 44 20 31 0a 23 20 65 6e 64 69  OSTUUID 1.# endi
1270: 66 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f.# if OS_VXWORK
1280: 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65  S.#  include <se
1290: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e  maphore.h>.#  in
12a0: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
12b0: 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75  .# else.#  inclu
12c0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
12d0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
12e0: 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66  param.h>.# endif
12f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1300: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1310: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
1320: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1330: 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41  ) || (SQLITE_ENA
1340: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1350: 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
1360: 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  ).# include <sys
1370: 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66  /mount.h>.#endif
1380: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54  ..#ifdef HAVE_UT
1390: 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  IME.# include <u
13a0: 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  time.h>.#endif..
13b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
13c0: 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65  lues of unixFile
13d0: 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  .fsFlags.*/.#def
13e0: 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  ine SQLITE_FSFLA
13f0: 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20  GS_IS_MSDOS     
1400: 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  0x1../*.** If we
1410: 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61   are to be threa
1420: 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20  d-safe, include 
1430: 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61  the pthreads hea
1440: 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a  der and define.*
1450: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49  * the SQLITE_UNI
1460: 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e  X_THREADS macro.
1470: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
1480: 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c  HREADSAFE.# incl
1490: 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a  ude <pthread.h>.
14a0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
14b0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23  UNIX_THREADS 1.#
14c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
14d0: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
14e0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
14f0: 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66   new file.*/.#if
1500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
1510: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
1520: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1530: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
1540: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36  E_PERMISSIONS 06
1550: 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  44.#endif../*. *
1560: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
1570: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
1580: 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64  ing auto proxy d
1590: 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ir. */.#ifndef S
15a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
15b0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
15c0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
15d0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
15e0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  DIR_PERMISSIONS 
15f0: 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0755.#endif../*.
1600: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
1610: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
1620: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
1630: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f  _PATHNAME 512../
1640: 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68  *.** Only set th
1650: 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74  e lastErrno if t
1660: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
1670: 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e   a real error an
1680: 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d  d not .** a norm
1690: 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75  al expected retu
16a0: 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  rn code of SQLIT
16b0: 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45  E_BUSY or SQLITE
16c0: 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  _OK.*/.#define I
16d0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20  S_LOCK_ERROR(x) 
16e0: 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f   ((x != SQLITE_O
16f0: 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49  K) && (x != SQLI
1700: 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f  TE_BUSY))../* Fo
1710: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1720: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1730: 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53  ct unixShm unixS
1740: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1750: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1760: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1770: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1780: 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78  unixShmNode unix
1790: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f  ShmNode;       /
17a0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
17b0: 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65  instance */.type
17c0: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49  def struct unixI
17d0: 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f  nodeInfo unixIno
17e0: 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20  deInfo;   /* An 
17f0: 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65  i-node */.typede
1800: 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  f struct UnixUnu
1810: 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64  sedFd UnixUnused
1820: 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e  Fd;     /* An un
1830: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1840: 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ptor */../*.** S
1850: 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20  ometimes, after 
1860: 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73  a file handle is
1870: 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74   closed by SQLit
1880: 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  e, the file desc
1890: 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74  riptor.** cannot
18a0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
18b0: 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65  iately. In these
18c0: 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65   cases, instance
18d0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
18e0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
18f0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
1900: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
1910: 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74  iptor while wait
1920: 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70  ing for an.** op
1930: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74  portunity to eit
1940: 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75  her close or reu
1950: 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  se it..*/.struct
1960: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a   UnixUnusedFd {.
1970: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
1980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1990: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
19a0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
19b0: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
19c0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
19d0: 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69  this file descri
19e0: 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ptor was opened 
19f0: 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  with */.  UnixUn
1a00: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20  usedFd *pNext;  
1a10: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
1a20: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1a30: 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20  or on same file 
1a40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
1a50: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
1a60: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
1a70: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
1a80: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20  specific to the 
1a90: 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c  unix.** VFS impl
1aa0: 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  ementations..*/.
1ab0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1ac0: 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65  nixFile unixFile
1ad0: 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  ;.struct unixFil
1ae0: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  e {.  sqlite3_io
1af0: 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
1b00: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
1b10: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
1b20: 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  try */.  unixIno
1b30: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1b60: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1b70: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1ba0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1bb0: 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 3b 20 20  /.  int dirfd;  
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1be0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
1bf0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a  he directory */.
1c00: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1c10: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
1c20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70        /* The typ
1c30: 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  e of lock held o
1c40: 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75  n this fd */.  u
1c50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 74 72  nsigned char ctr
1c60: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
1c70: 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c     /* Behavioral
1c80: 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45   bits.  UNIXFILE
1c90: 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  _* flags */.  in
1ca0: 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  t lastErrno;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72    /* The unix er
1cd0: 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f  rno from last I/
1ce0: 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69  O error */.  voi
1cf0: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
1d00: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1d10: 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c   /* Locking styl
1d20: 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  e specific state
1d30: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
1d40: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
1d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1d60: 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55  -allocated UnixU
1d70: 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e  nusedFd */.  con
1d80: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20  st char *zPath; 
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1db0: 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
1dc0: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de0: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   Shared memory s
1df0: 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69  egment informati
1e00: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68  on */.  int szCh
1e10: 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  unk;            
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1e30: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
1e40: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
1e50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1e60: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1e70: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c         /* The fl
1ea0: 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74  ags specified at
1eb0: 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69   open() */.#endi
1ec0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1ed0: 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
1ee0: 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c  ION.  int protFl
1ef0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1f10: 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66 6c 61  a protection fla
1f20: 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70 65 6e  gs from unixOpen
1f30: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1f40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1f50: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1f60: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1f80: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f90: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1fa0: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1fb0: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1fc0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1fd0: 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20    int isDelete; 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
2000: 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65  on close if true
2010: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77   */.  struct vxw
2020: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b  orksFileId *pId;
2030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
2040: 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23  que file ID */.#
2050: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44  endif.#ifndef ND
2060: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65  EBUG.  /* The ne
2070: 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69  xt group of vari
2080: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74  ables are used t
2090: 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72 20  o track whether 
20a0: 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20  or not the.  ** 
20b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
20c0: 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d  ter in bytes 24-
20d0: 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  27 of database f
20e0: 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65 64  iles are updated
20f0: 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61  .  ** whenever a
2100: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
2110: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
2120: 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66    An assertion f
2130: 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f  ault will.  ** o
2140: 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20 69  ccur if a file i
2150: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f 75  s updated withou
2160: 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20  t also updating 
2170: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
2180: 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54    ** counter.  T
2190: 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64 65  his test is made
21a0: 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72   to avoid new pr
21b0: 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74  oblems similar t
21c0: 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64  o the.  ** one d
21d0: 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63 6b  escribed by tick
21e0: 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a  et #3584. .  */.
21f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2200: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20  transCntrChng;  
2210: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2220: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
2230: 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ter changed */. 
2240: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
2250: 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20  bUpdate;        
2260: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
2270: 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20  art of database 
2280: 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  file changed */.
2290: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
22a0: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20  inNormalWrite;  
22b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61   /* True if in a
22c0: 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70   normal write op
22d0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69  eration */.#endi
22e0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
22f0: 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73  TEST.  /* In tes
2300: 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65  t mode, increase
2310: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69   the size of thi
2320: 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69  s structure a bi
2330: 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20  t so that .  ** 
2340: 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  it is larger tha
2350: 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72 61  n the struct Cra
2360: 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69  shFile defined i
2370: 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a  n test6.c..  */.
2380: 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b    char aPadding[
2390: 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  32];.#endif.};..
23a0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
23b0: 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69  lues for the uni
23c0: 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20  xFile.ctrlFlags 
23d0: 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66  bitmask:.*/.#def
23e0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43  ine UNIXFILE_EXC
23f0: 4c 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20  L   0x01     /* 
2400: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2410: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2420: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
2430: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 30 78 30  XFILE_RDONLY 0x0
2440: 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  2     /* Connect
2450: 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79  ion is read only
2460: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
2470: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
2480: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
2490: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
24a0: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
24b0: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  n.h"../*.** Defi
24c0: 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f  ne various macro
24d0: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
24e0: 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73  ng from some sys
24f0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
2500: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2510: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2520: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  E 0.#endif.#ifde
2530: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2540: 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c  _LFS.# undef O_L
2550: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
2560: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
2570: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
2580: 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69  _NOFOLLOW.# defi
2590: 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a  ne O_NOFOLLOW 0.
25a0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
25b0: 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65  _BINARY.# define
25c0: 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64   O_BINARY 0.#end
25d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  if../*.** The th
25e0: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
25f0: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
2600: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
2610: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
2620: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2630: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  ng only..*/.#if 
2640: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2650: 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  E.#define thread
2660: 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  id pthread_self(
2670: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
2680: 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69  threadid 0.#endi
2690: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  f..#ifdef __APPL
26a0: 45 5f 5f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  E__.#define SQLI
26b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c  TE_ENABLE_SUPERL
26c0: 4f 43 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  OCK 1.#endif..#i
26d0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
26e0: 53 55 50 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75  SUPERLOCK.#inclu
26f0: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23  de "sqlite3.h".#
2700: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
2710: 68 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h>              
2720: 20 2f 2a 20 6d 65 6d 73 65 74 28 29 2c 20 73 74   /* memset(), st
2730: 72 6c 65 6e 28 29 20 2a 2f 0a 23 69 6e 63 6c 75  rlen() */.#inclu
2740: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 20 20 20  de <assert.h>   
2750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2760: 73 73 65 72 74 28 29 20 2a 2f 0a 0a 2f 2a 0a 2a  ssert() */../*.*
2770: 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 74 6f  * A structure to
2780: 20 63 6f 6c 6c 65 63 74 20 61 20 62 75 73 79 2d   collect a busy-
2790: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
27a0: 20 61 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e   and argument an
27b0: 64 20 61 20 63 6f 75 6e 74 0a 2a 2a 20 6f 66 20  d a count.** of 
27c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
27d0: 6d 65 73 20 69 74 20 68 61 73 20 62 65 65 6e 20  mes it has been 
27e0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 72 75  invoked..*/.stru
27f0: 63 74 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79  ct SuperlockBusy
2800: 20 7b 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79   {.  int (*xBusy
2810: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20  )(void*,int);   
2820: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2830: 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
2840: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
2850: 69 64 20 2a 70 42 75 73 79 41 72 67 3b 20 20 20  id *pBusyArg;   
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2870: 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 70 61   First arg to pa
2880: 73 73 20 74 6f 20 78 42 75 73 79 20 2a 2f 0a 20  ss to xBusy */. 
2890: 20 69 6e 74 20 6e 42 75 73 79 3b 20 20 20 20 20   int nBusy;     
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
28c0: 6d 65 73 20 78 42 75 73 79 20 68 61 73 20 62 65  mes xBusy has be
28d0: 65 6e 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 7d 3b  en invoked */.};
28e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
28f0: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 53 75  SuperlockBusy Su
2900: 70 65 72 6c 6f 63 6b 42 75 73 79 3b 0a 0a 2f 2a  perlockBusy;../*
2910: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2920: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2930: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2940: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2950: 20 61 63 74 69 76 65 0a 2a 2a 20 73 75 70 65 72   active.** super
2960: 6c 6f 63 6b 2e 20 54 68 65 20 6f 70 61 71 75 65  lock. The opaque
2970: 20 68 61 6e 64 6c 65 20 72 65 74 75 72 6e 65 64   handle returned
2980: 20 62 79 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f   by sqlite3demo_
2990: 73 75 70 65 72 6c 6f 63 6b 28 29 20 69 73 0a 2a  superlock() is.*
29a0: 2a 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  * actually a poi
29b0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
29c0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
29d0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
29e0: 20 53 75 70 65 72 6c 6f 63 6b 20 7b 0a 20 20 73   Superlock {.  s
29f0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a10: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
2a20: 65 20 75 73 65 64 20 74 6f 20 6c 6f 63 6b 20 64  e used to lock d
2a30: 62 20 2a 2f 0a 20 20 69 6e 74 20 62 57 61 6c 3b  b */.  int bWal;
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2a60: 66 20 64 62 20 69 73 20 61 20 57 41 4c 20 64 61  f db is a WAL da
2a70: 74 61 62 61 73 65 20 2a 2f 0a 7d 3b 0a 74 79 70  tabase */.};.typ
2a80: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 70 65  edef struct Supe
2a90: 72 6c 6f 63 6b 20 53 75 70 65 72 6c 6f 63 6b 3b  rlock Superlock;
2aa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 43 74 78  ../*.** The pCtx
2ab0: 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20   pointer passed 
2ac0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2ad0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
2ae0: 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 53  ointer to a.** S
2af0: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 73 74 72  uperlockBusy str
2b00: 75 63 74 75 72 65 2e 20 49 6e 76 6f 6b 65 20 74  ucture. Invoke t
2b10: 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
2b20: 66 75 6e 63 74 69 6f 6e 20 65 6e 63 61 70 73 75  function encapsu
2b30: 6c 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  lated.** by the 
2b40: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
2b50: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
2b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2b70: 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64  uperlockBusyHand
2b80: 6c 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ler(void *pCtx, 
2b90: 69 6e 74 20 55 4e 55 53 45 44 29 7b 0a 20 20 53  int UNUSED){.  S
2ba0: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42  uperlockBusy *pB
2bb0: 75 73 79 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b  usy = (Superlock
2bc0: 42 75 73 79 20 2a 29 70 43 74 78 3b 0a 20 20 69  Busy *)pCtx;.  i
2bd0: 66 28 20 70 42 75 73 79 2d 3e 78 42 75 73 79 3d  f( pBusy->xBusy=
2be0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2bf0: 20 72 65 74 75 72 6e 20 70 42 75 73 79 2d 3e 78   return pBusy->x
2c00: 42 75 73 79 28 70 42 75 73 79 2d 3e 70 42 75 73  Busy(pBusy->pBus
2c10: 79 41 72 67 2c 20 70 42 75 73 79 2d 3e 6e 42 75  yArg, pBusy->nBu
2c20: 73 79 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sy++);.}../*.** 
2c30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2c40: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
2c50: 6e 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64  ne if the main d
2c60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
2c70: 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
2c80: 64 62 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41  db is open in WA
2c90: 4c 20 6d 6f 64 65 20 6f 72 20 6e 6f 74 2e 20 49  L mode or not. I
2ca0: 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2cb0: 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  s and the.** dat
2cc0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 69 6e  abase file is in
2cd0: 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a   WAL mode, set *
2ce0: 70 62 57 61 6c 20 74 6f 20 74 72 75 65 20 61 6e  pbWal to true an
2cf0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
2d00: 4f 4b 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  OK..** If it is 
2d10: 6e 6f 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c  not in WAL mode,
2d20: 20 73 65 74 20 2a 70 62 57 61 6c 20 74 6f 20 66   set *pbWal to f
2d30: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  alse..**.** If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
2d60: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
2d70: 20 76 61 6c 75 65 20 6f 66 20 2a 70 62 57 61 6c   value of *pbWal
2d80: 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64  .** is undefined
2d90: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
2da0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 70  /.static int sup
2db0: 65 72 6c 6f 63 6b 49 73 57 61 6c 28 53 75 70 65  erlockIsWal(Supe
2dc0: 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20  rlock *pLock){. 
2dd0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2e00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2e10: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
2e20: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64       /* Compiled
2e30: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
2e40: 6d 6f 64 65 20 73 74 61 74 65 6d 65 6e 74 20 2a  mode statement *
2e50: 2f 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  /..  rc = sqlite
2e60: 33 5f 70 72 65 70 61 72 65 28 70 4c 6f 63 6b 2d  3_prepare(pLock-
2e70: 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 6d 61 69  >db, "PRAGMA mai
2e80: 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c  n.journal_mode",
2e90: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2ea0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2eb0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2ec0: 3b 0a 0a 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c  ;..  pLock->bWal
2ed0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 53 51 4c 49   = 0;.  if( SQLI
2ee0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2ef0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
2f00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2f10: 4d 6f 64 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Mode = (const ch
2f20: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
2f30: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
2f40: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 6f 64  0);.    if( zMod
2f50: 65 20 26 26 20 73 74 72 6c 65 6e 28 7a 4d 6f 64  e && strlen(zMod
2f60: 65 29 3d 3d 33 20 26 26 20 73 71 6c 69 74 65 33  e)==3 && sqlite3
2f70: 5f 73 74 72 6e 69 63 6d 70 28 22 77 61 6c 22 2c  _strnicmp("wal",
2f80: 20 7a 4d 6f 64 65 2c 20 33 29 3d 3d 30 20 29 7b   zMode, 3)==0 ){
2f90: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 62 57  .      pLock->bW
2fa0: 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
2fb0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
2fc0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2fd0: 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62  mt);.}../*.** Ob
2fe0: 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
2ff0: 65 20 73 68 6d 2d 6c 6f 63 6b 20 6f 6e 20 6e 42  e shm-lock on nB
3000: 79 74 65 20 62 79 74 65 73 20 73 74 61 72 74 69  yte bytes starti
3010: 6e 67 20 61 74 20 6f 66 66 73 65 74 20 69 64 78  ng at offset idx
3020: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20  .** of the file 
3030: 66 64 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  fd. If the lock 
3040: 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
3050: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ed immediately, 
3060: 69 6e 76 6f 6b 65 0a 2a 2a 20 74 68 65 20 62 75  invoke.** the bu
3070: 73 79 2d 68 61 6e 64 6c 65 72 20 75 6e 74 69 6c  sy-handler until
3080: 20 65 69 74 68 65 72 20 69 74 20 69 73 20 6f 62   either it is ob
3090: 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75  tained or the bu
30a0: 73 79 2d 68 61 6e 64 6c 65 72 0a 2a 2a 20 63 61  sy-handler.** ca
30b0: 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 30  llback returns 0
30c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30d0: 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b  superlockShmLock
30e0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
30f0: 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
3100: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
3110: 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  file handle */. 
3120: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 73 68   /* Offset of sh
3150: 6d 2d 6c 6f 63 6b 20 74 6f 20 6f 62 74 61 69 6e  m-lock to obtain
3160: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3190: 6f 66 20 63 6f 6e 73 65 63 74 69 76 65 20 62 79  of consective by
31a0: 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
31b0: 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a   SuperlockBusy *
31c0: 70 42 75 73 79 20 20 20 20 20 20 20 20 20 20 20  pBusy           
31d0: 20 2f 2a 20 42 75 73 79 2d 68 61 6e 64 6c 65 72   /* Busy-handler
31e0: 20 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20   wrapper object 
31f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
3200: 20 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b    int (*xShmLock
3210: 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  )(sqlite3_file*,
3220: 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 20   int, int, int) 
3230: 3d 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  = fd->pMethods->
3240: 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 64 6f 20 7b  xShmLock;.  do {
3250: 0a 20 20 20 20 72 63 20 3d 20 78 53 68 6d 4c 6f  .    rc = xShmLo
3260: 63 6b 28 66 64 2c 20 69 64 78 2c 20 6e 42 79 74  ck(fd, idx, nByt
3270: 65 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  e, SQLITE_SHM_LO
3280: 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58  CK|SQLITE_SHM_EX
3290: 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 77 68 69  CLUSIVE);.  }whi
32a0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
32b0: 55 53 59 20 26 26 20 73 75 70 65 72 6c 6f 63 6b  USY && superlock
32c0: 42 75 73 79 48 61 6e 64 6c 65 72 28 28 76 6f 69  BusyHandler((voi
32d0: 64 20 2a 29 70 42 75 73 79 2c 20 30 29 20 29 3b  d *)pBusy, 0) );
32e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32f0: 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 74 68  ./*.** Obtain th
3300: 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 20 6f 6e  e extra locks on
3310: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3320: 6c 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  le required for 
3330: 57 41 4c 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  WAL databases..*
3340: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 70  * Invoke the sup
3350: 70 6c 69 65 64 20 62 75 73 79 2d 68 61 6e 64 6c  plied busy-handl
3360: 65 72 20 61 73 20 72 65 71 75 69 72 65 64 2e 0a  er as required..
3370: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
3380: 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 0a  perlockWalLock(.
3390: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
33c0: 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 57 41 4c  ndle open on WAL
33d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 53   database */.  S
33e0: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42  uperlockBusy *pB
33f0: 75 73 79 20 20 20 20 20 20 20 20 20 20 20 20 2f  usy            /
3400: 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20 77  * Busy handler w
3410: 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f  rapper object */
3420: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
3450: 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
3460: 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 30 3b 20  3_file *fd = 0; 
3470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
3480: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
3490: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64  handle */.  void
34a0: 20 76 6f 6c 61 74 69 6c 65 20 2a 70 20 3d 20 30   volatile *p = 0
34b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
34c0: 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
34d0: 70 61 67 65 20 6f 66 20 73 68 61 72 65 64 20 6d  page of shared m
34e0: 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  emory */..  /* O
34f0: 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
3500: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  to the sqlite3_f
3510: 69 6c 65 20 6f 62 6a 65 63 74 20 6f 70 65 6e 20  ile object open 
3520: 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 62 20 66  on the main db f
3530: 69 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ile. */.  rc = s
3540: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
3550: 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20  rol(db, "main", 
3560: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
3570: 45 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69 64  E_POINTER, (void
3580: 20 2a 29 26 66 64 29 3b 0a 20 20 69 66 28 20 72   *)&fd);.  if( r
3590: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
35a0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
35b0: 4f 62 74 61 69 6e 20 74 68 65 20 22 72 65 63 6f  Obtain the "reco
35c0: 76 65 72 79 22 20 6c 6f 63 6b 2e 20 4e 6f 72 6d  very" lock. Norm
35d0: 61 6c 6c 79 2c 20 74 68 69 73 20 6c 6f 63 6b 20  ally, this lock 
35e0: 69 73 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 65 64  is only obtained
35f0: 20 62 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73   by.  ** clients
3600: 20 72 75 6e 6e 69 6e 67 20 64 61 74 61 62 61 73   running databas
3610: 65 20 72 65 63 6f 76 65 72 79 2e 20 20 0a 20 20  e recovery.  .  
3620: 2a 2f 0a 20 20 72 63 20 3d 20 73 75 70 65 72 6c  */.  rc = superl
3630: 6f 63 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 32  ockShmLock(fd, 2
3640: 2c 20 31 2c 20 70 42 75 73 79 29 3b 0a 20 20 69  , 1, pBusy);.  i
3650: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3660: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
3670: 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 73 74 61   /* Zero the sta
3680: 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  rt of the first 
3690: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 70 61  shared-memory pa
36a0: 67 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  ge. This means t
36b0: 68 61 74 20 61 6e 79 0a 20 20 2a 2a 20 63 6c 69  hat any.  ** cli
36c0: 65 6e 74 73 20 74 68 61 74 20 6f 70 65 6e 20 72  ents that open r
36d0: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
36e0: 6e 73 61 63 74 69 6f 6e 73 20 66 72 6f 6d 20 74  nsactions from t
36f0: 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20 77 69 6c  his point on wil
3700: 6c 0a 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72  l.  ** have to r
3710: 75 6e 20 72 65 63 6f 76 65 72 79 20 62 65 66 6f  un recovery befo
3720: 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 53  re proceeding. S
3730: 69 6e 63 65 20 74 68 65 79 20 6e 65 65 64 20 74  ince they need t
3740: 68 65 20 22 72 65 63 6f 76 65 72 79 22 0a 20 20  he "recovery".  
3750: 2a 2a 20 6c 6f 63 6b 20 74 68 61 74 20 74 68 69  ** lock that thi
3760: 73 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  s process is hol
3770: 64 69 6e 67 20 74 6f 20 64 6f 20 74 68 61 74 2c  ding to do that,
3780: 20 6e 6f 20 6e 65 77 20 72 65 61 64 20 6f 72 20   no new read or 
3790: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
37a0: 61 63 74 69 6f 6e 73 20 6d 61 79 20 6e 6f 77 20  actions may now 
37b0: 62 65 20 6f 70 65 6e 65 64 2e 20 4e 6f 72 20 63  be opened. Nor c
37c0: 61 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  an a checkpoint 
37d0: 62 65 20 72 75 6e 2c 20 66 6f 72 20 74 68 65 0a  be run, for the.
37e0: 20 20 2a 2a 20 73 61 6d 65 20 72 65 61 73 6f 6e    ** same reason
37f0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 64  ..  */.  rc = fd
3800: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
3810: 4d 61 70 28 66 64 2c 20 30 2c 20 33 32 2a 31 30  Map(fd, 0, 32*10
3820: 32 34 2c 20 31 2c 20 26 70 29 3b 0a 20 20 69 66  24, 1, &p);.  if
3830: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3840: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
3850: 65 6d 73 65 74 28 28 76 6f 69 64 20 2a 29 70 2c  emset((void *)p,
3860: 20 30 2c 20 33 32 29 3b 0a 0a 20 20 2f 2a 20 4f   0, 32);..  /* O
3870: 62 74 61 69 6e 20 65 78 63 6c 75 73 69 76 65 20  btain exclusive 
3880: 6c 6f 63 6b 73 20 6f 6e 20 61 6c 6c 20 74 68 65  locks on all the
3890: 20 22 72 65 61 64 2d 6c 6f 63 6b 22 20 73 6c 6f   "read-lock" slo
38a0: 74 73 2e 20 4f 6e 63 65 20 74 68 65 73 65 20 6c  ts. Once these l
38b0: 6f 63 6b 73 0a 20 20 2a 2a 20 61 72 65 20 68 65  ocks.  ** are he
38c0: 6c 64 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  ld, it is guaran
38d0: 74 65 65 64 20 74 68 61 74 20 74 68 65 72 65 20  teed that there 
38e0: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 72 65  are no active re
38f0: 61 64 65 72 2c 20 77 72 69 74 65 72 20 6f 72 20  ader, writer or 
3900: 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  .  ** checkpoint
3910: 65 72 20 63 6c 69 65 6e 74 73 2e 0a 20 20 2a 2f  er clients..  */
3920: 0a 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63  .  rc = superloc
3930: 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 33 2c 20  kShmLock(fd, 3, 
3940: 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
3950: 2d 33 2c 20 70 42 75 73 79 29 3b 0a 20 20 72 65  -3, pBusy);.  re
3960: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3970: 2a 20 52 65 6c 65 61 73 65 20 61 20 73 75 70 65  * Release a supe
3980: 72 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 61 20  rlock held on a 
3990: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
39a0: 68 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  he argument pass
39b0: 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20 66  ed to .** this f
39c0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
39d0: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
39e0: 66 72 6f 6d 20 61 20 73 75 63 63 65 73 73 66 75  from a successfu
39f0: 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  l call to.** sql
3a00: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
3a10: 63 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ck()..*/.static 
3a20: 76 6f 69 64 20 73 71 6c 69 74 65 33 64 65 6d 6f  void sqlite3demo
3a30: 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 76 6f 69  _superunlock(voi
3a40: 64 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 53 75 70  d *pLock){.  Sup
3a50: 65 72 6c 6f 63 6b 20 2a 70 20 3d 20 28 53 75 70  erlock *p = (Sup
3a60: 65 72 6c 6f 63 6b 20 2a 29 70 4c 6f 63 6b 3b 0a  erlock *)pLock;.
3a70: 20 20 69 66 28 20 70 2d 3e 62 57 61 6c 20 29 7b    if( p->bWal ){
3a80: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
3ab0: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66  ode */.    int f
3ac0: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 48  lags = SQLITE_SH
3ad0: 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
3ae0: 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 3b  E_SHM_EXCLUSIVE;
3af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
3b00: 65 20 2a 66 64 20 3d 20 30 3b 0a 20 20 20 20 72  e *fd = 0;.    r
3b10: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
3b20: 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20  _control(p->db, 
3b30: 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
3b40: 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
3b50: 52 2c 20 28 76 6f 69 64 20 2a 29 26 66 64 29 3b  R, (void *)&fd);
3b60: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
3b70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
3b80: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  fd->pMethods->xS
3b90: 68 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c  hmLock(fd, 2, 1,
3ba0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 66   flags);.      f
3bb0: 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  d->pMethods->xSh
3bc0: 6d 4c 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c  mLock(fd, 3, SQL
3bd0: 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c  ITE_SHM_NLOCK-3,
3be0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
3bf0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f   }.  sqlite3_clo
3c00: 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 73 71 6c  se(p->db);.  sql
3c10: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
3c20: 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
3c30: 73 75 70 65 72 6c 6f 63 6b 20 6f 6e 20 74 68 65  superlock on the
3c40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
3c50: 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 50 61  dentified by zPa
3c60: 74 68 2c 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  th, using the.**
3c70: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
3c80: 76 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  ves provided by 
3c90: 56 46 53 20 7a 56 66 73 2e 20 49 66 20 73 75 63  VFS zVfs. If suc
3ca0: 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
3cb0: 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  OK is.** returne
3cc0: 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76 61 72  d and output var
3cd0: 69 61 62 6c 65 20 2a 70 70 4c 6f 63 6b 20 69 73  iable *ppLock is
3ce0: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
3cf0: 61 6e 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65  an opaque handle
3d00: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
3d10: 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
3d20: 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63  3demo_superunloc
3d30: 6b 28 29 20 74 6f 20 72 65 6c 65 61 73 65 20 74  k() to release t
3d40: 68 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  he lock..**.** I
3d50: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
3d60: 73 2c 20 2a 70 70 4c 6f 63 6b 20 69 73 20 73 65  s, *ppLock is se
3d70: 74 20 74 6f 20 30 20 61 6e 64 20 61 6e 20 53 51  t to 0 and an SQ
3d80: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
3d90: 0a 2a 2a 20 28 65 2e 67 2e 20 53 51 4c 49 54 45  .** (e.g. SQLITE
3da0: 5f 42 55 53 59 29 20 69 73 20 72 65 74 75 72 6e  _BUSY) is return
3db0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
3dc0: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 63 61 6e  equired lock can
3dd0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20  not be obtained 
3de0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20  immediately and 
3df0: 74 68 65 20 78 42 75 73 79 20 70 61 72 61 6d 65  the xBusy parame
3e00: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66  ter.** to this f
3e10: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 4e  unction is not N
3e20: 55 4c 4c 2c 20 74 68 65 6e 20 78 42 75 73 79 20  ULL, then xBusy 
3e30: 69 73 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68  is invoked in th
3e40: 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73  e same way.** as
3e50: 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20   a busy-handler 
3e60: 72 65 67 69 73 74 65 72 65 64 20 77 69 74 68 20  registered with 
3e70: 53 51 4c 69 74 65 20 28 75 73 69 6e 67 20 73 71  SQLite (using sq
3e80: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
3e90: 65 72 28 29 29 0a 2a 2a 20 75 6e 74 69 6c 20 65  er()).** until e
3ea0: 69 74 68 65 72 20 74 68 65 20 6c 6f 63 6b 20 63  ither the lock c
3eb0: 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 20 6f  an be obtained o
3ec0: 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  r the busy-handl
3ed0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er function retu
3ee0: 72 6e 73 0a 2a 2a 20 30 20 28 69 6e 64 69 63 61  rns.** 0 (indica
3ef0: 74 69 6e 67 20 22 67 69 76 65 20 75 70 22 29 2e  ting "give up").
3f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3f10: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
3f20: 6c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  lock(.  const ch
3f30: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
3f50: 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
3f60: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f   to lock */.  co
3f70: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 2c 20  nst char *zVfs, 
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f90: 20 56 46 53 20 74 6f 20 75 73 65 20 74 6f 20 61   VFS to use to a
3fa0: 63 63 65 73 73 20 64 61 74 61 62 61 73 65 20 66  ccess database f
3fb0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ile */.  int fla
3fc0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
3fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 69           /* Addi
3fe0: 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 74 6f 20  tional flags to 
3ff0: 70 61 73 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  pass to sqlite3_
4000: 6f 70 65 6e 5f 76 32 20 2a 2f 0a 20 20 69 6e 74  open_v2 */.  int
4010: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
4020: 69 6e 74 29 2c 20 20 20 20 20 20 20 20 2f 2a 20  int),        /* 
4030: 42 75 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c  Busy handler cal
4040: 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20  lback */.  void 
4050: 2a 70 42 75 73 79 41 72 67 2c 20 20 20 20 20 20  *pBusyArg,      
4060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4070: 6e 74 65 78 74 20 61 72 67 20 66 6f 72 20 62 75  ntext arg for bu
4080: 73 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  sy handler */.  
4090: 76 6f 69 64 20 2a 2a 70 70 4c 6f 63 6b 20 20 20  void **ppLock   
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 2f 2a 20 4f 55 54 3a 20 43 6f 6e 74 65 78 74 20  /* OUT: Context 
40c0: 74 6f 20 70 61 73 73 20 74 6f 20 73 75 70 65 72  to pass to super
40d0: 75 6e 6c 6f 63 6b 28 29 20 2a 2f 0a 29 7b 0a 20  unlock() */.){. 
40e0: 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 62   SuperlockBusy b
40f0: 75 73 79 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  usy = {0, 0, 0};
4100: 20 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72   /* Busy handler
4110: 20 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20   wrapper object 
4120: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
4150: 6f 64 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f  ode */.  Superlo
4160: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 70 4c  ck *pLock;..  pL
4170: 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ock = sqlite3_ma
4180: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 75 70 65  lloc(sizeof(Supe
4190: 72 6c 6f 63 6b 29 29 3b 0a 20 20 69 66 28 20 21  rlock));.  if( !
41a0: 70 4c 6f 63 6b 20 29 20 72 65 74 75 72 6e 20 53  pLock ) return S
41b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
41c0: 65 6d 73 65 74 28 70 4c 6f 63 6b 2c 20 30 2c 20  emset(pLock, 0, 
41d0: 73 69 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b  sizeof(Superlock
41e0: 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  ));..  /* Open a
41f0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
4200: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 74 6f 20   on the file to 
4210: 73 75 70 65 72 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  superlock. */.  
4220: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
4230: 6e 5f 76 32 28 0a 20 20 20 20 20 20 7a 50 61 74  n_v2(.      zPat
4240: 68 2c 20 26 70 4c 6f 63 6b 2d 3e 64 62 2c 20 53  h, &pLock->db, S
4250: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
4260: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
4270: 5f 43 52 45 41 54 45 7c 66 6c 61 67 73 2c 20 7a  _CREATE|flags, z
4280: 56 66 73 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  Vfs.  );..  /* I
4290: 6e 73 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61  nstall a busy-ha
42a0: 6e 64 6c 65 72 20 61 6e 64 20 65 78 65 63 75 74  ndler and execut
42b0: 65 20 61 20 42 45 47 49 4e 20 45 58 43 4c 55 53  e a BEGIN EXCLUS
42c0: 49 56 45 2e 20 49 66 20 74 68 69 73 20 69 73 20  IVE. If this is 
42d0: 6e 6f 74 0a 20 20 2a 2a 20 61 20 57 41 4c 20 64  not.  ** a WAL d
42e0: 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 69 73  atabase, this is
42f0: 20 61 6c 6c 20 77 65 20 6e 65 65 64 20 74 6f 20   all we need to 
4300: 64 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  do.  .  **.  ** 
4310: 41 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69  A wrapper functi
4320: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 69 6e  on is used to in
4330: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 2d 68 61  voke the busy-ha
4340: 6e 64 6c 65 72 20 69 6e 73 74 65 61 64 20 6f 66  ndler instead of
4350: 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 69 6e  .  ** registerin
4360: 67 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  g the busy-handl
4370: 65 72 20 66 75 6e 63 74 69 6f 6e 20 73 75 70 70  er function supp
4380: 6c 69 65 64 20 62 79 20 74 68 65 20 75 73 65 72  lied by the user
4390: 20 64 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 77   directly.  ** w
43a0: 69 74 68 20 53 51 4c 69 74 65 2e 20 54 68 69 73  ith SQLite. This
43b0: 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
43c0: 73 61 6d 65 20 62 75 73 79 2d 68 61 6e 64 6c 65  same busy-handle
43d0: 72 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  r function may b
43e0: 65 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 20 64  e.  ** invoked d
43f0: 69 72 65 63 74 6c 79 20 6c 61 74 65 72 20 6f 6e  irectly later on
4400: 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   when attempting
4410: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65   to obtain the e
4420: 78 74 72 61 20 6c 6f 63 6b 73 0a 20 20 2a 2a 20  xtra locks.  ** 
4430: 72 65 71 75 69 72 65 64 20 69 6e 20 57 41 4c 20  required in WAL 
4440: 6d 6f 64 65 2e 20 42 79 20 75 73 69 6e 67 20 74  mode. By using t
4450: 68 65 20 77 72 61 70 70 65 72 2c 20 77 65 20 61  he wrapper, we a
4460: 72 65 20 61 62 6c 65 20 74 6f 20 67 75 61 72 61  re able to guara
4470: 6e 74 65 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  ntee.  ** that t
4480: 68 65 20 22 6e 42 75 73 79 22 20 69 6e 74 65 67  he "nBusy" integ
4490: 65 72 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  er parameter pas
44a0: 73 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 73  sed to the users
44b0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20   busy-handler.  
44c0: 2a 2a 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  ** represents th
44d0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
44e0: 66 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  f busy-handler i
44f0: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  nvocations made 
4500: 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 69 73  within.  ** this
4510: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
4520: 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29  demo_superlock()
4530: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 6e 79 20  , including any 
4540: 6d 61 64 65 20 64 75 72 69 6e 67 20 74 68 65 0a  made during the.
4550: 20 20 2a 2a 20 22 42 45 47 49 4e 20 45 58 43 4c    ** "BEGIN EXCL
4560: 55 53 49 56 45 22 2e 0a 20 20 2a 2f 0a 20 20 69  USIVE"..  */.  i
4570: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4580: 20 29 7b 0a 20 20 20 20 62 75 73 79 2e 78 42 75   ){.    busy.xBu
4590: 73 79 20 3d 20 78 42 75 73 79 3b 0a 20 20 20 20  sy = xBusy;.    
45a0: 62 75 73 79 2e 70 42 75 73 79 41 72 67 20 3d 20  busy.pBusyArg = 
45b0: 70 42 75 73 79 41 72 67 3b 0a 20 20 20 20 73 71  pBusyArg;.    sq
45c0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
45d0: 65 72 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 73 75  er(pLock->db, su
45e0: 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64 6c  perlockBusyHandl
45f0: 65 72 2c 20 28 76 6f 69 64 20 2a 29 26 62 75 73  er, (void *)&bus
4600: 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  y);.    rc = sql
4610: 69 74 65 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d  ite3_exec(pLock-
4620: 3e 64 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c  >db, "BEGIN EXCL
4630: 55 53 49 56 45 22 2c 20 30 2c 20 30 2c 20 30 29  USIVE", 0, 0, 0)
4640: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
4650: 68 65 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49  he BEGIN EXCLUSI
4660: 56 45 20 77 61 73 20 65 78 65 63 75 74 65 64 20  VE was executed 
4670: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
4680: 20 74 68 69 73 20 69 73 20 61 20 57 41 4c 0a 20   this is a WAL. 
4690: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 63 61   ** database, ca
46a0: 6c 6c 20 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c  ll superlockWalL
46b0: 6f 63 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e 20  ock() to obtain 
46c0: 74 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 20  the extra locks 
46d0: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
46e0: 20 70 72 65 76 65 6e 74 20 72 65 61 64 65 72 73   prevent readers
46f0: 2c 20 77 72 69 74 65 72 73 20 61 6e 64 2f 6f 72  , writers and/or
4700: 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 20 66   checkpointers f
4710: 72 6f 6d 20 61 63 63 65 73 73 69 6e 67 20 74 68  rom accessing th
4720: 65 0a 20 20 2a 2a 20 64 62 20 77 68 69 6c 65 20  e.  ** db while 
4730: 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
4740: 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 70 65  holding the supe
4750: 72 6c 6f 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rlock..  **.  **
4760: 20 42 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   Before attempti
4770: 6e 67 20 61 6e 79 20 57 41 4c 20 6c 6f 63 6b 73  ng any WAL locks
4780: 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  , commit the tra
4790: 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
47a0: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 74 6f 20 64   above.  ** to d
47b0: 72 6f 70 20 74 68 65 20 57 41 4c 20 72 65 61 64  rop the WAL read
47c0: 20 61 6e 64 20 77 72 69 74 65 20 6c 6f 63 6b 73   and write locks
47d0: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e   currently held.
47e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
47f0: 20 20 2a 2a 20 6e 65 77 20 57 41 4c 20 6c 6f 63    ** new WAL loc
4800: 6b 73 20 6d 61 79 20 63 6f 6e 66 6c 69 63 74 20  ks may conflict 
4810: 77 69 74 68 20 74 68 65 20 6f 6c 64 2e 0a 20 20  with the old..  
4820: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
4830: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
4840: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
4850: 20 3d 20 73 75 70 65 72 6c 6f 63 6b 49 73 57 61   = superlockIsWa
4860: 6c 28 70 4c 6f 63 6b 29 29 20 26 26 20 70 4c 6f  l(pLock)) && pLo
4870: 63 6b 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20  ck->bWal ){.    
4880: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
4890: 78 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22  xec(pLock->db, "
48a0: 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30  COMMIT", 0, 0, 0
48b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
48c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
48d0: 20 20 20 20 20 20 72 63 20 3d 20 73 75 70 65 72        rc = super
48e0: 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 70 4c 6f 63  lockWalLock(pLoc
48f0: 6b 2d 3e 64 62 2c 20 26 62 75 73 79 29 3b 0a 20  k->db, &busy);. 
4900: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4910: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
4920: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
4930: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e  ite3demo_superun
4940: 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  lock(pLock);.   
4950: 20 2a 70 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *ppLock = 0;.  
4960: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 4c 6f  }else{.    *ppLo
4970: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
4980: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4990: 0a 2f 2a 20 41 20 63 6f 72 72 75 70 74 20 44 42  ./* A corrupt DB
49a0: 20 77 6f 6e 27 74 20 77 6f 72 6b 20 77 69 74 68   won't work with
49b0: 20 74 68 65 20 73 71 6c 2d 62 61 73 65 64 20 6c   the sql-based l
49c0: 6f 63 6b 69 6e 67 20 61 74 74 65 6d 70 74 2c 20  ocking attempt, 
49d0: 67 72 61 62 20 61 6e 20 0a 2a 2a 20 65 78 63 6c  grab an .** excl
49e0: 75 73 69 76 65 20 6c 6f 63 6b 20 61 6e 64 20 72  usive lock and r
49f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4a00: 6f 72 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  or SQLITE_BUSY i
4a10: 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  f the lock fails
4a20: 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65   .** returns the
4a30: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 6c 65   current lock le
4a40: 76 65 6c 20 68 65 6c 64 20 6f 6e 20 73 71 6c 69  vel held on sqli
4a50: 74 65 33 5f 66 69 6c 65 0a 2a 2f 0a 73 74 61 74  te3_file.*/.stat
4a60: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65  ic int sqlite3de
4a70: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72  mo_superlock_cor
4a80: 72 75 70 74 28 73 71 6c 69 74 65 33 5f 66 69 6c  rupt(sqlite3_fil
4a90: 65 20 2a 69 64 2c 20 69 6e 74 20 65 54 61 72 67  e *id, int eTarg
4aa0: 65 74 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20  etFileLock, int 
4ab0: 2a 70 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20  *pFileLock) {.  
4ac0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
4ad0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
4ae0: 0a 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  .  int eFileLock
4af0: 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
4b00: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
4b10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
4b20: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 65 54  if( eFileLock<eT
4b30: 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b  argetFileLock ){
4b40: 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
4b50: 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
4b60: 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  id, SQLITE_LOCK_
4b70: 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20 69  SHARED);.  }.  i
4b80: 66 28 20 21 72 63 20 26 26 20 65 46 69 6c 65 4c  f( !rc && eFileL
4b90: 6f 63 6b 3c 65 54 61 72 67 65 74 46 69 6c 65 4c  ock<eTargetFileL
4ba0: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ock ){.    rc = 
4bb0: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
4bc0: 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45  xLock(id, SQLITE
4bd0: 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29  _LOCK_EXCLUSIVE)
4be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
4bf0: 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  {.    if( pFile-
4c00: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69  >eFileLock > eFi
4c10: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  leLock ){.      
4c20: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
4c30: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
4c40: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  eLock);.    }.  
4c50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
4c60: 0a 20 20 69 66 20 28 70 46 69 6c 65 4c 6f 63 6b  .  if (pFileLock
4c70: 29 20 7b 0a 20 20 20 20 2a 70 46 69 6c 65 4c 6f  ) {.    *pFileLo
4c80: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
4c90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
4ca0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
4cb0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65 6d  c int sqlite3dem
4cc0: 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f  o_superunlock_co
4cd0: 72 72 75 70 74 28 73 71 6c 69 74 65 33 5f 66 69  rrupt(sqlite3_fi
4ce0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
4cf0: 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
4d00: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
4d10: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
4d20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4d30: 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65  ;.  .  if( pFile
4d40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46  ->eFileLock > eF
4d50: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
4d60: 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
4d70: 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  od->xUnlock(id, 
4d80: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
4d90: 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ED);.  }.  if( p
4da0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
4db0: 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  > eFileLock ){. 
4dc0: 20 20 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 43 20     int unlockRC 
4dd0: 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
4de0: 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51  ->xUnlock(id, SQ
4df0: 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45 29 3b  LITE_LOCK_NONE);
4e00: 0a 20 20 20 20 69 66 20 28 21 72 63 29 20 72 63  .    if (!rc) rc
4e10: 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20 7d   = unlockRC;.  }
4e20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4e30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4e40: 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f  E_ENABLE_SUPERLO
4e50: 43 4b 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69  CK */.../*.** Di
4e60: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
4e70: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
4e80: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
4e90: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
4ea0: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
4eb0: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
4ec0: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
4ed0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
4ee0: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
4ef0: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
4f00: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
4f10: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
4f20: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
4f30: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
4f40: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
4f50: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
4f60: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
4f70: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
4f80: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
4f90: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
4fa0: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
4fb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
4fc0: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
4fd0: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
4fe0: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
4ff0: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
5000: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
5010: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  );.}../*.** Many
5020: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
5030: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
5040: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
5050: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
5060: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
5070: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
5080: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
5090: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
50a0: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
50b0: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
50c0: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
50d0: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
50e0: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
50f0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
5100: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
5110: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
5120: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
5130: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
5140: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
5150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5160: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74 65 6d  ame of the sytem
5170: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
5180: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
5190: 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72  Current; /* Curr
51a0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
51b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
51c0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
51d0: 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20  l_ptr pDefault; 
51e0: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
51f0: 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d   */.} aSyscall[]
5200: 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c   = {.  { "open",
5210: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
5220: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
5230: 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a  sixOpen,  0  },.
5240: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20  #define osOpen  
5250: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
5260: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74  st char*,int,int
5270: 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43  ))aSyscall[0].pC
5280: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c  urrent)..  { "cl
5290: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ose",        (sq
52a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
52b0: 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20  r)close,      0 
52c0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c   },.#define osCl
52d0: 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ose     ((int(*)
52e0: 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  (int))aSyscall[1
52f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5300: 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20 20   "access",      
5310: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5320: 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20 20  l_ptr)access,   
5330: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5340: 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69 6e  osAccess    ((in
5350: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
5360: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ,int))aSyscall[2
5370: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5380: 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20 20   "getcwd",      
5390: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
53a0: 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20 20  l_ptr)getcwd,   
53b0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
53c0: 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63 68  osGetcwd    ((ch
53d0: 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a  ar*(*)(char*,siz
53e0: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d  e_t))aSyscall[3]
53f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5400: 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20  "stat",         
5410: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5420: 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20 20  _ptr)stat,      
5430: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
5440: 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e 74  sStat      ((int
5450: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
5460: 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53  struct stat*))aS
5470: 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65  yscall[4].pCurre
5480: 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44  nt)../*.** The D
5490: 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e  JGPP compiler en
54a0: 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20  vironment looks 
54b0: 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78  mostly like Unix
54c0: 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b  , but it.** lack
54d0: 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79  s the fcntl() sy
54e0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72  stem call.  So r
54f0: 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20  edefine fcntl() 
5500: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a  to be something.
5510: 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73  ** that always s
5520: 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d  ucceeds.  This m
5530: 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e  eans that lockin
5540: 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  g does not occur
5550: 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e   under.** DJGPP.
5560: 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20    But it is DOS 
5570: 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65  - what did you e
5580: 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66  xpect?.*/.#ifdef
5590: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22   __DJGPP__.  { "
55a0: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 30  fstat",        0
55b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
55c0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
55d0: 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20  osFstat(a,b,c)  
55e0: 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20    0.#else     . 
55f0: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
5600: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5610: 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20  all_ptr)fstat,  
5620: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
5630: 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28 28  e osFstat     ((
5640: 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63  int(*)(int,struc
5650: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
5660: 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  l[5].pCurrent).#
5670: 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75  endif..  { "ftru
5680: 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ncate",    (sqli
5690: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
56a0: 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d  ftruncate,  0  }
56b0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75  ,.#define osFtru
56c0: 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ncate ((int(*)(i
56d0: 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  nt,off_t))aSysca
56e0: 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[6].pCurrent).
56f0: 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20  .  { "fcntl",   
5700: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5710: 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c  scall_ptr)fcntl,
5720: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5730: 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20  ine osFcntl     
5740: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74  ((int(*)(int,int
5750: 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37  ,...))aSyscall[7
5760: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5770: 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20 20   "read",        
5780: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5790: 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20 20  l_ptr)read,     
57a0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
57b0: 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73 73  osRead      ((ss
57c0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
57d0: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
57e0: 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29  all[8].pCurrent)
57f0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
5800: 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49  E_PREAD) || SQLI
5810: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
5820: 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72 65  G_STYLE.  { "pre
5830: 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ad",        (sql
5840: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5850: 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20 20  )pread,      0  
5860: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
5870: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
5880: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5890: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
58a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
58b0: 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20 28  ne osPread     (
58c0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
58d0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
58e0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  _t))aSyscall[9].
58f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
5900: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
5910: 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34  64).  { "pread64
5920: 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ",      (sqlite3
5930: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
5940: 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23  ad64,    0  },.#
5950: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36  else.  { "pread6
5960: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
5970: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
5980: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
5990: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
59a0: 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73 69  sPread64   ((ssi
59b0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
59c0: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
59d0: 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75  aSyscall[10].pCu
59e0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69  rrent)..  { "wri
59f0: 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  te",        (sql
5a00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5a10: 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20 20  )write,      0  
5a20: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  },.#define osWri
5a30: 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  te     ((ssize_t
5a40: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
5a50: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
5a60: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
5a70: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
5a80: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51  USE_PREAD) || SQ
5a90: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
5aa0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70  ING_STYLE.  { "p
5ab0: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73  write",       (s
5ac0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5ad0: 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20 30  tr)pwrite,     0
5ae0: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
5af0: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
5b00: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5b10: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
5b20: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
5b30: 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20 20  fine osPwrite   
5b40: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
5b50: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
5b60: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20  ze_t,off_t))\.  
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70    aSyscall[12].p
5b90: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
5ba0: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
5bb0: 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34  4).  { "pwrite64
5bc0: 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ",     (sqlite3_
5bd0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69  syscall_ptr)pwri
5be0: 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65  te64,   0  },.#e
5bf0: 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36  lse.  { "pwrite6
5c00: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
5c10: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
5c20: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
5c30: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
5c40: 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69 7a  Pwrite64  ((ssiz
5c50: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
5c60: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66   void*,size_t,of
5c70: 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20  f_t))\.         
5c80: 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63             aSysc
5c90: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
5ca0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  )..#if SQLITE_EN
5cb0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
5cc0: 4c 45 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c  LE.  { "fchmod",
5cd0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
5ce0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d  syscall_ptr)fchm
5cf0: 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65  od,     0  },.#e
5d00: 6c 73 65 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  lse.  { "fchmod"
5d10: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
5d20: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
5d30: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
5d40: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
5d50: 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28  Fchmod    ((int(
5d60: 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61  *)(int,mode_t))a
5d70: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
5d80: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5d90: 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
5da0: 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
5db0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
5dc0: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
5dd0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
5de0: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f  scall_ptr)posix_
5df0: 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c  fallocate,  0 },
5e00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c  .#else.  { "fall
5e10: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
5e20: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5e30: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5e40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
5e50: 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74  efine osFallocat
5e60: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
5e70: 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ff_t,off_t))aSys
5e80: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
5e90: 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  t)..}; /* End of
5ea0: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
5eb0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
5ec0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
5ed0: 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43   the xSetSystemC
5ee0: 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  all() method of 
5ef0: 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20  sqlite3_vfs for 
5f00: 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75  all of the.** "u
5f10: 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52 65 74  nix" VFSes.  Ret
5f20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70  urn SQLITE_OK op
5f30: 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  on successfully 
5f40: 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20  updating the.** 
5f50: 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e  system call poin
5f60: 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ter, or SQLITE_N
5f70: 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65  OTFOUND if there
5f80: 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61   is no configura
5f90: 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  ble.** system ca
5fa0: 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a  ll named zName..
5fb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
5fc0: 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixSetSystemCall(
5fd0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
5fe0: 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  pNotUsed,       
5ff0: 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e   /* The VFS poin
6000: 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a  ter.  Not used *
6010: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6020: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
6030: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73    /* Name of sys
6040: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72  tem call to over
6050: 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ride */.  sqlite
6060: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e  3_syscall_ptr pN
6070: 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74  ewFunc  /* Point
6080: 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d  er to new system
6090: 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29   call value */.)
60a0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
60b0: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
60c0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
60d0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
60e0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
60f0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
6100: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e  .    /* If no zN
6110: 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65  ame is given, re
6120: 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d  store all system
6130: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20   calls to their 
6140: 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73  default.    ** s
6150: 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75  ettings and retu
6160: 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20  rn NULL.    */. 
6170: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6180: 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  K;.    for(i=0; 
6190: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
61a0: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
61b0: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
61c0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
61d0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a  [i].pDefault ){.
61e0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
61f0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61  [i].pCurrent = a
6200: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
6210: 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ult;.      }.   
6220: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6230: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73  /* If zName is s
6240: 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74  pecified, operat
6250: 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e  e on only the on
6260: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20  e system call.  
6270: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a    ** specified..
6280: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
6290: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
62a0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
62b0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
62c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
62d0: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
62e0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
62f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
6300: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
6310: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ult==0 ){.      
6320: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
6330: 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63  pDefault = aSysc
6340: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
6350: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6360: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6370: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
6380: 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65  NewFunc==0 ) pNe
6390: 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c  wFunc = aSyscall
63a0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
63b0: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
63c0: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65  ].pCurrent = pNe
63d0: 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62  wFunc;.        b
63e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
63f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6400: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
6410: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
6420: 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  f a system call.
6430: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
6440: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a   zName is not a.
6450: 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79  ** recognized sy
6460: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20  stem call name. 
6470: 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65   NULL is also re
6480: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79  turned if the sy
6490: 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20  stem call.** is 
64a0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69  currently undefi
64b0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ned..*/.static s
64c0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
64d0: 74 72 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d  tr unixGetSystem
64e0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
64f0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20  vfs *pNotUsed,. 
6500: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6510: 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  me.){.  unsigned
6520: 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45   int i;..  UNUSE
6530: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
6540: 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Used);.  for(i=0
6550: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
6560: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
6570: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
6580: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6590: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
65a0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  ].zName)==0 ) re
65b0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
65c0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20  .pCurrent;.  }. 
65d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
65e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
65f0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
6600: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74   system call aft
6610: 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e  er zName.  If zN
6620: 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65  ame==NULL.** the
6630: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  n return the nam
6640: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
6650: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
6660: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
6670: 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  e.** is the last
6680: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20   system call or 
6690: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
66a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
66b0: 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  lid.** system ca
66c0: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ll..*/.static co
66d0: 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 4e 65  nst char *unixNe
66e0: 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c  xtSystemCall(sql
66f0: 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e  ite3_vfs *p, con
6700: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
6710: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a  .  int i = -1;..
6720: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6730: 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61  ER(p);.  if( zNa
6740: 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  me ){.    for(i=
6750: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
6760: 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29  Syscall)-1; i++)
6770: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
6780: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
6790: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
67a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
67b0: 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c   }.  for(i++; i<
67c0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
67d0: 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ll); i++){.    i
67e0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
67f0: 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74  Current!=0 ) ret
6800: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
6810: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74  zName;.  }.  ret
6820: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6830: 52 65 74 72 79 20 6f 70 65 6e 28 29 20 63 61 6c  Retry open() cal
6840: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
6850: 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61   to EINTR.*/.sta
6860: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
6870: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
6880: 7a 2c 20 69 6e 74 20 66 2c 20 69 6e 74 20 6d 29  z, int f, int m)
6890: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
68a0: 7b 20 72 63 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c  { rc = osOpen(z,
68b0: 66 2c 6d 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  f,m); }while( rc
68c0: 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
68d0: 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
68e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  c;.}../*.** Help
68f0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
6900: 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
6910: 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
6920: 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
6930: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
6940: 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
6950: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
6960: 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46   and.** vxworksF
6970: 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73  ileId objects us
6980: 65 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c  ed by this file,
6990: 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61   all of which ma
69a0: 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20  y be .** shared 
69b0: 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  by multiple thre
69c0: 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ads..**.** Funct
69d0: 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  ion unixMutexHel
69e0: 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
69f0: 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
6a00: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a   global mutex .*
6a10: 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
6a20: 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
6a30: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
6a40: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
6a50: 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74  ssert() .** stat
6a60: 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a  ements. e.g..**.
6a70: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  **   unixEnterMu
6a80: 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
6a90: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
6aa0: 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69  ld() );.**   uni
6ab0: 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f  xEnterLeave().*/
6ac0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
6ad0: 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64  xEnterMutex(void
6ae0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
6af0: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
6b00: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
6b10: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
6b20: 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69  ASTER));.}.stati
6b30: 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65  c void unixLeave
6b40: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
6b50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6b60: 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
6b70: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6b80: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
6b90: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
6ba0: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
6bb0: 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  int unixMutexHel
6bc0: 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
6bd0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
6be0: 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
6bf0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
6c00: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
6c10: 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ER));.}.#endif..
6c20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6c30: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  EBUG./*.** Helpe
6c40: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
6c50: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
6c60: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
6c70: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
6c80: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
6c90: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
6ca0: 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20  g represetation 
6cb0: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
6cc0: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
6cd0: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
6ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
6cf0: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
6d00: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
6d10: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
6d20: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
6d30: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
6d40: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
6d50: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
6d60: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
6d70: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
6d80: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
6d90: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
6da0: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
6db0: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
6dc0: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
6dd0: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
6de0: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
6df0: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
6e00: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
6e10: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
6e20: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
6e30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
6e40: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
6e50: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
6e60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6e70: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
6e80: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
6e90: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
6ea0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
6eb0: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
6ec0: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
6ed0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
6ee0: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
6ef0: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
6f00: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
6f10: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
6f20: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
6f30: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
6f40: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
6f50: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
6f60: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
6f70: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
6f80: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
6f90: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
6fa0: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
6fb0: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
6fc0: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
6fd0: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
6fe0: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
6ff0: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
7000: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
7010: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
7020: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
7030: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
7040: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
7050: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
7060: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
7070: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
7080: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
7090: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
70a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
70b0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
70c0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
70d0: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
70e0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
70f0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
7100: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
7110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
7120: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
7130: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
7140: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
7150: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
7160: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
7170: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
7180: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
7190: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
71a0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
71b0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
71c0: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
71d0: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
71e0: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
71f0: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
7200: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
7210: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
7220: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
7230: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
7240: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
7250: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
7260: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
7270: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
7280: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
7290: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
72a0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
72b0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
72c0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
72d0: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
72e0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
72f0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
7300: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
7310: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7320: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
7330: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
7340: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
7350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
7360: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
7370: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
7380: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
7390: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
73a0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
73b0: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
73c0: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
73d0: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
73e0: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
73f0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
7400: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
7410: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
7420: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
7430: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
7440: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
7450: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
7460: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
7470: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
7480: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
7490: 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  TR.*/.static int
74a0: 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
74b0: 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33  e(int h, sqlite3
74c0: 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e  _int64 sz){.  in
74d0: 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
74e0: 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73   osFtruncate(h,s
74f0: 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  z); }while( rc<0
7500: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
7510: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
7520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7530: 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65  outine translate
7540: 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53  s a standard POS
7550: 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e  IX errno code in
7560: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
7570: 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c  useful to the cl
7580: 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c  ients of the sql
7590: 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ite3 functions. 
75a0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69   Specifically, i
75b0: 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64  t is.** intended
75c0: 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20   to translate a 
75d0: 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20  variety of "try 
75e0: 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e  again" errors in
75f0: 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a  to SQLITE_BUSY.*
7600: 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20  * and a variety 
7610: 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65  of "please close
7620: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
7630: 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73  ptor NOW" errors
7640: 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45   into .** SQLITE
7650: 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72  _IOERR.** .** Er
7660: 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74  rors during init
7670: 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f  ialization of lo
7680: 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73  cks, or file sys
7690: 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20  tem support for 
76a0: 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64  locks,.** should
76b0: 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20   handle ENOLCK, 
76c0: 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53  ENOTSUP, EOPNOTS
76d0: 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  UPP separately..
76e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
76f0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
7700: 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69  ixError(int posi
7710: 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69  xError, int sqli
7720: 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69  teIOErr) {.  swi
7730: 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29  tch (posixError)
7740: 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74   {.#if 0.  /* At
7750: 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
7760: 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d  code was not com
7770: 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74  mented out. In t
7780: 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e  heory, this bran
7790: 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  ch.  ** should n
77a0: 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73 20  ever be hit, as 
77b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
77c0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
77d0: 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61  led after.  ** a
77e0: 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64   locking-related
77f0: 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20   function (i.e. 
7800: 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74  fcntl()) has ret
7810: 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77  urned non-zero w
7820: 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  ith.  ** the val
7830: 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74  ue of errno as t
7840: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7850: 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74 65  t. Since a syste
7860: 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65  m call has faile
7870: 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68  d,.  ** errno sh
7880: 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  ould be non-zero
7890: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70  ..  **.  ** Desp
78a0: 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72 72  ite this, if err
78b0: 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72  no really is zer
78c0: 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27  o, we still don'
78d0: 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e  t want to return
78e0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  .  ** SQLITE_OK.
78f0: 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   The system call
7900: 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f   failed, and *so
7910: 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  me* SQLite error
7920: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20   should be.  ** 
7930: 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20  propagated back 
7940: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43  to the caller. C
7950: 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62  ommenting this b
7960: 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20  ranch out means 
7970: 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69  errno==0.  ** wi
7980: 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  ll be handled by
7990: 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20   the "default:" 
79a0: 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  case below..  */
79b0: 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20  .  case 0: .    
79c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
79d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65  ;.#endif..  case
79e0: 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20   EAGAIN:.  case 
79f0: 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73  ETIMEDOUT:.  cas
7a00: 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20  e EBUSY:.  case 
7a10: 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e  EINTR:.  case EN
7a20: 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72  OLCK:  .    /* r
7a30: 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20  andom NFS retry 
7a40: 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75  error, unless du
7a50: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
7a60: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
7a70: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
7a80: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
7a90: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
7aa0: 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72  it says */.    r
7ab0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
7ac0: 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  Y;.    .  case E
7ad0: 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45  ACCES: .    /* E
7ae0: 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41  ACCES is like EA
7af0: 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b  GAIN during lock
7b00: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20  ing operations, 
7b10: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65  but not any othe
7b20: 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28  r time*/.    if(
7b30: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
7b40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
7b50: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
7b60: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
7b70: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c  IOERR_UNLOCK) ||
7b80: 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20   ..(sqliteIOErr 
7b90: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
7ba0: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c  RDLOCK) ||..(sql
7bb0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
7bc0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
7bd0: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20  SERVEDLOCK) ){. 
7be0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7bf0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
7c00: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20     /* else fall 
7c10: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73  through */.  cas
7c20: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
7c30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
7c40: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41  ;.    .  /* EDEA
7c50: 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DLK is only poss
7c60: 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74  ible if a call t
7c70: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57  o fcntl(F_SETLKW
7c80: 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20  ) is made. And. 
7c90: 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20   ** this module 
7ca0: 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68  never makes such
7cb0: 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65   a call. And the
7cc0: 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20   code in SQLite 
7cd0: 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73  itself .  ** ass
7ce0: 65 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45  erts that SQLITE
7cf0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69  _IOERR_BLOCKED i
7d00: 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64  s never returned
7d10: 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73  . For these reas
7d20: 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  ons.  ** this ca
7d30: 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65  se is also comme
7d40: 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65  nted out. If the
7d50: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74   system does set
7d60: 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c   errno to EDEADL
7d70: 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61  K,.  ** the defa
7d80: 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ult SQLITE_IOERR
7d90: 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62  _XXX code will b
7da0: 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23  e returned. */.#
7db0: 69 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41  if 0.  case EDEA
7dc0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
7dd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
7de0: 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20  CKED;.#endif.   
7df0: 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50   .#if EOPNOTSUPP
7e00: 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  !=ENOTSUP.  case
7e10: 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20   EOPNOTSUPP: .  
7e20: 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77    /* something w
7e30: 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72  ent terribly awr
7e40: 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  y, unless during
7e50: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
7e60: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
7e70: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
7e80: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
7e90: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
7ea0: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ays */.#endif.#i
7eb0: 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63  fdef ENOTSUP.  c
7ec0: 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20  ase ENOTSUP: .  
7ed0: 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c    /* invalid fd,
7ee0: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
7ef0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
7f00: 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  rt introspection
7f10: 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20  , in which .    
7f20: 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d   * it actually m
7f30: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
7f40: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61  s */.#endif.  ca
7f50: 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45  se EIO:.  case E
7f60: 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e  BADF:.  case EIN
7f70: 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54  VAL:.  case ENOT
7f80: 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f  CONN:.  case ENO
7f90: 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49  DEV:.  case ENXI
7fa0: 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54  O:.  case ENOENT
7fb0: 3a 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a  :.  case ESTALE:
7fc0: 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a  .  case ENOSYS:.
7fd0: 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f      /* these sho
7fe0: 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c  uld force the cl
7ff0: 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68  ient to close th
8000: 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e  e file and recon
8010: 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64  nect */.    .  d
8020: 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74  efault: .    ret
8030: 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b  urn sqliteIOErr;
8040: 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a  .  }.}..../*****
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
80b0: 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  in Unique File I
80c0: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
80d0: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
80f0: 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73  On most versions
8100: 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e   of unix, we can
8110: 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49 44   get a unique ID
8120: 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63   for a file by c
8130: 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20  oncatenating.** 
8140: 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65  the device numbe
8150: 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20  r and the inode 
8160: 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69  number.  But thi
8170: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
8180: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f  on VxWorks..** O
8190: 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69  n VxWorks, a uni
81a0: 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74  que file id must
81b0: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
81c0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
81d0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ame..**.** A poi
81e0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
81f0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
8200: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
8210: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 0a  an be used as a.
8220: 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49  ** unique file I
8230: 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45  D in VxWorks.  E
8240: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
8250: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63  this structure c
8260: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70  ontains.** a cop
8270: 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63  y of the canonic
8280: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68  al filename.  Th
8290: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65  ere is also a re
82a0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20  ference count.  
82b0: 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75 72  .** The structur
82c0: 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77  e is reclaimed w
82d0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
82e0: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74  f pointers to it
82f0: 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72   drops to.** zer
8300: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  o..**.** There a
8310: 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61  re never very ma
8320: 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74  ny files open at
8330: 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f   one time and lo
8340: 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  okups are not.**
8350: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63   a performance-c
8360: 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f  ritical path, so
8370: 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
8380: 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a  t to put these.*
8390: 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20  * structures on 
83a0: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  a linked list..*
83b0: 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  /.struct vxworks
83c0: 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63  FileId {.  struc
83d0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
83e0: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
83f0: 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68   in a list of th
8400: 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  em all */.  int 
8410: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
8420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8430: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
8440: 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f  s to this one */
8450: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
8480: 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  e zCanonicalName
8490: 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  [] string */.  c
84a0: 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e  har *zCanonicalN
84b0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
84c0: 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  Canonical filena
84d0: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53  me */.};..#if OS
84e0: 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20  _VXWORKS./* .** 
84f0: 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e  All unique filen
8500: 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ames are held on
8510: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68   a linked list h
8520: 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  eaded by this.**
8530: 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74   variable:.*/.st
8540: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
8550: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
8560: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a  ksFileList = 0;.
8570: 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20  ./*.** Simplify 
8580: 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  a filename into 
8590: 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f  its canonical fo
85a0: 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20  rm.** by making 
85b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  the following ch
85c0: 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20  anges:.**.**  * 
85d0: 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61  removing any tra
85e0: 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63  iling and duplic
85f0: 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ate /.**  * conv
8600: 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73  ert /./ into jus
8610: 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  t /.**  * conver
8620: 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41  t /A/../ where A
8630: 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e   is any simple n
8640: 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  ame into just /.
8650: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72  **.** Changes ar
8660: 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e  e made in-place.
8670: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
8680: 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a   name length..**
8690: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
86a0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20   filename is in 
86b0: 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75  z[0..n-1].  Retu
86c0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
86d0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
86e0: 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64  n the simplified
86f0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
8700: 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70   int vxworksSimp
8710: 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a  lifyName(char *z
8720: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
8730: 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  i, j;.  while( n
8740: 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >1 && z[n-1]=='/
8750: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f  ' ){ n--; }.  fo
8760: 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
8770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
8780: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
8790: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29  f( z[i+1]=='/' )
87a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
87b0: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
87c0: 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69   && i+2<n && z[i
87d0: 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +2]=='/' ){.    
87e0: 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20      i += 1;.    
87f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8800: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8810: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
8820: 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +3<n && z[i+2]==
8830: 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27  '.' && z[i+3]=='
8840: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  /' ){.        wh
8850: 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d  ile( j>0 && z[j-
8860: 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
8870: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
8880: 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  0 ){ j--; }.    
8890: 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
88a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
88b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
88c0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
88d0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
88e0: 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a   return j;.}../*
88f0: 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75  .** Find a uniqu
8900: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68  e file ID for th
8910: 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65  e given absolute
8920: 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75   pathname.  Retu
8930: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
8940: 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  to the vxworksFi
8950: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68  leId object.  Th
8960: 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68  is pointer is th
8970: 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65  e unique.** file
8980: 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   ID..**.** The n
8990: 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Ref field of the
89a0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
89b0: 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65  bject is increme
89c0: 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  nted before.** t
89d0: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74  he object is ret
89e0: 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78  urned.  A new vx
89f0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
8a00: 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  ct is created.**
8a10: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
8a20: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66  e global list if
8a30: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
8a40: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
8a50: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
8a60: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
8a70: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  LL..*/.static st
8a80: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
8a90: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46  Id *vxworksFindF
8aa0: 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72  ileId(const char
8ab0: 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29   *zAbsoluteName)
8ac0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
8ad0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20  ksFileId *pNew; 
8ae0: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63          /* searc
8af0: 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69  h key and new fi
8b00: 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63  le ID */.  struc
8b10: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
8b20: 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f  *pCandidate;   /
8b30: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
8b40: 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  er existing file
8b50: 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b   IDs */.  int n;
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b80: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f   Length of zAbso
8b90: 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20  luteName string 
8ba0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41  */..  assert( zA
8bb0: 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d  bsoluteName[0]==
8bc0: 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e  '/' );.  n = (in
8bd0: 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75  t)strlen(zAbsolu
8be0: 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20  teName);.  pNew 
8bf0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8c00: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
8c10: 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28  + (n+1) );.  if(
8c20: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
8c30: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61  n 0;.  pNew->zCa
8c40: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63  nonicalName = (c
8c50: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
8c60: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43   memcpy(pNew->zC
8c70: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41  anonicalName, zA
8c80: 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31  bsoluteName, n+1
8c90: 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73  );.  n = vxworks
8ca0: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65  SimplifyName(pNe
8cb0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
8cc0: 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  e, n);..  /* Sea
8cd0: 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
8ce0: 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d  ing entry that m
8cf0: 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f  atching the cano
8d00: 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a  nical name..  **
8d10: 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65   If found, incre
8d20: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
8d30: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
8d40: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
8d50: 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69  .  ** the existi
8d60: 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f  ng file ID..  */
8d70: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
8d80: 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64  x();.  for(pCand
8d90: 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c  idate=vxworksFil
8da0: 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74  eList; pCandidat
8db0: 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43  e; pCandidate=pC
8dc0: 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29  andidate->pNext)
8dd0: 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69  {.    if( pCandi
8de0: 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a  date->nName==n .
8df0: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
8e00: 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f  Candidate->zCano
8e10: 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d  nicalName, pNew-
8e20: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
8e30: 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20   n)==0.    ){.  
8e40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8e50: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
8e60: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66  pCandidate->nRef
8e70: 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c  ++;.       unixL
8e80: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
8e90: 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64      return pCand
8ea0: 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  idate;.    }.  }
8eb0: 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20  ..  /* No match 
8ec0: 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77  was found.  We w
8ed0: 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66  ill make a new f
8ee0: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77  ile ID */.  pNew
8ef0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e  ->nRef = 1;.  pN
8f00: 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20  ew->nName = n;. 
8f10: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76   pNew->pNext = v
8f20: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a  xworksFileList;.
8f30: 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73    vxworksFileLis
8f40: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78  t = pNew;.  unix
8f50: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
8f60: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
8f70: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
8f80: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
8f90: 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73  unt on a vxworks
8fa0: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
8fb0: 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  Free.** the obje
8fc0: 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ct when the refe
8fd0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
8fe0: 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  hes zero..*/.sta
8ff0: 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73  tic void vxworks
9000: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74  ReleaseFileId(st
9010: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
9020: 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  Id *pId){.  unix
9030: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
9040: 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65  assert( pId->nRe
9050: 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52  f>0 );.  pId->nR
9060: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d  ef--;.  if( pId-
9070: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
9080: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
9090: 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66  leId **pp;.    f
90a0: 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69  or(pp=&vxworksFi
90b0: 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a  leList; *pp && *
90c0: 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28  pp!=pId; pp = &(
90d0: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d  (*pp)->pNext)){}
90e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
90f0: 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70  ==pId );.    *pp
9100: 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20   = pId->pNext;. 
9110: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9120: 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  pId);.  }.  unix
9130: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
9140: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
9150: 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORKS */./*******
9160: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
9170: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
9180: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
9190: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
91a0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
91b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
9200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
9250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9260: 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69  ***** Posix Advi
9270: 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  sory Locking ***
9280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
92a0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
92b0: 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  ocks are broken 
92c0: 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49  by design.  ANSI
92d0: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
92e0: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
92f0: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
9300: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
9310: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
9320: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
9330: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
9340: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
9350: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
9360: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
9370: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
9380: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
9390: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
93a0: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
93b0: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
93c0: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
93d0: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
93e0: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
93f0: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
9400: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
9410: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
9420: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a  test case:.**.**
9430: 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d         int fd1 =
9440: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c   open("./file1",
9450: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
9460: 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20   0644);.**      
9470: 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
9480: 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57  "./file2", O_RDW
9490: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
94a0: 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ;.**.** Suppose 
94b0: 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69  ./file1 and ./fi
94c0: 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74  le2 are really t
94d0: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65  he same file (be
94e0: 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20  cause.** one is 
94f0: 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c  a hard or symbol
9500: 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f  ic link to the o
9510: 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f  ther) then if yo
9520: 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c  u set.** an excl
9530: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64  usive lock on fd
9540: 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67  1, then try to g
9550: 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
9560: 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20  lock.** on fd2, 
9570: 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75  it works.  I wou
9580: 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64  ld have expected
9590: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b   the second lock
95a0: 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63   to.** fail sinc
95b0: 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65  e there was alre
95c0: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ady a lock on th
95d0: 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64  e file due to fd
95e0: 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f  1..** But not so
95f0: 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f  .  Since both lo
9600: 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68  cks came from th
9610: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20  e same process, 
9620: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76  the.** second ov
9630: 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73  errides the firs
9640: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
9650: 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66  hey were on diff
9660: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
9670: 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
9680: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69   on different fi
9690: 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  le names..**.** 
96a0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
96b0: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
96c0: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
96d0: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
96e0: 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f  cess.** among co
96f0: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
9700: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
9710: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
9720: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
9730: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
9740: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
9750: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
9760: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
9770: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
9780: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
9790: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
97a0: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
97b0: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
97c0: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
97d0: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
97e0: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
97f0: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
9800: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
9810: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
9820: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
9830: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
9840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
9850: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
9860: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
9870: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
9880: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
9890: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
98a0: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
98b0: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
98c0: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
98d0: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
98e0: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
98f0: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
9900: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
9910: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
9920: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
9930: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
9940: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
9950: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
9960: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
9970: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
9980: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
9990: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
99a0: 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68  **.** (Aside: Th
99b0: 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e  e use of inode n
99c0: 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65  umbers as unique
99d0: 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f   IDs does not wo
99e0: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
99f0: 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77  * For VxWorks, w
9a00: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
9a10: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e  e alternative un
9a20: 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62  ique ID system b
9a30: 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e  ased on.** canon
9a40: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e  ical filename an
9a50: 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  d implemented in
9a60: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69   the previous di
9a70: 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54  vision.).**.** T
9a80: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
9a90: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f  structure for PO
9aa0: 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  SIX is no longer
9ab0: 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72   just an integer
9ac0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
9ad0: 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20  tor.  It is now 
9ae0: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
9af0: 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67   holds the integ
9b00: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
9b10: 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e  iptor and a poin
9b20: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
9b30: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
9b40: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  s the internal.*
9b50: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63  * locks on the c
9b60: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f  orresponding ino
9b70: 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  de.  There is on
9b80: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
9b90: 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65  ure.** per inode
9ba0: 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65  , so if the same
9bb0: 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64   inode is opened
9bc0: 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69   twice, both uni
9bd0: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  xFile structures
9be0: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
9bf0: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
9c00: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
9c10: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
9c20: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
9c30: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
9c40: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
9c50: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
9c60: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
9c70: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
9c80: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
9c90: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
9ca0: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
9cb0: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
9cc0: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
9cd0: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
9ce0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
9cf0: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
9d00: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
9d10: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
9d20: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
9d30: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
9d40: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
9d50: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
9d60: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
9d70: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
9d80: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
9d90: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
9da0: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
9db0: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
9dc0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
9dd0: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
9de0: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
9df0: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
9e00: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
9e10: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74  ..**.** But wait
9e20: 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74  :  there are yet
9e30: 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77   more problems w
9e40: 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f  ith POSIX adviso
9e50: 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ry locks..**.** 
9e60: 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66  If you close a f
9e70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
9e80: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  hat points to a 
9e90: 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f  file that has lo
9ea0: 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b  cks,.** all lock
9eb0: 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  s on that file t
9ec0: 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79  hat are owned by
9ed0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
9ee0: 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65  cess are.** rele
9ef0: 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61  ased.  To work a
9f00: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
9f10: 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f  em, each unixIno
9f20: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  deInfo object.**
9f30: 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75   maintains a cou
9f40: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
9f50: 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   of pending lock
9f60: 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a  s on tha inode..
9f70: 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  ** When an attem
9f80: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
9f90: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
9fa0: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
9fb0: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
9fc0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
9fd0: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
9fe0: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
9ff0: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
a000: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
a010: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
a020: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
a030: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
a040: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49  ar..** The unixI
a050: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
a060: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
a070: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
a080: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
a090: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
a0a0: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
a0b0: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
a0c0: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
a0d0: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
a0e0: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
a0f0: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
a100: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
a110: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
a120: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
a130: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
a140: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
a150: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
a160: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
a170: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
a180: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
a190: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
a1a0: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
a1b0: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
a1c0: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
a1d0: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
a1e0: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
a1f0: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
a200: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
a210: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
a220: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
a230: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
a240: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
a250: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
a260: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
a270: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
a280: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
a290: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
a2a0: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
a2b0: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
a2c0: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
a2d0: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
a2e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
a2f0: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
a300: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
a310: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
a320: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
a330: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
a340: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
a350: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
a360: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
a370: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
a380: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
a390: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65  thread B..** One
a3a0: 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e   has to do a run
a3b0: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
a3c0: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
a3d0: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
a3e0: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
a3f0: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
a400: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e  d to support Lin
a410: 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20  uxThreads.  But 
a420: 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75  support for Linu
a430: 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20  xThreads.** was 
a440: 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e  dropped beginnin
a450: 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33  g with version 3
a460: 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69  .7.0.  SQLite wi
a470: 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69  ll still work wi
a480: 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61  th.** LinuxThrea
a490: 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74  ds provided that
a4a0: 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (1) there is no
a4b0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
a4c0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65  onnection .** pe
a4d0: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
a4e0: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
a4f0: 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61  ess and (2) data
a500: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
a510: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20  .** do not move 
a520: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a  across threads..
a530: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
a540: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
a550: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
a560: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
a570: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
a580: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
a590: 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  r unixInodeInfo 
a5a0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63  object..*/.struc
a5b0: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
a5c0: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5e0: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
a5f0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
a600: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
a610: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
a620: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
a630: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
a640: 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e  #else.  ino_t in
a650: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
a660: 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d      /* Inode num
a670: 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ber */.#endif.};
a680: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
a690: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
a6a0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
a6b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
a6c0: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
a6d0: 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75  de.  Or, on Linu
a6e0: 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20  xThreads, there 
a6f0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  is one of these 
a700: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a  structures for.*
a710: 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65  * each inode ope
a720: 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65  ned by each thre
a730: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67  ad..**.** A sing
a740: 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76  le inode can hav
a750: 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20  e multiple file 
a760: 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20  descriptors, so 
a770: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a  each unixFile.**
a780: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
a790: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
a7a0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
a7b0: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
a7c0: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
a7d0: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
a7e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e  the number of un
a7f0: 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20  ixFile pointing 
a800: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
a810: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b   unixInodeInfo {
a820: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
a830: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
a840: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
a850: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   key */.  int nS
a860: 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  hared;          
a870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a880: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
a890: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e  cks held */.  un
a8a0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
a8b0: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a  eLock;        /*
a8c0: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
a8d0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
a8e0: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73  CK etc. */.  uns
a8f0: 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63  igned char bProc
a900: 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  essLock;     /* 
a910: 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f  An exclusive pro
a920: 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c  cess lock is hel
a930: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  d */.  int nRef;
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a960: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
a970: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a980: 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
a990: 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
a9a0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
a9b0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
a9c0: 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20  with this inode 
a9d0: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20  */.  int nLock; 
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aa00: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69  f outstanding fi
aa10: 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e  le locks */.  Un
aa20: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
aa30: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  sed;          /*
aa40: 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   Unused file des
aa50: 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73  criptors to clos
aa60: 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
aa70: 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20  Info *pNext;    
aa80: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
aa90: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
aaa0: 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  nfo objects */. 
aab0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
aac0: 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  pPrev;          
aad0: 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62   /*    .... doub
aae0: 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66  ly linked */.#if
aaf0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
ab00: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75  OCKING_STYLE.  u
ab10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
ab20: 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f  g sharedByte;  /
ab30: 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61  * for AFP simula
ab40: 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ted shared lock 
ab50: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
ab60: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
ab70: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
ab80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
ab90: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
aba0: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
abb0: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
abc0: 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65  AME+2];  /* Name
abd0: 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f   of that semapho
abe0: 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  re */.#endif.};.
abf0: 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f  ./*.** A lists o
ac00: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
ac10: 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a  nfo objects..*/.
ac20: 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65  static unixInode
ac30: 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20  Info *inodeList 
ac40: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  = 0;../*.**.** T
ac50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75  his function - u
ac60: 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c  nixLogError_x(),
ac70: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
ac80: 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63  lled via the mac
ac90: 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72  ro.** unixLogErr
aca0: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  or()..**.** It i
acb0: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
acc0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
acd0: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
ace0: 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20  n and errno has 
acf0: 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20  been.** set. It 
ad00: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
ad10: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
ad20: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
ad30: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
ad40: 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c  of.** errno and,
ad50: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
ad60: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
ad70: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
ad80: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a   strerror() or.*
ad90: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  * strerror_r()..
ada0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
adb0: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
adc0: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
add0: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
ade0: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
adf0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
ae00: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
ae10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
ae20: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
ae30: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
ae40: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
ae50: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
ae60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ae70: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
ae80: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67  t.** failed (e.g
ae90: 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65  . "unlink", "ope
aea0: 6e 22 29 20 61 6e 64 20 74 68 65 20 74 68 65 20  n") and the the 
aeb0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
aec0: 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20  system path,.** 
aed0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69  if any..*/.#defi
aee0: 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ne unixLogError(
aef0: 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c  a,b,c)     unixL
af00: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
af10: 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74  b,c,__LINE__).st
af20: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67  atic int unixLog
af30: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
af40: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af60: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
af70: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
af80: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
af90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
afa0: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
afb0: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
afc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
afd0: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
afe0: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
aff0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
b000: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
b010: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
b020: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
b030: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
b040: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
b050: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
b060: 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20   *zErr;         
b070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
b080: 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65  essage from stre
b090: 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61  rror() or equiva
b0a0: 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45  lent */.  int iE
b0b0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20  rrno = errno;   
b0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76            /* Sav
b0d0: 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72  ed syscall error
b0e0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a   number */..  /*
b0f0: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
b100: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
b110: 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ld (SQLITE_THREA
b120: 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20  DSAFE==0), then 
b130: 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72  use.  ** the str
b140: 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e  error() function
b150: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68   to obtain the h
b160: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72  uman-readable er
b170: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
b180: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65   equivalent to e
b190: 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c  rrno. Otherwise,
b1a0: 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28   use strerror_r(
b1b0: 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c  )..  */ .#if SQL
b1c0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
b1d0: 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53  & defined(HAVE_S
b1e0: 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61  TRERROR_R).  cha
b1f0: 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65  r aErr[80];.  me
b200: 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69  mset(aErr, 0, si
b210: 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a  zeof(aErr));.  z
b220: 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f  Err = aErr;..  /
b230: 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f  * If STRERROR_R_
b240: 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 61  CHAR_P (set by a
b250: 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29  utoconf scripts)
b260: 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73   or __USE_GNU is
b270: 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61   defined,.  ** a
b280: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
b290: 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74  ystem provides t
b2a0: 68 65 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  he the GNU versi
b2b0: 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72  on of strerror_r
b2c0: 28 29 20 74 68 61 74 20 0a 20 20 2a 2a 20 72 65  () that .  ** re
b2d0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
b2e0: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
b2f0: 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72  aining the error
b300: 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70   message. That p
b310: 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79  ointer .  ** may
b320: 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d   point to aErr[]
b330: 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e  , or it may poin
b340: 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63  t to some static
b350: 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65   storage somewhe
b360: 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  re. .  ** Otherw
b370: 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ise, assume that
b380: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
b390: 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76  ides the POSIX v
b3a0: 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20  ersion of .  ** 
b3b0: 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68  strerror_r(), wh
b3c0: 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65  ich always write
b3d0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
b3e0: 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a  ge into aErr[]..
b3f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
b400: 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c   code incorrectl
b410: 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  y assumes that i
b420: 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76  t is the POSIX v
b430: 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20  ersion that is. 
b440: 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74   ** available, t
b450: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
b460: 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61   will often be a
b470: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
b480: 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20  Not a.  ** huge 
b490: 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65  problem. Incorre
b4a0: 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20  ctly concluding 
b4b0: 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72  that the GNU ver
b4c0: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
b4d0: 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65  e .  ** could le
b4e0: 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74  ad to a segfault
b4f0: 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69   though..  */.#i
b500: 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52  f defined(STRERR
b510: 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20  OR_R_CHAR_P) || 
b520: 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e  defined(__USE_GN
b530: 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65  U).  zErr = .# e
b540: 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f  ndif.  strerror_
b550: 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20  r(iErrno, aErr, 
b560: 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b  sizeof(aErr)-1);
b570: 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54  ..#elif SQLITE_T
b580: 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54  HREADSAFE.  /* T
b590: 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73  his is a threads
b5a0: 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73  afe build, but s
b5b0: 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e  trerror_r() is n
b5c0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f  ot available. */
b5d0: 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65  .  zErr = "";.#e
b5e0: 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72  lse.  /* Non-thr
b5f0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75  eadsafe build, u
b600: 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a  se strerror(). *
b610: 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72  /.  zErr = strer
b620: 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e  ror(iErrno);.#en
b630: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 65  dif..  assert( e
b640: 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrcode!=SQLITE_O
b650: 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  K );.  if( zPath
b660: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
b670: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
b680: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
b690: 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25  os_unix.c:%d: (%
b6a0: 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  d) %s(%s) - %s",
b6b0: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45  .      iLine, iE
b6c0: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
b6d0: 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20  th, zErr.  );.. 
b6e0: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
b6f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
b700: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
b710: 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  r..**.** We assu
b720: 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20  me that close() 
b730: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f  almost always wo
b740: 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73  rks, since it is
b750: 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65   only in a.** ve
b760: 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74  ry sick applicat
b770: 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79  ion or on a very
b780: 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74   sick platform t
b790: 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69  hat it might fai
b7a0: 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  l..** If it does
b7b0: 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65   fail, simply le
b7c0: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
b7d0: 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c  riptor, but do l
b7e0: 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e  og the.** error.
b7f0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
b800: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   it is not safe 
b810: 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29  to retry close()
b820: 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e   after EINTR sin
b830: 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ce the.** file d
b840: 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20  escriptor might 
b850: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
b860: 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74  n reused by anot
b870: 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53  her thread..** S
b880: 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20  o we don't even 
b890: 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66  try to recover f
b8a0: 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a  rom an EINTR.  J
b8b0: 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f  ust log the erro
b8c0: 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e  r.** and move on
b8d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b8e0: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e   robust_close(un
b8f0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
b900: 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nt h, int lineno
b910: 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65  ){.  if( osClose
b920: 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c  (h) ){.    unixL
b930: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51  ogErrorAtLine(SQ
b940: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
b950: 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20  , "close",.     
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d    pFile ? pFile-
b980: 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65  >zPath : 0, line
b990: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
b9a0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  * Close all file
b9b0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63   descriptors acc
b9c0: 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75  umuated in the u
b9d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55  nixInodeInfo->pU
b9e0: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a  nused list..*/ .
b9f0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
ba00: 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78  ePendingFds(unix
ba10: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
ba20: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
ba30: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ba40: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
ba50: 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78  sedFd *p;.  Unix
ba60: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
ba70: 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d  .  for(p=pInode-
ba80: 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70  >pUnused; p; p=p
ba90: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
baa0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 23 69 66   = p->pNext;.#if
bab0: 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43   OSCLOSE_CHECK_C
bac0: 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 69  LOSE_IOERR.    i
bad0: 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20  f( close(p->fd) 
bae0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
baf0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
bb00: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
bb10: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
bb20: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  ;.      p->pNext
bb30: 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20   = pError;.     
bb40: 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20   pError = p;.   
bb50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
bb60: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
bb70: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72     }.#else.    r
bb80: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
bb90: 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45  e, p->fd, __LINE
bba0: 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  __);.    sqlite3
bbb0: 5f 66 72 65 65 28 70 29 3b 0a 23 65 6e 64 69 66  _free(p);.#endif
bbc0: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
bbd0: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
bbe0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
bbf0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
bc00: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
bc10: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
bc20: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
bc30: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
bc40: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
bc50: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
bc60: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
bc70: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
bc80: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
bc90: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
bca0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
bcb0: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
bcc0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
bcd0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
bce0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
bcf0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
bd00: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
bd10: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
bd20: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
bd30: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
bd40: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
bd50: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
bd60: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
bd70: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
bd80: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
bd90: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
bda0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
bdb0: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
bdc0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
bdd0: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
bde0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
bdf0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
be00: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
be10: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
be20: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
be30: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
be40: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
be50: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
be60: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
be70: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
be80: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
be90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
bea0: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
beb0: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
bec0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
bed0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
bee0: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
bef0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
bf00: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
bf10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
bf20: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
bf30: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
bf40: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
bf50: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
bf60: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
bf70: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
bf80: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
bf90: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
bfa0: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
bfb0: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
bfc0: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
bfd0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
bfe0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
bff0: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
c000: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
c010: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
c020: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
c030: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c040: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
c050: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
c060: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
c070: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
c080: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
c090: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
c0a0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
c0b0: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
c0c0: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
c0d0: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
c0e0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
c0f0: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
c100: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
c110: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
c120: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
c130: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
c160: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
c170: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
c1a0: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
c1b0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
c1c0: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
c1d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
c1e0: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
c1f0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
c200: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
c210: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
c220: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
c230: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
c240: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
c250: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
c260: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
c270: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
c280: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
c290: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
c2a0: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
c2b0: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
c2c0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
c2d0: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
c2e0: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
c2f0: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
c300: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
c310: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
c320: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
c330: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
c340: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
c350: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
c360: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
c370: 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a  ifdef EOVERFLOW.
c380: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
c390: 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  astErrno==EOVERF
c3a0: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
c3b0: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
c3c0: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
c3d0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
c3e0: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
c3f0: 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e  .  /* On OS X on
c400: 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79   an msdos filesy
c410: 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20  stem, the inode 
c420: 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74  number is report
c430: 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63  ed.  ** incorrec
c440: 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a  tly for zero-siz
c450: 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69  e files.  See ti
c460: 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20  cket #3260.  To 
c470: 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64  work.  ** around
c480: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77   this problem (w
c490: 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20  e consider it a 
c4a0: 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74  bug in OS X, not
c4b0: 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65   SQLite).  ** we
c4c0: 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65   always increase
c4d0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74   the file size t
c4e0: 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61  o 1 by writing a
c4f0: 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a   single byte.  *
c500: 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73  * prior to acces
c510: 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e  sing the inode n
c520: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20  umber.  The one 
c530: 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a  byte written is.
c540: 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53    ** an ASCII 'S
c550: 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  ' character whic
c560: 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74  h also happens t
c570: 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62  o be the first b
c580: 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  yte.  ** in the 
c590: 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20  header of every 
c5a0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
c5b0: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
c5c0: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  f there.  ** is 
c5d0: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
c5e0: 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68   such that anoth
c5f0: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c  er thread has al
c600: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a  ready populated.
c610: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70    ** the first p
c620: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
c630: 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69  ase, no damage i
c640: 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  s done..  */.  i
c650: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  f( statbuf.st_si
c660: 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  ze==0 && (pFile-
c670: 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
c680: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
c690: 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f  OS)!=0 ){.    do
c6a0: 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66  { rc = osWrite(f
c6b0: 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69  d, "S", 1); }whi
c6c0: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
c6d0: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
c6e0: 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20  if( rc!=1 ){.   
c6f0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c700: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c720: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
c730: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
c740: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
c750: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
c760: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
c770: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c780: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c790: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
c7a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65    }.#endif..  me
c7b0: 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c  mset(&fileId, 0,
c7c0: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
c7d0: 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d  ;.  fileId.dev =
c7e0: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
c7f0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
c800: 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70    fileId.pId = p
c810: 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65  File->pId;.#else
c820: 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20  .  fileId.ino = 
c830: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
c840: 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20  #endif.  pInode 
c850: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  = inodeList;.  w
c860: 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
c870: 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20  memcmp(&fileId, 
c880: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
c890: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
c8a0: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
c8b0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
c8c0: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65    }.  if( pInode
c8d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  ==0 ){.    pInod
c8e0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
c8f0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f  oc( sizeof(*pIno
c900: 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  de) );.    if( p
c910: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
c920: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c930: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
c940: 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20   memset(pInode, 
c950: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  0, sizeof(*pInod
c960: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e));.    memcpy(
c970: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
c980: 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66   &fileId, sizeof
c990: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70  (fileId));.    p
c9a0: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
c9b0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
c9c0: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
c9d0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
c9e0: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
c9f0: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
ca00: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
ca10: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
ca20: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
ca30: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
ca40: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
ca50: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
ca60: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
ca70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
ca80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
ca90: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
caa0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
cab0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
cac0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
cad0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
cae0: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
caf0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
cb00: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
cb10: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
cb20: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
cb30: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
cb40: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
cb50: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
cb60: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
cb70: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
cb80: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
cb90: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
cba0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
cbb0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
cbc0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
cbd0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
cbe0: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
cbf0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cc00: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
cc10: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
cc20: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
cc30: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
cc40: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
cc50: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
cc60: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
cc70: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
cc80: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
cc90: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
cca0: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
ccb0: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
ccc0: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
ccd0: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
cce0: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
ccf0: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
cd00: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
cd10: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
cd20: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
cd30: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
cd40: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
cd50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
cd60: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
cd70: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
cd80: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
cd90: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
cda0: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
cdb0: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
cdc0: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
cdd0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
cde0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
cdf0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ce00: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
ce10: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
ce20: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
ce30: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
ce40: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
ce50: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
ce60: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
ce70: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
ce80: 6b 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b  k) ){.#if OSLOCK
ce90: 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
cea0: 4f 45 52 52 0a 20 20 20 20 20 20 69 6e 74 20 74  OERR.      int t
ceb0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
cec0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ced0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
cee0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
cef0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
cf00: 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
cf10: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
cf20: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 23 65  rno = tErrno;.#e
cf30: 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lse.      rc = S
cf40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
cf50: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
cf60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cf70: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
cf80: 65 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65  endif.    } else
cf90: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
cfa0: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
cfb0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
cfc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
cfd0: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
cfe0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
cff0: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
d000: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
d010: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
d020: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
d030: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
d040: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
d050: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
d060: 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73  tempt to set a s
d070: 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68  ystem-lock on th
d080: 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54  e file pFile.  T
d090: 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64  he lock is .** d
d0a0: 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63  escribed by pLoc
d0b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
d0c0: 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  pFile was opened
d0d0: 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d   read/write from
d0e0: 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e   unix-excl, then
d0f0: 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a   the only lock.*
d100: 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20  * ever obtained 
d110: 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  is an exclusive 
d120: 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20  lock, and it is 
d130: 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79  obtained exactly
d140: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72   once.** the fir
d150: 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b  st time any lock
d160: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20   is attempted.  
d170: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73  All subsequent s
d180: 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  ystem locking.**
d190: 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f   operations beco
d1a0: 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b  me no-ops.  Lock
d1b0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73  ing operations s
d1c0: 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65  till happen inte
d1d0: 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72  rnally,.** in or
d1e0: 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  der to coordinat
d1f0: 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e  e access between
d200: 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61   separate databa
d210: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
d220: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72  * within this pr
d230: 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f  ocess, but all o
d240: 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65  f that is handle
d250: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20  d in memory and 
d260: 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  the.** operating
d270: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
d280: 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a   participate..**
d290: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d2a0: 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f  n is a pass-thro
d2b0: 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53  ugh to fcntl(F_S
d2c0: 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69  ETLK) if pFile i
d2d0: 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56  s using.** any V
d2e0: 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75  FS other than "u
d2f0: 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20  nix-excl" or if 
d300: 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  pFile is opened 
d310: 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a  on "unix-excl".*
d320: 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e  * and is read-on
d330: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ly..**.** Zero i
d340: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
d350: 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73  e call completes
d360: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f   successfully, o
d370: 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a  r -1 if a call.*
d380: 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69  * to fcntl() fai
d390: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
d3a0: 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61  , errno is set a
d3b0: 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79  ppropriately (by
d3c0: 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74   fcntl())..*/.st
d3d0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
d3e0: 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  eLock(unixFile *
d3f0: 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c  pFile, struct fl
d400: 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69  ock *pLock){.  i
d410: 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f  nt rc;.  unixIno
d420: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
d430: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
d440: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
d450: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61  texHeld() );.  a
d460: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
d470: 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c   );.  if( ((pFil
d480: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
d490: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30  NIXFILE_EXCL)!=0
d4a0: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f   || pInode->bPro
d4b0: 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20  cessLock).   && 
d4c0: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
d4d0: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44  gs & UNIXFILE_RD
d4e0: 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ONLY)==0).  ){. 
d4f0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
d500: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
d510: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
d520: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
d530: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
d540: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
d550: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
d560: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
d570: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d580: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
d590: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
d5a0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
d5b0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
d5c0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
d5d0: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
d5e0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
d5f0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
d600: 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75   if( rc<0 ) retu
d610: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e  rn rc;.      pIn
d620: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
d630: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  k = 1;.      pIn
d640: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
d650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
d660: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
d670: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
d680: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
d690: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
d6a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d6b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
d6c0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
d6d0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
d6e0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
d6f0: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
d700: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
d710: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
d720: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
d730: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
d740: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
d750: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
d760: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
d770: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
d780: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
d790: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
d7a0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
d7b0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
d7c0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
d7d0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
d7e0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
d7f0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
d800: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
d810: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
d820: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
d830: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
d840: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
d850: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
d860: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
d870: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
d880: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
d890: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
d8a0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
d8b0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
d8c0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
d8d0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
d8e0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
d8f0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
d900: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
d910: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
d920: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
d930: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
d940: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
d950: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
d960: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
d970: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
d980: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
d990: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
d9a0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
d9b0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
d9c0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
d9d0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
d9e0: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
d9f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
da00: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
da10: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
da20: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
da30: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
da40: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
da50: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
da60: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
da70: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
da80: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
da90: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
daa0: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
dab0: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
dac0: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
dad0: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
dae0: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
daf0: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
db00: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
db10: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
db20: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
db30: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
db40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
db50: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77  ompatible with w
db60: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
db70: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
db80: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
db90: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
dba0: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
dbb0: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
dbc0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
dbd0: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
dbe0: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
dbf0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
dc00: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
dc10: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
dc20: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
dc30: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
dc40: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
dc50: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
dc60: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
dc70: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
dc80: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
dc90: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
dca0: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
dcb0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
dcc0: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
dcd0: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
dce0: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
dcf0: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
dd00: 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d  essful, a random
dd10: 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27   byte from the '
dd20: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
dd30: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
dd40: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c  locked and the l
dd50: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
dd60: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
dd70: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
dd80: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
dd90: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
dda0: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
ddb0: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
ddc0: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
ddd0: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
dde0: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
ddf0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
de00: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
de10: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
de20: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
de30: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
de40: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
de50: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
de60: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
de70: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
de80: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
de90: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
dea0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
deb0: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
dec0: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
ded0: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
dee0: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
def0: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
df00: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
df10: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
df20: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
df30: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
df40: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
df50: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
df60: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
df70: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
df80: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
df90: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
dfa0: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
dfb0: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
dfc0: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
dfd0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
dfe0: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
dff0: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
e000: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
e010: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
e020: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
e030: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
e040: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
e050: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
e060: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
e070: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
e080: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
e090: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
e0a0: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
e0b0: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
e0c0: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
e0d0: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
e0e0: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
e0f0: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
e100: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
e110: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
e120: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
e130: 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c  e reason a singl
e140: 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65  e byte cannot be
e150: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
e160: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
e170: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
e180: 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69   that some versi
e190: 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64  ons of windows d
e1a0: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65  o not support re
e1b0: 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a  ad-locks. By.  *
e1c0: 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64  * locking a rand
e1d0: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72  om byte from a r
e1e0: 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  ange, concurrent
e1f0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61   SHARED locks ma
e200: 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65  y exist.  ** eve
e210: 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n if the locking
e220: 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
e230: 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74  is always a writ
e240: 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  e-lock..  */.  i
e250: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e260: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
e270: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
e280: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
e290: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
e2a0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
e2b0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
e2c0: 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f  ck;.  int tErrno
e2d0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
e2e0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
e2f0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
e300: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
e310: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
e320: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
e330: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
e340: 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
e350: 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
e360: 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61  leLock),.      a
e370: 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
e380: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
e390: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
e3a0: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
e3b0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
e3c0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
e3d0: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
e3e0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
e3f0: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
e400: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
e410: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
e420: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
e430: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
e440: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
e450: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
e460: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
e470: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
e480: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
e490: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
e4a0: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
e4b0: 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69  ready held) (uni
e4c0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
e4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  .            azF
e4e0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
e4f0: 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
e500: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e510: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
e520: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
e530: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e  ence is correct.
e540: 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
e550: 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
e560: 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
e570: 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
e580: 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
e590: 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
e5a0: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
e5b0: 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
e5c0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
e5d0: 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
e5e0: 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
e5f0: 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
e600: 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
e610: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
e620: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
e630: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
e640: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
e650: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
e660: 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
e670: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
e680: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
e690: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
e6a0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e6b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
e6c0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
e6d0: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
e6e0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
e6f0: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
e700: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
e710: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
e720: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
e730: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
e740: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
e750: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
e760: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
e770: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
e780: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
e790: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
e7a0: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
e7b0: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
e7c0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
e7d0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
e7e0: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
e7f0: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
e800: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
e810: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
e820: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
e830: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
e840: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
e850: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
e860: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
e870: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
e880: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
e890: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
e8a0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
e8b0: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
e8c0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
e8d0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
e8e0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
e8f0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
e900: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
e910: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
e920: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
e930: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
e940: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
e950: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
e960: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
e970: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
e980: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
e990: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
e9a0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
e9b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e9c0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e9d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
e9e0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
e9f0: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
ea00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
ea10: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ea20: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
ea30: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
ea40: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
ea50: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
ea60: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
ea70: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
ea80: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
ea90: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
eaa0: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
eab0: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
eac0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
ead0: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
eae0: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
eaf0: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
eb00: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
eb10: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
eb20: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
eb30: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
eb40: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
eb50: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
eb60: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
eb70: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
eb80: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
eb90: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
eba0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
ebb0: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
ebc0: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
ebd0: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
ebe0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ebf0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
ec00: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
ec10: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ec20: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
ec30: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ec40: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
ec50: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
ec60: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
ec70: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
ec80: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
ec90: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
eca0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ecb0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
ecc0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
ecd0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
ece0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
ecf0: 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
ed00: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
ed10: 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
ed20: 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
ed30: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
ed40: 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
ed50: 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
ed60: 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
ed70: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ed80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ed90: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
eda0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
edb0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
edc0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
edd0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
ede0: 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  OK );..    /* No
edf0: 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
ee00: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
ee10: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
ee20: 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
ee30: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
ee40: 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e  SIZE;.    if( un
ee50: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
ee60: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
ee70: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
ee80: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ee90: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
eea0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
eeb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
eec0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
eed0: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
eee0: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
eef0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
ef00: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
ef10: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
ef20: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
ef30: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
ef40: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  LCK;.    if( uni
ef50: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
ef60: 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53   &lock) && rc==S
ef70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ef80: 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20    /* This could 
ef90: 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65  happen with a ne
efa0: 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20  twork mount */. 
efb0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
efc0: 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  rno;.#if OSLOCKI
efd0: 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
efe0: 45 52 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ERR.      rc = s
eff0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
f000: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
f010: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f020: 4c 4f 43 4b 29 3b 20 0a 23 65 6c 73 65 0a 20 20  LOCK); .#else.  
f030: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f040: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23  IOERR_UNLOCK; .#
f050: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
f060: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
f070: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
f080: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
f090: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
f0a0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
f0b0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
f0c0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65  end_lock;.    }e
f0d0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
f0e0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
f0f0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
f100: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
f110: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
f120: 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
f130: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
f140: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
f150: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
f160: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
f170: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
f180: 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
f190: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
f1a0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
f1b0: 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
f1c0: 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
f1d0: 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
f1e0: 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
f1f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
f200: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
f210: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
f220: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
f230: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
f240: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
f250: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
f260: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
f270: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
f280: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
f290: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
f2a0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
f2b0: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
f2c0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63  eLock );.    loc
f2d0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
f2e0: 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  CK;..    assert(
f2f0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
f300: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  RVED_LOCK || eFi
f310: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
f320: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66  E_LOCK );.    if
f330: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
f340: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
f350: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f360: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
f370: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
f380: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c  en = 1L;.    }el
f390: 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  se{.      lock.l
f3a0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
f3b0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
f3c0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f3d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _SIZE;.    }..  
f3e0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f3f0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f400: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
f410: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f420: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
f430: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
f440: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
f450: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
f460: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f470: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
f480: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f490: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
f4a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
f4b0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
f4c0: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
f4d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
f4e0: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
f4f0: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
f500: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
f510: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
f520: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
f530: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
f540: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
f550: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
f560: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
f570: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
f580: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
f590: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
f5a0: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
f5b0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
f5c0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
f5d0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
f5e0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
f5f0: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
f600: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
f610: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
f620: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
f630: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
f640: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
f650: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
f660: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
f670: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
f680: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
f690: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
f6a0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
f6b0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
f6c0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
f6d0: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
f6e0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
f6f0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
f700: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
f710: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
f720: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
f730: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
f740: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
f750: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
f760: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
f770: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
f780: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
f790: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
f7a0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
f7b0: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
f7c0: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
f7d0: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
f7e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
f7f0: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
f800: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
f810: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
f820: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
f830: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
f840: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
f850: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
f860: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
f870: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
f880: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
f890: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
f8a0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
f8b0: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
f8c0: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
f8d0: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
f8e0: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
f8f0: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
f900: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
f910: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
f920: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
f930: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
f940: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
f950: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
f960: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
f970: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
f980: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
f990: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
f9a0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
f9b0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
f9c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
f9d0: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
f9e0: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
f9f0: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
fa00: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
fa10: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
fa20: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
fa30: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
fa40: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
fa50: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
fa60: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
fa70: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
fa80: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
fa90: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
faa0: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
fab0: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
fac0: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
fad0: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
fae0: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
faf0: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
fb00: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
fb10: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
fb20: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
fb30: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
fb40: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
fb50: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
fb60: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
fb70: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
fb80: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
fb90: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
fba0: 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
fbb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
fbc0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
fbd0: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
fbe0: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
fbf0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
fc00: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
fc10: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
fc20: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
fc30: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
fc40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
fc50: 74 20 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t h;..  assert( 
fc60: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
fc70: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
fc80: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
fc90: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
fca0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
fcb0: 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46  leLock,.      pF
fcc0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
fcd0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
fce0: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
fcf0: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
fd00: 2c 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29  ,.      getpid()
fd10: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
fd20: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
fd30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
fd40: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
fd50: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
fd60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fd70: 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
fd80: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20  terMutex();.  h 
fd90: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49  = pFile->h;.  pI
fda0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
fdb0: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
fdc0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
fdd0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
fde0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
fdf0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
fe00: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
fe10: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
fe20: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
fe30: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
fe40: 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
fe50: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
fe60: 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
fe70: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
fe80: 6e 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65  nign(0);..#ifnde
fe90: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
fea0: 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
feb0: 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
fec0: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
fed0: 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
fee0: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
fef0: 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
ff00: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
ff10: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
ff20: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
ff30: 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
ff40: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
ff50: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
ff60: 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
ff70: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
ff80: 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
ff90: 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
ffa0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
ffb0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
ffc0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
ffd0: 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
ffe0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
fff0: 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
10000 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
10010 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
10020 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
10030 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
10040 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
10050 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
10060 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  tion..    */.#if
10070 20 30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   0.    assert( p
10080 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
10090 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ite==0.         
100a0 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
100b0 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  te==0.         |
100c0 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
100d0 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e  trChng==1 );.#en
100e0 64 69 66 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69  dif.    pFile->i
100f0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
10100 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
10110 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20   downgrading to 
10120 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
10130 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c   NFS involves cl
10140 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65  earing the write
10150 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66   lock.    ** bef
10160 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67  ore establishing
10170 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20   the readlock - 
10180 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20  to avoid a race 
10190 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77  condition we dow
101a0 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68  ngrade.    ** th
101b0 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63  e lock in 2 bloc
101c0 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74  ks, so that part
101d0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69   of the range wi
101e0 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79  ll be covered by
101f0 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65   a .    ** write
10200 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20   lock until the 
10210 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20  rest is covered 
10220 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a  by a read lock:.
10230 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57      **  1:   [WW
10240 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20  WWW].    **  2: 
10250 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a    [....W].    **
10260 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20    3:   [RRRRW]. 
10270 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52     **  4:   [RRR
10280 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  R.].    */.    i
10290 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
102a0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69  ARED_LOCK ){..#i
102b0 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  f !defined(__APP
102c0 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45  LE__) || !SQLITE
102d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
102e0 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69  STYLE.      (voi
102f0 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  d)handleNFSUnloc
10300 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
10310 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
10320 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
10330 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
10340 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
10350 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
10360 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
10370 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
10380 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
10390 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
103a0 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
103b0 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
103c0 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
103d0 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a      off_t divSiz
103e0 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e = SHARED_SIZE 
103f0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  - 1;.        .  
10400 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
10410 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
10420 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
10430 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
10440 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
10450 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
10460 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
10470 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
10480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10490 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
104a0 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
104b0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
104c0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20  no = errno;.#if 
104d0 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
104e0 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
104f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10500 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
10510 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
10520 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
10530 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
10540 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
10550 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64  ERR_UNLOCK;.#end
10560 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  if.          if(
10570 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
10580 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
10590 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
105a0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
105b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
105c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
105d0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
105e0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
105f0 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
10600 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
10610 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
10620 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
10630 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
10640 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
10650 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
10660 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10670 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10680 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
10690 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
106a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
106b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
106c0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
106d0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
106e0 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
106f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10700 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
10710 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
10720 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10730 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
10740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10750 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
10760 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
10770 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
10780 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
10790 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
107a0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
107b0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
107c0 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
107d0 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
107e0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
107f0 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
10800 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
10810 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
10820 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
10830 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
10840 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10850 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
10860 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
10870 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
10880 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10890 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
108a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
108b0 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OCK);.#else.    
108c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
108d0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
108e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
108f0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10900 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
10910 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10920 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10930 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10940 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10950 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
10960 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
10970 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
10980 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
10990 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
109a0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20  ING_STYLE */.   
109b0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63     {.        loc
109c0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
109d0 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
109e0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
109f0 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
10a00 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
10a10 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
10a20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10a30 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
10a40 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
10a50 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
10a60 63 6b 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43  ck) ){.#if OSLOC
10a70 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
10a80 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
10a90 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10aa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
10ab0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
10ac0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10ad0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
10ae0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
10af0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10b00 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
10b10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10b20 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10b30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6c  .          }.#el
10b40 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se.          /* 
10b50 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
10b60 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c  all to unixFileL
10b70 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ock() cannot fai
10b80 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  l because anothe
10b90 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  r.          ** p
10ba0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
10bb0 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  g an incompatibl
10bc0 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f  e lock. If it do
10bd0 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  es, this .      
10be0 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73      ** indicates
10bf0 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
10c00 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
10c10 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63  ollowing the loc
10c20 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  king.          *
10c30 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74  * protocol. If t
10c40 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74  his happens, ret
10c50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10c60 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69  _RDLOCK. Returni
10c70 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
10c80 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c  SQLITE_BUSY woul
10c90 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70  d confuse the up
10ca0 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72  per layer (in pr
10cb0 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73  actice it causes
10cc0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
10cd0 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c  n assert to fail
10ce0 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  ). */ .         
10cf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
10d00 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_RDLOCK;.     
10d10 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10d20 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
10d30 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
10d40 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
10d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10d60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
10d70 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
10d80 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
10d90 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
10da0 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
10db0 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
10dc0 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
10dd0 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
10de0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
10df0 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
10e00 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
10e10 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
10e20 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
10e30 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
10e40 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
10e50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
10e60 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
10e70 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
10e80 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10e90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10ea0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10eb0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10ec0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
10ed0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
10ee0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
10f00 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10f10 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 23  Errno;.      }.#
10f20 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
10f30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10f40 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
10f50 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
10f60 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  rno;.#endif.    
10f70 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
10f80 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
10f90 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
10fa0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
10fb0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
10fc0 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
10fd0 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
10fe0 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
10ff0 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
11000 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
11010 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
11020 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
11030 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
11040 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
11050 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
11060 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
11070 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
11080 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
11090 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
110a0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
110b0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
110c0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
110d0 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
110e0 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75  = 0L;.      Simu
110f0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
11100 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
11110 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
11120 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
11130 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
11140 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
11150 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
11160 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
11170 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
11180 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
11190 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
111a0 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  e{.#if OSLOCKING
111b0 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
111c0 52 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f  R.        tErrno
111d0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
111e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
111f0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11200 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11210 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
11220 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
11230 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
11240 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
11250 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
11260 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  rno;.        }.#
11270 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20  else.        rc 
11280 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
11290 4e 4c 4f 43 4b 3b 0a 09 20 20 20 20 70 46 69 6c  NLOCK;..    pFil
112a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
112b0 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rrno;.#endif.   
112c0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
112d0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
112e0 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
112f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
11300 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
11310 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
11320 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
11330 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
11340 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
11350 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
11360 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
11370 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
11380 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
11390 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
113a0 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
113b0 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
113c0 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
113d0 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
113e0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
113f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
11400 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
11410 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
11420 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
11430 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
11440 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
11450 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63  .  }...end_unloc
11460 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
11470 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
11480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
11490 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
114a0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
114b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
114c0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
114d0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
114e0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
114f0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11500 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
11510 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
11520 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
11530 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
11540 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11550 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
11560 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
11570 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
11580 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
11590 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
115a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
115b0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
115c0 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
115d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
115e0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
115f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
11600 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
11610 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Lock, 0);.}../*.
11620 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11630 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
11640 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
11650 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
11660 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
11670 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
11680 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
11690 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
116a0 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
116b0 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
116c0 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
116d0 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
116e0 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
116f0 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
11700 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
11710 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
11720 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
11730 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11740 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
11750 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
11760 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
11770 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
11780 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
11790 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
117a0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
117b0 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
117c0 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
117d0 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
117e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
117f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20  ixFile*)id;.#if 
11800 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c  OSCLOSE_CHECK_CL
11810 4f 53 45 5f 49 4f 45 52 52 0a 20 20 69 66 28 20  OSE_IOERR.  if( 
11820 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
11830 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d  ){.    int err =
11840 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
11850 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 65 72  rfd);.    if( er
11860 72 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  r ){.      pFile
11870 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
11880 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
11890 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
118a0 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 65  IR_CLOSE;.    }e
118b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
118c0 2d 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20  ->dirfd=-1;.    
118d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  }.  }.  if( pFil
118e0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 69  e->h>=0 ){.    i
118f0 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
11900 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 69 66  File->h);.    if
11910 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 70  ( err ){.      p
11920 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11930 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
11940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11950 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 65  RR_CLOSE;.    }e
11960 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
11970 2d 3e 68 3d 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  ->h=-1;.    }.  
11980 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 46  }.#else.  if( pF
11990 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b  ile->dirfd>=0 ){
119a0 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
119b0 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
119c0 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  dirfd, __LINE__)
119d0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72  ;.    pFile->dir
119e0 66 64 3d 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28  fd=-1;.  }.  if(
119f0 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
11a00 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
11a10 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  (pFile, pFile->h
11a20 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
11a30 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
11a40 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f    }.#endif.#if O
11a50 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
11a60 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
11a70 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44    if( pFile->isD
11a80 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 75  elete ){.      u
11a90 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
11aa0 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
11ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
11ac0 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
11ad0 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
11ae0 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
11af0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
11b00 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
11b10 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
11b20 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
11b30 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
11b40 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
11b50 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
11b60 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
11b70 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
11b80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11b90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
11ba0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
11bb0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
11bc0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
11bd0 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
11be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11bf0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11c00 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
11c10 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c    unixUnlock(id,
11c20 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
11c30 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
11c40 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
11c50 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
11c60 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
11c70 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
11c80 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
11c90 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
11ca0 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
11cb0 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
11cc0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
11cd0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
11ce0 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
11cf0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
11d00 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
11d10 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65  if( ALWAYS(pFile
11d20 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69  ->pInode) && pFi
11d30 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
11d40 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
11d50 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
11d60 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
11d70 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
11d80 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
11d90 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
11da0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
11db0 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
11dc0 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
11dd0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
11de0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
11df0 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
11e00 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
11e10 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
11e20 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sed .    ** when
11e30 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
11e40 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
11e50 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
11e60 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
11e70 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
11e80 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  o(pFile);.  rc =
11e90 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
11ea0 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
11eb0 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
11ec0 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
11ed0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
11ee0 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
11ef0 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
11f00 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
11f10 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
11f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f60 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fb0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
11fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fd0 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f  ******* No-op Lo
11fe0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
11ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12000 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f  ********.**.** O
12010 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
12020 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
12030 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c  tions available,
12040 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20   this is by far 
12050 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a  the.** simplest:
12060 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e    locking is ign
12070 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70  ored.  No attemp
12080 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63  t is made to loc
12090 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  k the database.*
120a0 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  * file for readi
120b0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  ng or writing..*
120c0 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e  *.** This lockin
120d0 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70  g mode is approp
120e0 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e  riate for use on
120f0 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
12100 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74  ases.** (ex: dat
12110 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20  abases that are 
12120 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52  burned into CD-R
12130 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  OM, for example.
12140 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73  )  It can.** als
12150 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  o be used if the
12160 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70   application emp
12170 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e  loys some extern
12180 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a  al mechanism to.
12190 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c  ** prevent simul
121a0 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f  taneous access o
121b0 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  f the same datab
121c0 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f  ase by two or mo
121d0 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  re.** database c
121e0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74  onnections.  But
121f0 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69   there is a seri
12200 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61  ous risk of data
12210 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69  base.** corrupti
12220 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69  on if this locki
12230 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
12240 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68  in situations wh
12250 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ere multiple.** 
12260 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12270 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69  ions are accessi
12280 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
12290 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
122a0 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e   same.** time an
122b0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  d one or more of
122c0 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
122d0 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a  ns are writing..
122e0 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  */..static int n
122f0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
12300 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
12310 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
12320 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55  t *pResOut){.  U
12330 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12340 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65  NotUsed);.  *pRe
12350 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  sOut = 0;.  retu
12360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12370 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
12380 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
12390 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
123a0 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
123b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
123c0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
123d0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
123e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
123f0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63   int nolockUnloc
12400 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12410 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
12420 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
12430 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
12440 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
12450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12460 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
12470 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  se the file..*/.
12480 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
12490 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
124a0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74  ile *id) {.  ret
124b0 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
124c0 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  e(id);.}../*****
124d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
124e0 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
124f0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
12500 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
12510 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
12520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12560 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
12570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
125c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125d0 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66  **** Begin dot-f
125e0 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ile Locking ****
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
12610 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63   The dotfile loc
12620 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
12630 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69  ion uses the exi
12640 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72 61  stance of separa
12650 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73  te lock.** files
12660 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
12670 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
12680 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
12690 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74  is works on just
126a0 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79 20  .** about every 
126b0 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
126c0 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
126d0 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
126e0 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
126f0 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
12700 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
12710 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
12720 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
12730 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
12740 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
12750 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
12760 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
12770 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
12780 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
12790 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
127a0 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
127b0 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
127c0 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
127d0 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
127e0 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
127f0 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
12800 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
12810 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
12820 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
12830 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
12840 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
12850 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
12860 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
12870 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
12880 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
12890 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74 68  ing a file in th
128a0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
128b0 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   as the.** datab
128c0 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
128d0 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
128e0 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
128f0 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
12900 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65 20  * The existance 
12910 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69  of a lock file i
12920 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
12930 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
12940 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70  ther lock.** typ
12950 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
12960 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
12970 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
12980 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
12990 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
129a0 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
129b0 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
129c0 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
129d0 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
129e0 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ck file..*/.#def
129f0 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
12a00 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
12a10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12a20 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
12a30 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
12a40 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
12a50 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
12a60 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
12a70 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
12a80 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
12a90 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
12aa0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
12ab0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
12ac0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
12ad0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
12ae0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
12af0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
12b00 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
12b10 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
12b20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
12b30 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
12b40 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
12b50 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
12b60 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
12b70 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
12b80 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
12b90 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
12ba0 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
12bb0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
12bc0 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
12bd0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
12be0 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
12bf0 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
12c00 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
12c10 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
12c20 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
12c30 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12c40 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
12c50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12c60 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
12c70 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
12c80 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
12c90 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
12ca0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
12cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12cc0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
12cd0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
12ce0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
12cf0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
12d00 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
12d10 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
12d20 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
12d30 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
12d40 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
12d50 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
12d60 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
12d70 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  or some other co
12d80 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nnection in the 
12d90 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20  same process.   
12da0 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b   ** holds a lock
12db0 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e   on the file.  N
12dc0 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
12dd0 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
12de0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
12df0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
12e00 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69  e lock is held i
12e10 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68  f and only if th
12e20 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74  e lockfile exist
12e30 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  s */.    const c
12e40 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
12e50 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46   (const char*)pF
12e60 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
12e70 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65  ext;.    reserve
12e80 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f  d = osAccess(zLo
12e90 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
12ea0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
12eb0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12ec0 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
12ed0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
12ee0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
12ef0 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
12f00 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
12f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
12f20 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
12f30 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
12f40 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
12f50 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
12f60 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
12f70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
12f80 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
12f90 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
12fa0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
12fb0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
12fc0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
12fd0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
12fe0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
12ff0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
13000 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
13010 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
13020 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
13030 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
13040 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
13050 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
13060 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
13070 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
13080 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
13090 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
130a0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
130b0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
130c0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
130d0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
130e0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
130f0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
13100 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
13110 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
13120 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
13130 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
13140 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
13150 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
13160 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
13170 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
13180 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
13190 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
131a0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
131b0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
131c0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
131d0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
131e0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
131f0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
13200 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
13210 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
13220 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
13230 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
13240 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
13250 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
13260 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
13270 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
13280 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
13290 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
132a0 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
132b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
132c0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
132d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
132e0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
132f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13300 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13310 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
13320 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
13330 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
13340 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
13350 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13360 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
13370 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
13380 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
13390 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
133a0 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
133b0 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
133c0 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
133d0 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
133e0 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
133f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13400 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
13410 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
13420 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13430 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
13440 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
13450 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
13460 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
13470 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
13480 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
13490 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
134a0 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
134b0 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
134c0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
134d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
134e0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
134f0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
13500 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74  */.  fd = robust
13510 5f 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c  _open(zLockFile,
13520 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54  O_RDONLY|O_CREAT
13530 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20  |O_EXCL,0600);. 
13540 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
13550 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
13560 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
13570 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  le, someone else
13580 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e   may have stolen
13590 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
135a0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
135b0 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
135c0 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
135d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
135e0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
135f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
13600 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
13610 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
13620 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
13630 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
13640 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
13650 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
13660 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
13670 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
13680 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
13690 6e 20 72 63 3b 0a 20 20 7d 20 0a 23 69 66 20 4f  n rc;.  } .#if O
136a0 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
136b0 53 45 5f 49 4f 45 52 52 0a 20 20 69 66 28 20 63  SE_IOERR.  if( c
136c0 6c 6f 73 65 28 66 64 29 20 29 7b 0a 20 20 20 20  lose(fd) ){.    
136d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
136e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
136f0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
13700 43 4c 4f 53 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  CLOSE;.  }.#else
13710 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
13720 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e  pFile, fd, __LIN
13730 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  E__);.#endif.  .
13740 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13750 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13760 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
13770 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13780 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
13790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
137a0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
137b0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
137c0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
137d0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
137e0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
137f0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
13800 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
13810 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
13820 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13830 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13840 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13850 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13860 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13870 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
13880 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13890 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
138a0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
138b0 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
138c0 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
138d0 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
138e0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
138f0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
13900 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
13910 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
13920 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13930 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
13940 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
13950 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
13960 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
13970 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13980 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13990 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
139a0 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
139b0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
139c0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09  >h, eFileLock,..
139d0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
139e0 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
139f0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
13a00 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
13a10 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
13a20 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
13a30 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
13a40 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
13a50 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
13a60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13a70 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72  ..  /* To downgr
13a80 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73  ade to shared, s
13a90 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72  imply update our
13aa0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e   internal notion
13ab0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63   of the.  ** loc
13ac0 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65  k state.  No nee
13ad0 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74  d to mess with t
13ae0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
13af0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
13b00 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13b10 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
13b20 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
13b30 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  RED_LOCK;.    re
13b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13b50 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66    }.  .  /* To f
13b60 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20  ully unlock the 
13b70 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65  database, delete
13b80 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a   the lock file *
13b90 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  /.  assert( eFil
13ba0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
13bb0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a  ;.  if( unlink(z
13bc0 4c 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20  LockFile) ){.   
13bd0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20   int rc = 0;.   
13be0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13bf0 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f  rno;.    if( ENO
13c00 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  ENT != tErrno ){
13c10 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
13c20 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
13c30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13c40 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
13c50 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
13c60 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
13c70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72  );.#else.      r
13c80 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
13c90 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a  _UNLOCK;.#endif.
13ca0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
13cb0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
13cc0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
13cd0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
13ce0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
13cf0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
13d00 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13d10 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
13d20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13d30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
13d40 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
13d50 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
13d60 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
13d70 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
13d80 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
13d90 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
13da0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
13db0 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29  t rc;.  if( id )
13dc0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
13dd0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13de0 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
13df0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
13e00 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
13e10 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
13e20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
13e30 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65    }.  rc = close
13e40 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
13e50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
13e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e70 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
13e80 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
13e90 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
13ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
13eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
13f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f60 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
13f70 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
13f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13fa0 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
13fb0 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
13fc0 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
13fd0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
13fe0 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
13ff0 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
14000 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
14010 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
14020 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
14030 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
14040 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
14050 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
14060 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
14070 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
14080 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
14090 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
140a0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
140b0 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
140c0 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
140d0 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
140e0 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
140f0 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
14100 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
14110 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
14120 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
14130 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
14140 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
14150 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
14160 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
14170 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
14180 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
14190 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
141a0 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20  ed off or if.** 
141b0 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58  compiling for VX
141c0 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51  WORKS..*/.#if SQ
141d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
141e0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
141f0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
14200 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
14210 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
14220 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
14230 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
14240 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
14250 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
14260 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
14270 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
14280 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
14290 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
142a0 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
142b0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
142c0 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
142d0 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
142e0 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
142f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14300 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
14310 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
14320 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14330 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
14340 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
14350 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
14360 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
14370 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
14380 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
14390 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
143a0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
143b0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
143c0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
143d0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
143e0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
143f0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
14400 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
14410 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
14420 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
14430 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
14440 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
14450 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
14460 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14470 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
14480 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
14490 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
144a0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
144b0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
144c0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
144d0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
144e0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
144f0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14500 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
14510 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
14520 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
14530 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
14540 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
14550 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
14560 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
14570 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
14580 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
14590 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
145a0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
145b0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
145c0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
145d0 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
145e0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
145f0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
14600 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
14610 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
14620 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
14630 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
14640 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
14650 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
14660 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
14670 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
14680 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
14690 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
146a0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
146b0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
146c0 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
146d0 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 23 69  h an error */.#i
146e0 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43  f OSLOCKING_CHEC
146f0 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20  K_BUSY_IOERR.   
14700 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
14710 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
14720 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
14730 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
14740 29 3b 0a 23 65 6c 73 65 20 0a 20 20 20 20 20 20  );.#else .      
14750 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    lrc = SQLITE_I
14760 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65  OERR_UNLOCK; .#e
14770 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
14780 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
14790 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
147a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
147b0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
147c0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
147d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
147e0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
147f0 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
14800 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
14810 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
14820 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
14830 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74  se might have it
14840 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20   reserved */.   
14850 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
14860 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14870 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
14880 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a  E_IOERR_LOCK); .
14890 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
148a0 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
148b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
148c0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
148d0 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
148e0 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
148f0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
14900 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
14910 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29  %d %d %d (flock)
14920 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
14930 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
14940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
14950 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
14960 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
14970 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
14980 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
14990 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
149a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65  ITE_OK;.    rese
149b0 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64  rved=1;.  }.#end
149c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
149d0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
149e0 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73  RRORS */.  *pRes
149f0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
14a00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14a10 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
14a20 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
14a30 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
14a40 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
14a50 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
14a60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
14a70 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
14a80 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
14a90 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
14aa0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
14ab0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
14ac0 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
14ad0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
14ae0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
14af0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
14b00 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
14b10 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
14b20 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
14b30 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
14b40 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
14b50 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
14b60 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
14b70 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
14b80 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
14b90 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
14ba0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
14bb0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
14bc0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
14bd0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
14be0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
14bf0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
14c00 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
14c10 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
14c20 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
14c30 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
14c40 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
14c50 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
14c60 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
14c70 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
14c80 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
14c90 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14ca0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
14cb0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
14cc0 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  VE.**.** flock()
14cd0 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
14ce0 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
14cf0 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
14d00 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
14d10 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
14d20 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
14d30 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
14d40 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
14d50 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
14d60 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
14d70 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
14d80 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
14d90 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
14da0 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
14db0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14dc0 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
14dd0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
14de0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
14df0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
14e00 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
14e10 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
14e20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
14e30 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
14e40 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14e50 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
14e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14e70 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14e80 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14e90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
14ea0 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  le );..  /* if w
14eb0 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
14ec0 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
14ed0 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
14ee0 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
14ef0 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
14f00 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
14f10 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
14f20 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
14f30 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
14f40 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14f50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14f60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
14f70 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
14f80 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
14f90 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c  .  if (robust_fl
14fa0 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
14fb0 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
14fc0 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  ) {.    int tErr
14fd0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
14fe0 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d  /* didn't get, m
14ff0 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20  ust be busy */. 
15000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
15010 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
15020 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
15030 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
15040 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
15050 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
15060 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15070 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
15080 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
15090 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
150a0 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
150b0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46  urn ok */.    pF
150c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
150d0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a   eFileLock;.  }.
150e0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
150f0 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c      %d %s %s (fl
15100 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
15110 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
15120 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
15130 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
15140 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
15150 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20  iled"));.#ifdef 
15160 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
15170 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
15180 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
15190 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
151a0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
151b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
151c0 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  Y;.  }.#endif /*
151d0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
151e0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
151f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
15200 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
15210 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
15220 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
15230 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
15240 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
15250 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
15260 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
15270 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
15280 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
15290 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
152a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
152b0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
152c0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
152d0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
152e0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
152f0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
15300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
15310 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
15320 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
15330 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
15340 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15350 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15360 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15370 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
15380 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
15390 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
153a0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
153b0 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
153c0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
153d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74  ->eFileLock, get
153e0 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
153f0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
15400 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
15410 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
15420 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
15430 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15440 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
15450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15460 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
15470 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
15480 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
15490 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
154a0 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
154b0 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if (eFileLock==
154c0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
154d0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
154e0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
154f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15500 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
15510 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75  /* no, really, u
15520 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20  nlock. */.  if( 
15530 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
15540 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20  le->h, LOCK_UN) 
15550 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
15560 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
15570 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65  CK_ERRORS.    re
15580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15590 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
155a0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
155b0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
155c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
155d0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d  OERR_UNLOCK;.  }
155e0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
155f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
15600 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
15610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15620 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
15630 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
15640 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28   int flockClose(
15650 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15660 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
15670 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28      flockUnlock(
15680 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
15690 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  }.  return close
156a0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
156b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
156c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
156d0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
156e0 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  WORK */../******
156f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
15700 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c  d of the flock l
15710 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
15720 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
15730 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15780 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
15790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
157e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157f0 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53  ** Begin Named S
15800 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67  emaphore Locking
15810 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
15820 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
15830 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
15840 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
15850 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57  supported on VxW
15860 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  orks..**.** Sema
15870 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
15880 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61   like dot-lock a
15890 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74  nd flock in that
158a0 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a   it really only.
158b0 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c  ** supports EXCL
158c0 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20  USIVE locking.  
158d0 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  Only a single pr
158e0 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f  ocess can read o
158f0 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64  r write.** the d
15900 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
15910 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65  a time.  This re
15920 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20  duces potential 
15930 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74  concurrency, but
15940 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f  .** makes the lo
15950 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
15960 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a  n much easier..*
15970 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
15980 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15990 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
159a0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
159b0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
159c0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
159d0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
159e0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
159f0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
15a00 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
15a10 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
15a20 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
15a30 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
15a40 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
15a50 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
15a60 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
15a70 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
15a80 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
15a90 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
15aa0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
15ab0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68  static int semCh
15ac0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
15ad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15ae0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
15af0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15b00 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
15b10 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
15b20 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15b30 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
15b40 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15b50 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
15b60 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
15b70 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
15b80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15b90 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
15ba0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
15bb0 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
15bc0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
15bd0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
15be0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
15bf0 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
15c00 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
15c10 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
15c20 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
15c30 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
15c40 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
15c50 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f  rved ){.    sem_
15c60 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
15c70 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
15c80 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
15c90 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28  tatBuf;..    if(
15ca0 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
15cb0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
15cc0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
15cd0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
15ce0 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
15cf0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
15d00 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
15d10 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
15d20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
15d30 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
15d40 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
15d50 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
15d60 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  rno;.      } els
15d70 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
15d80 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
15d90 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
15da0 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
15db0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
15dc0 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46  ved = (pFile->eF
15dd0 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44  ileLock < SHARED
15de0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
15df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15e00 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76   /* we could hav
15e10 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
15e20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f  it */.      sem_
15e30 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20  post(pSem);.    
15e40 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
15e50 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
15e60 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22  d %d %d (sem)\n"
15e70 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
15e80 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
15e90 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
15ea0 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
15eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
15ec0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
15ed0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
15ee0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
15ef0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
15f00 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
15f10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
15f20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
15f30 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
15f40 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
15f50 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
15f60 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
15f70 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
15f80 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
15f90 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
15fa0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
15fb0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
15fc0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
15fd0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
15fe0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
15ff0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
16000 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
16010 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
16020 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
16030 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
16040 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
16050 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
16060 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
16070 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
16080 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
16090 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
160a0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
160b0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
160c0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
160d0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
160e0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
160f0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
16100 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
16110 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
16120 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
16130 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16140 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16150 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
16160 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d  LUSIVE.**.** Sem
16170 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c  aphore locks onl
16180 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
16190 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
161a0 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
161b0 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
161c0 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
161d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
161e0 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
161f0 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
16200 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
16210 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
16220 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
16230 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
16240 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
16250 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
16260 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
16270 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
16280 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
16290 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
162a0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
162b0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
162c0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
162d0 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28  tic int semLock(
162e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
162f0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
16300 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
16310 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16320 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a  *)id;.  int fd;.
16330 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
16340 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
16350 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sem;.  int rc = 
16360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
16370 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
16380 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
16390 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
163a0 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
163b0 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
163c0 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
163d0 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
163e0 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
163f0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
16400 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16410 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  eLock;.    rc = 
16420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
16430 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
16440 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
16450 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
16460 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
16470 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
16480 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
16490 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
164a0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
164b0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
164c0 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
164d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
164e0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
164f0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
16500 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
16510 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
16520 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
16530 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
16540 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
16550 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
16560 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
16570 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
16580 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
16590 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
165a0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
165b0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
165c0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
165d0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
165e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
165f0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
16600 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
16610 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
16620 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
16630 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
16640 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55  .static int semU
16650 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
16660 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
16670 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
16680 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
16690 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
166a0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
166b0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
166c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
166d0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
166e0 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
166f0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
16700 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
16710 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
16720 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20  h, eFileLock,.. 
16730 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16740 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
16750 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
16760 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
16770 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
16780 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
16790 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
167a0 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
167b0 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
167c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
167d0 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
167e0 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
167f0 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
16800 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
16810 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
16820 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16830 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
16840 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
16850 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
16860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16870 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
16880 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  ally unlock. */.
16890 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28    if ( sem_post(
168a0 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20  pSem)==-1 ) {.  
168b0 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f    int rc, tErrno
168c0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
168d0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
168e0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
168f0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
16900 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
16910 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16920 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
16930 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16940 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
16950 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
16960 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
16970 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
16980 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16990 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
169a0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
169b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
169c0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
169d0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
169e0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
169f0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16a00 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
16a10 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
16a20 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
16a30 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
16a40 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
16a50 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
16a60 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
16a70 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
16a80 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
16a90 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
16aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ab0 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
16ac0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
16ad0 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
16ae0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
16af0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
16b00 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
16b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
16b20 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
16b30 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
16b40 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
16b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
16b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
16bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
16c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
16c20 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
16c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
16c50 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
16c60 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
16c70 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
16c80 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
16c90 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
16ca0 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
16cb0 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
16cc0 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
16cd0 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
16ce0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
16cf0 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
16d00 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
16d10 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
16d20 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
16d30 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
16d40 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
16d50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
16d60 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
16d70 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
16d80 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
16d90 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
16da0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
16db0 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
16dc0 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
16dd0 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
16de0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
16df0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
16e00 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
16e10 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
16e20 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
16e30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
16e40 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
16e50 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
16e60 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
16e70 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
16e80 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
16e90 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
16ea0 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
16eb0 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
16ec0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
16ed0 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
16ee0 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
16ef0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
16f00 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
16f10 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
16f20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
16f30 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
16f40 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
16f50 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
16f60 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
16f70 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
16f80 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
16f90 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
16fa0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
16fb0 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
16fc0 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
16fd0 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
17000 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
17010 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
17020 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
17030 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
17040 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
17050 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
17060 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
17070 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
17080 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
17090 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
170a0 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
170b0 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
170c0 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
170d0 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
170e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
170f0 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
17100 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
17110 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
17120 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
17130 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
17140 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
17150 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
17160 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
17170 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
17180 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
17190 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
171a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
171b0 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
171c0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
171d0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
171e0 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
171f0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
17200 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
17210 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
17220 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
17230 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
17240 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
17250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17260 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
17270 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
17280 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
17290 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
172a0 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
172b0 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
172c0 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
172d0 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
172e0 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
172f0 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
17300 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
17310 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
17320 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
17330 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
17340 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
17350 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
17360 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
17370 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
17380 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
17390 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
173a0 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
173b0 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
173c0 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29  offset, length))
173d0 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
173e0 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
173f0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
17400 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
17410 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
17420 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
17430 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
17440 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46      OSTRACE(("AF
17450 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
17460 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
17470 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
17480 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
17490 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
174a0 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20  rrno)));.#ifdef 
174b0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
174c0 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  P_LOCK_ERRORS.  
174d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
174e0 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63  SY;.#else.    rc
174f0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
17500 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
17510 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
17520 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b           setLock
17530 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Flag ? SQLITE_IO
17540 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54  ERR_LOCK : SQLIT
17550 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
17560 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
17570 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
17580 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
17590 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
175a0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
175b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
175c0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
175d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
175e0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
175f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17600 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
17610 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
17620 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
17630 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
17640 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
17650 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
17660 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
17670 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
17680 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
17690 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
176a0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
176b0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
176c0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
176d0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
176e0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
176f0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
17700 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
17710 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
17720 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
17730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17740 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
17750 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
17760 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
17770 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
17780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
17790 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
177a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
177b0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
177c0 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
177d0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
177e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
177f0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
17800 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
17810 70 46 69 6c 65 20 29 3b 0a 20 20 61 66 70 4c 6f  pFile );.  afpLo
17820 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
17830 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
17840 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
17850 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
17860 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65  ext;.  if( conte
17870 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
17880 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
17890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
178a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
178b0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
178c0 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
178d0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
178e0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
178f0 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
17900 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
17910 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
17920 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
17930 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
17940 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
17950 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
17960 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
17970 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
17980 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
17990 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
179a0 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
179b0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
179c0 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
179d0 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
179e0 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
179f0 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
17a00 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17a10 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
17a20 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
17a30 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
17a40 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
17a50 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
17a60 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
17a70 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
17a80 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
17a90 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
17aa0 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
17ab0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
17ac0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17ad0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17ae0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
17af0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
17b00 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
17b10 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
17b20 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
17b30 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
17b40 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
17b50 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
17b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17b70 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
17b80 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
17b90 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
17ba0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
17bb0 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
17bc0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
17bd0 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c   %d %d (afp)\n",
17be0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
17bf0 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20  eserved));.  .  
17c00 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
17c10 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
17c20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
17c30 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
17c40 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
17c50 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
17c60 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
17c70 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17c80 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
17c90 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
17ca0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
17cb0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
17cc0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
17cd0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
17ce0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
17cf0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
17d00 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
17d10 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
17d20 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
17d30 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
17d40 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
17d50 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
17d60 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
17d70 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
17d80 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
17d90 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
17da0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
17db0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
17dc0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
17dd0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
17de0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
17df0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
17e00 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
17e10 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
17e20 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
17e30 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
17e40 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
17e50 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
17e60 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
17e70 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
17e80 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
17e90 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
17ea0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
17eb0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
17ec0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
17ed0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
17ee0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
17ef0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
17f00 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
17f10 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
17f20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
17f30 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
17f40 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
17f50 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
17f60 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17f70 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
17f80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17f90 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
17fa0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
17fb0 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
17fc0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
17fd0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
17fe0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
17ff0 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
18000 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
18010 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
18020 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
18030 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
18040 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
18050 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
18060 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
18070 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
18080 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
18090 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
180a0 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
180b0 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
180c0 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
180d0 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
180e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
180f0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
18100 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
18110 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
18120 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
18130 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
18140 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
18150 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46  n the.  ** unixF
18160 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
18170 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61   Don't use the a
18180 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  fp_end_lock: exi
18190 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
181a0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
181b0 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
181c0 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
181d0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
181e0 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
181f0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
18200 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
18210 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
18220 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
18230 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
18240 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
18250 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
18260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18270 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
18280 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
18290 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
182a0 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20  ct.  **  (1) We 
182b0 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20  never move from 
182c0 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74  unlocked to anyt
182d0 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e  hing higher than
182e0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20   shared lock..  
182f0 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e  **  (2) SQLite n
18300 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  ever explicitly 
18310 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69  requests a pendi
18320 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33  g lock..  **  (3
18330 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ) A shared lock 
18340 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77  is always held w
18350 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f  hen a reserve lo
18360 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  ck is requested.
18370 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18380 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18390 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  !=NO_LOCK || eFi
183a0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
183b0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
183c0 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44   eFileLock!=PEND
183d0 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
183e0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
183f0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
18400 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  | pFile->eFileLo
18410 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18420 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
18430 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
18440 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
18450 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
18460 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
18470 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
18480 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
18490 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
184a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
184b0 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
184c0 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
184d0 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
184e0 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
184f0 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
18500 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
18510 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
18520 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
18530 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
18540 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
18550 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
18560 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
18570 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
18580 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
18590 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
185a0 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53     ){.    rc = S
185b0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
185c0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
185d0 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  k;.  }.  .  /* I
185e0 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
185f0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
18600 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
18610 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
18620 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
18630 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
18640 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
18650 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
18660 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
18670 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
18680 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
18690 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
186a0 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28  _LOCK && .     (
186b0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
186c0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
186d0 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
186e0 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
186f0 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
18700 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
18710 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
18720 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
18730 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
18740 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
18750 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
18760 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
18770 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
18780 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
18790 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
187a0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
187b0 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
187c0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20  d_lock;.  }.    
187d0 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
187e0 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
187f0 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
18800 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
18810 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
18820 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
18830 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
18840 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
18850 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
18860 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
18870 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ed..  */.  if( e
18880 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
18890 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
188a0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
188b0 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
188c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
188d0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
188e0 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
188f0 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61  ;.    failed = a
18900 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18910 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18920 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
18930 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
18940 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
18950 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  c = failed;.    
18960 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
18970 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
18980 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f   .  /* If contro
18990 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
189a0 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
189b0 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
189c0 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
189d0 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
189e0 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
189f0 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
18a00 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
18a10 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
18a20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63     int lrc1, lrc
18a30 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20  2, lrc1Errno;.  
18a40 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
18a50 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
18a60 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
18a70 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
18a80 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
18a90 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
18aa0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
18ab0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
18ac0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
18ad0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
18ae0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
18af0 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
18b00 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
18b10 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
18b20 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
18b30 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
18b40 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
18b50 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
18b60 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
18b70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
18b80 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
18b90 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
18ba0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
18bb0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18bc0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18bd0 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
18be0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
18bf0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
18c00 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
18c10 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
18c20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
18c30 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
18c40 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
18c50 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
18c60 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
18c70 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
18c80 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
18c90 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
18ca0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
18cb0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
18cc0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
18cd0 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
18ce0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
18cf0 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e  Errno = lrc1Errn
18d00 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  o;.      rc = lr
18d10 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
18d20 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
18d30 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
18d40 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
18d50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
18d60 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
18d70 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
18d80 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
18d90 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
18da0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
18db0 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
18dc0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
18dd0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
18de0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
18df0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
18e00 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
18e10 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
18e20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
18e30 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
18e40 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
18e50 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
18e60 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
18e70 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
18e80 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
18e90 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
18ea0 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
18eb0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
18ec0 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
18ed0 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
18ee0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
18ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18f00 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
18f10 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
18f20 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
18f30 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
18f40 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
18f50 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
18f60 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
18f70 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
18f80 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
18f90 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
18fa0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
18fb0 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
18fc0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
18fd0 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
18fe0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
18ff0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
19000 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
19010 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
19020 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
19030 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
19040 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
19050 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19060 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
19070 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
19080 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
19090 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
190a0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
190b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
190c0 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
190d0 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
190e0 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
190f0 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
19100 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
19110 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
19120 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
19130 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
19140 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
19150 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
19160 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
19170 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
19180 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
19190 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
191a0 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
191b0 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
191c0 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
191d0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
191e0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
191f0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
19200 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
19210 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
19220 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
19230 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
19240 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
19250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
19260 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
19270 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
19280 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
19290 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
192a0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
192b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
192c0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
192d0 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
19300 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
19310 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
19320 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
19330 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
19340 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
19370 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
19380 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
19390 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
193a0 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
193b0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
193c0 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
193d0 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
193e0 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
193f0 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
19400 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
19410 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
19420 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
19430 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
19440 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
19450 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19460 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
19470 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
19480 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
19490 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
194a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
194b0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
194c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
194d0 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
194e0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
194f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
19500 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19510 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
19520 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
19530 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
19540 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
19550 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
19560 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
19570 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
19580 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
19590 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
195a0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
195b0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
195c0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
195d0 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f   }.  .afp_end_lo
195e0 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
195f0 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
19600 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
19610 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70  s %s (afp)\n", p
19620 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
19630 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
19640 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
19650 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
19660 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
19670 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19680 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
19690 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
196a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
196b0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
196c0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
196d0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
196e0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
196f0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
19700 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
19710 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
19720 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
19730 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
19740 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
19750 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
19760 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19770 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
19780 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
19790 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
197a0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
197b0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
197c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
197d0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
197e0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
197f0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
19800 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
19810 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
19820 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
19830 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
19840 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
19850 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
19860 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
19870 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
19880 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
19890 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
198a0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
198b0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
198c0 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
198d0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
198e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
198f0 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
19900 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
19910 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
19920 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
19930 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
19940 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
19950 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
19960 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
19970 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
19980 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
19990 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
199a0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
199b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
199c0 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
199d0 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
199e0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
199f0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
19a00 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
19a10 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
19a20 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
19a30 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
19a40 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
19a50 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
19a60 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
19a70 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
19a80 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
19a90 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
19aa0 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
19ab0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
19ac0 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20  );.    .#ifndef 
19ad0 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  NDEBUG.    /* Wh
19ae0 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
19af0 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
19b00 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
19b10 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
19b20 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
19b30 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
19b40 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
19b50 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
19b60 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
19b70 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
19b80 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
19b90 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
19ba0 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
19bb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
19bc0 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
19bd0 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
19be0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
19bf0 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
19c00 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
19c10 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
19c20 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
19c30 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
19c40 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
19c50 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
19c60 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
19c70 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
19c80 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
19c90 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
19ca0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
19cb0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
19cc0 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
19cd0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
19ce0 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a  le->dbUpdate==0.
19cf0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
19d00 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
19d10 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69  ng==1 );.    pFi
19d20 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
19d30 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
19d40 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65    .    if( pFile
19d50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ->eFileLock==EXC
19d60 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
19d70 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
19d80 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19d90 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
19da0 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45  RED_FIRST, SHARE
19db0 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
19dc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19dd0 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
19de0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
19df0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
19e00 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  d>1) ){.        
19e10 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62  /* only re-estab
19e20 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
19e30 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72  lock if necessar
19e40 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
19e50 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
19e60 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
19e70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
19e80 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e;.        rc = 
19e90 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
19ea0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
19eb0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
19ec0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 1, 1);.      
19ed0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
19ee0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b   skipShared = 1;
19ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19f00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19f10 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
19f20 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
19f30 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  G_LOCK ){.      
19f40 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19f50 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
19f60 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
19f70 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
19f80 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   } .    if( rc==
19f90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
19fa0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52  le->eFileLock>=R
19fb0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
19fc0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
19fd0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
19fe0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
19ff0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
1a000 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
1a010 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
1a020 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20  f( !rc ){ .     
1a030 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
1a040 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20  rved = 0; .     
1a050 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1a070 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
1a080 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
1a090 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29  ode->nShared>1))
1a0a0 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
1a0b0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
1a0c0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
1a0d0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1a0e0 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c  ITE_OK && eFileL
1a0f0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock==NO_LOCK ){.
1a100 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
1a110 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
1a120 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
1a130 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
1a140 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
1a150 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
1a160 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
1a170 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
1a180 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
1a190 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
1a1a0 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e     */.    unsign
1a1b0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
1a1c0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
1a1d0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
1a1e0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
1a1f0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
1a200 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
1a210 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
1a220 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61   ){.      Simula
1a230 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a240 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
1a250 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
1a260 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
1a270 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a280 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73  0);.      if( !s
1a290 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20  kipShared ){.   
1a2a0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
1a2b0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1a2c0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
1a2d0 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
1a2e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1a2f0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
1a300 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
1a310 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
1a320 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
1a330 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
1a340 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
1a350 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1a360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a370 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
1a380 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  --;.      assert
1a390 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ( pInode->nLock>
1a3a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1a3b0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
1a3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
1a3d0 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
1a3e0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1a3f0 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
1a400 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
1a410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a420 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
1a430 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
1a440 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a450 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
1a460 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46  ile & cleanup AF
1a470 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  P specific locki
1a480 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73  ng context .*/.s
1a490 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f  tatic int afpClo
1a4a0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
1a4b0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
1a4c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1a4d0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
1a4e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1a4f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1a500 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20    afpUnlock(id, 
1a510 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e  NO_LOCK);.    un
1a520 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
1a530 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
1a540 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e  Inode && pFile->
1a550 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
1a560 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1a570 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
1a580 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
1a590 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
1a5a0 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
1a5b0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
1a5c0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
1a5d0 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
1a5e0 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
1a5f0 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
1a600 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
1a610 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e  Inode->aPending.
1a620 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
1a630 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
1a640 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  d when.      ** 
1a650 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
1a660 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
1a670 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64  */.      setPend
1a680 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
1a690 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49    }.    releaseI
1a6a0 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
1a6b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a6c0 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
1a6d0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63  Context);.    rc
1a6e0 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
1a6f0 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  (id);.    unixLe
1a700 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
1a710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a720 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1a730 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1a740 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1a750 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
1a760 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
1a770 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
1a780 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1a790 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
1a7a0 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
1a7b0 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
1a7c0 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
1a7d0 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
1a7e0 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
1a7f0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
1a800 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
1a810 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
1a820 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
1a830 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
1a840 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
1a850 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1a860 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
1a870 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
1a880 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
1a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8a0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1a8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8f0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1a900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a940 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1a950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a960 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
1a970 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
1a980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a990 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
1a9a0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1a9b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1a9c0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
1a9d0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
1a9e0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
1a9f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
1aa00 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
1aa10 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
1aa20 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
1aa30 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
1aa40 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
1aa50 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
1aa60 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
1aa70 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
1aa80 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
1aa90 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
1aaa0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
1aab0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
1aac0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
1aad0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
1aae0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
1aaf0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
1ab00 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
1ab10 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
1ab20 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a   eFileLock, 1);.
1ab30 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
1ab40 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1ab50 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1ab60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
1ab70 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
1ab80 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46   above is the NF
1ab90 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
1aba0 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
1abb0 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
1abc0 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
1abd0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
1abe0 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
1abf0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
1ac00 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
1ac10 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  able.  .**.*****
1ac20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac30 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20   End of the NFS 
1ac40 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1ac50 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
1ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1acb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
1acc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1acd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ace0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1acf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1ad10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e  ************ Non
1ad20 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
1ad30 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a  _file methods **
1ad40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
1ad60 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73  * The next divis
1ad70 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70  ion contains imp
1ad80 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
1ad90 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20   all methods of 
1ada0 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  the .** sqlite3_
1adb0 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65  file object othe
1adc0 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69  r than the locki
1add0 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ng methods.  The
1ade0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68   locking.** meth
1adf0 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ods were defined
1ae00 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62   in divisions ab
1ae10 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67  ove (one locking
1ae20 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64   method per.** d
1ae30 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65  ivision).  Those
1ae40 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72   methods that ar
1ae50 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  e common to all 
1ae60 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a  locking modes.**
1ae70 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65   are gather toge
1ae80 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64  ther into this d
1ae90 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ivision..*/../*.
1aea0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1aeb0 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20  ffset passed as 
1aec0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1aed0 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  ent, then read c
1aee0 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74  nt .** bytes int
1aef0 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74  o pBuf. Return t
1af00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1af10 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
1af20 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20  ..**.** NB:  If 
1af30 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50  you define USE_P
1af40 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41  READ or USE_PREA
1af50 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  D64, then it mig
1af60 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65  ht also.** be ne
1af70 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e  cessary to defin
1af80 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20  e _XOPEN_SOURCE 
1af90 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73  to be 500.  This
1afa0 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20   varies from.** 
1afb0 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e  one system to an
1afc0 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51  other.  Since SQ
1afd0 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65  Lite does not de
1afe0 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a  fine USE_PREAD.*
1aff0 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62  * any any form b
1b000 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
1b010 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
1b020 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
1b030 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
1b040 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
1b050 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
1b060 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1b070 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1b080 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
1b090 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
1b0a0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
1b0b0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1b0c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1b0d0 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
1b0e0 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
1b0f0 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
1b100 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
1b110 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
1b120 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
1b130 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
1b140 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1b150 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
1b160 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
1b170 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
1b180 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
1b190 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50  .  do{ got = osP
1b1a0 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
1b1b0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20  , cnt, offset); 
1b1c0 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
1b1d0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1b1e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1b1f0 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
1b200 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
1b210 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b  E_PREAD64).  do{
1b220 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
1b230 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
1b240 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69  t, offset); }whi
1b250 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
1b260 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69  no==EINTR);.  Si
1b270 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
1b280 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
1b290 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c  .  newOffset = l
1b2a0 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
1b2b0 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
1b2c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b2d0 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
1b2e0 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
1b2f0 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
1b300 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
1b310 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
1b320 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
1b330 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1b340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b350 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1b360 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
1b370 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
1b380 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
1b390 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64  do{ got = osRead
1b3a0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
1b3b0 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  t); }while( got<
1b3c0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1b3d0 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  R );.#endif.  TI
1b3e0 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
1b3f0 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
1b400 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1b410 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1b420 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1b430 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
1b440 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
1b450 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
1b460 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
1b470 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
1b480 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  t;.}../*.** Read
1b490 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1b4a0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1b4b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1b4c0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1b4d0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1b4e0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1b4f0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1b500 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1b510 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1b520 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1b530 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1b540 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1b550 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1b560 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1b570 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1b580 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1b590 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1b5a0 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1b5b0 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  id );..  /* If t
1b5c0 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1b5d0 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1b5e0 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1b5f0 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1b600 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1b610 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1b620 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1b630 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1b640 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1b650 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1b660 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
1b670 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
1b680 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
1b690 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
1b6a0 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
1b6b0 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
1b6c0 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  f..  got = seekA
1b6d0 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66  ndRead(pFile, of
1b6e0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1b6f0 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
1b700 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1b710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1b720 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
1b730 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1b740 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
1b750 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ad */.    return
1b760 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
1b770 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1b780 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1b790 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20  o = 0; /* not a 
1b7a0 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1b7b0 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
1b7c0 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
1b7d0 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
1b7e0 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
1b7f0 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
1b800 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d  f)[got], 0, amt-
1b810 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  got);.    return
1b820 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1b830 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a  ORT_READ;.  }.}.
1b840 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
1b850 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d  he offset in id-
1b860 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61  >offset then rea
1b870 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f  d cnt bytes into
1b880 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e   pBuf..** Return
1b890 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1b8a0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
1b8b0 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ad.  Update the 
1b8c0 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  offset..**.** To
1b8d0 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1b8e0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1b8f0 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74  on a failed writ
1b900 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  e the lastErrno 
1b910 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
1b920 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1b930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b940 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69  seekAndWrite(uni
1b950 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  xFile *id, i64 o
1b960 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69  ffset, const voi
1b970 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1b980 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69  ){.  int got;.#i
1b990 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f  f (!defined(USE_
1b9a0 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e  PREAD) && !defin
1b9b0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29  ed(USE_PREAD64))
1b9c0 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
1b9d0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
1b9e0 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
1b9f0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
1ba00 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72   do{ got = osPwr
1ba10 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
1ba20 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d   cnt, offset); }
1ba30 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
1ba40 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1ba50 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
1ba60 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b  E_PREAD64).  do{
1ba70 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36   got = osPwrite6
1ba80 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
1ba90 6e 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69  nt, offset);}whi
1baa0 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
1bab0 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73  no==EINTR);.#els
1bac0 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20  e.  newOffset = 
1bad0 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66  lseek(id->h, off
1bae0 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  set, SEEK_SET);.
1baf0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bb00 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
1bb10 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65  ;.  if( newOffse
1bb20 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
1bb30 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
1bb40 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28  = -1 ){.      ((
1bb50 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1bb60 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1bb70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bb80 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1bb90 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
1bba0 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20  0;....    }.    
1bbb0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
1bbc0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 57 72 69   do{ got = osWri
1bbd0 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
1bbe0 63 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  cnt); }while( go
1bbf0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
1bc00 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NTR );.#endif.  
1bc10 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
1bc20 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
1bc30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1bc40 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1bc50 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
1bc60 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1bc70 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1bc80 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f  ", id->h, got, o
1bc90 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41  ffset, TIMER_ELA
1bca0 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
1bcb0 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   got;.}.../*.** 
1bcc0 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
1bcd0 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
1bce0 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
1bcf0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1bd00 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
1bd10 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
1bd20 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
1bd30 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
1bd40 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
1bd50 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
1bd60 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
1bd70 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
1bd80 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
1bd90 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1bda0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1bdb0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f  e*)id;.  int wro
1bdc0 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
1bdd0 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1bde0 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
1bdf0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
1be00 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
1be10 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
1be20 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
1be30 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
1be40 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
1be50 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
1be60 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
1be70 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
1be80 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
1be90 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
1bea0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
1beb0 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
1bec0 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
1bed0 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
1bee0 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
1bef0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1bf00 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77  NDEBUG.  /* If w
1bf10 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1bf20 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1bf30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1bf40 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a  s opposed to.  *
1bf50 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1bf60 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1bf70 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1bf80 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1bf90 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  n a.  ** normal 
1bfa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74  database file) t
1bfb0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66  hen record the f
1bfc0 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74  act that the dat
1bfd0 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63  abase.  ** has c
1bfe0 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
1bff0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1c000 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ter is modified,
1c010 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a   record that.  *
1c020 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f  * fact too..  */
1c030 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e  .  if( pFile->in
1c040 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20  NormalWrite ){. 
1c050 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
1c060 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  te = 1;  /* The 
1c070 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1c080 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  n modified */.  
1c090 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34    if( offset<=24
1c0a0 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d   && offset+amt>=
1c0b0 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  27 ){.      int 
1c0c0 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f  rc;.      char o
1c0d0 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20  ldCntr[4];.     
1c0e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1c0f0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1c100 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61   rc = seekAndRea
1c110 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64  d(pFile, 24, old
1c120 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cntr, 4);.      
1c130 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1c140 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1c150 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d  if( rc!=4 || mem
1c160 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28  cmp(oldCntr, &((
1c170 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f  char*)pBuf)[24-o
1c180 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b  ffset], 4)!=0 ){
1c190 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1c1a0 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
1c1b0 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  1;  /* The trans
1c1c0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68  action counter h
1c1d0 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  as changed */.  
1c1e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c1f0 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28  #endif..  while(
1c200 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
1c210 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1c220 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
1c230 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
1c240 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
1c250 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
1c260 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
1c270 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
1c280 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
1c290 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
1c2a0 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
1c2b0 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
1c2c0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
1c2d0 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
1c2e0 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30  ));..  if( amt>0
1c2f0 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74   ){.    if( wrot
1c300 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61  e<0 && pFile->la
1c310 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20  stErrno!=ENOSPC 
1c320 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
1c330 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1c340 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
1c350 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c360 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1c370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1c380 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1c390 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
1c3a0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1c3b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c3c0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
1c3d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1c3e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
1c3f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
1c400 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1c410 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
1c420 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
1c430 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
1c440 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
1c450 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
1c460 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
1c470 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
1c480 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
1c490 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1c4a0 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
1c4b0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1c4c0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1c4d0 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
1c4e0 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
1c4f0 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
1c500 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
1c510 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
1c520 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
1c530 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
1c540 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
1c550 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a 2a  ower) fsync()..*
1c560 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  * If you know th
1c570 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1c580 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1c590 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1c5a0 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1c5b0 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1c5c0 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1c5d0 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66  sync.*/.#if !def
1c5e0 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20  ined(fdatasync) 
1c5f0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c 69  && !defined(__li
1c600 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20  nux__).# define 
1c610 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1c620 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1c630 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1c640 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1c650 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1c660 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1c670 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1c680 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1c690 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1c6a0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1c6b0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1c6c0 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1c6d0 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1c6e0 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1c6f0 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1c700 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1c710 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1c720 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1c730 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1c740 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53  QLITE_USE_REQUES
1c750 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70  T_FULLFSYNC.#imp
1c760 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23  ort <notify.h>.#
1c770 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f  import <libkern/
1c780 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74  OSAtomic.h>.stat
1c790 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f  ic OSSpinLock no
1c7a0 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23  tify_lock = 0;.#
1c7b0 64 65 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46  define REQUEST_F
1c7c0 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41  ULLSYNC_NOTIFICA
1c7d0 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70  TION    "com.app
1c7e0 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64  le.reqsync".#end
1c7f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  if../*.** The fs
1c800 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1c810 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1c820 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1c830 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1c840 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1c850 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1c860 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1c870 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1c880 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1c890 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1c8a0 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1c8b0 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1c8c0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1c8d0 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1c8e0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1c8f0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1c900 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1c910 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1c920 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1c930 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1c940 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1c950 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1c960 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1c970 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1c980 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1c990 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1c9a0 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1c9b0 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1c9c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c9d0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1c9e0 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1c9f0 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1ca00 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1ca10 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1ca20 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1ca30 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1ca40 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1ca50 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1ca60 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1ca70 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1ca80 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1ca90 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1caa0 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1cab0 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1cac0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1cad0 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1cae0 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1caf0 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1cb00 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1cb10 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1cb20 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1cb30 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1cb40 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1cb50 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1cb60 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1cb70 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1cb80 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1cb90 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1cba0 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1cbb0 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1cbc0 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1cbd0 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1cbe0 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1cbf0 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1cc00 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1cc10 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1cc20 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1cc30 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1cc40 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1cc50 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1cc60 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1cc70 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1cc80 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1cc90 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1cca0 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1ccb0 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1ccc0 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1ccd0 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1cce0 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1ccf0 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1cd00 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1cd10 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1cd20 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1cd30 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1cd40 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1cd50 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1cd60 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1cd70 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1cd80 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1cd90 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1cda0 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1cdb0 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1cdc0 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1cdd0 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1cde0 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1cdf0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1ce00 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1ce10 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1ce20 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1ce30 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1ce40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1ce50 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1ce60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1ce70 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1ce80 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1ce90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1cea0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1ceb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1cec0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1ced0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1cee0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1cef0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1cf00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1cf10 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1cf20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1cf30 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1cf40 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1cf50 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1cf60 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1cf70 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1cf80 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1cf90 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1cfa0 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1cfb0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1cfc0 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1cfd0 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1cfe0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1cff0 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1d000 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1d010 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1d020 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1d030 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1d040 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1d050 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
1d060 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1d070 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
1d080 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69   SQLITE_OK;.#eli
1d090 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1d0a0 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1d0b0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1d0c0 5f 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55 4c  _USE_REQUEST_FUL
1d0d0 4c 46 53 59 4e 43 0a 20 20 20 20 72 63 20 3d 20  LFSYNC.    rc = 
1d0e0 6f 73 46 73 79 6e 63 28 66 64 29 3b 0a 20 20 20  osFsync(fd);.   
1d0f0 20 69 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20   if (!rc) {.    
1d100 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c 6f 63 6b    OSSpinLockLock
1d110 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a  (&notify_lock);.
1d120 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 74 69 66        rc = notif
1d130 79 5f 70 6f 73 74 28 52 45 51 55 45 53 54 5f 46  y_post(REQUEST_F
1d140 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41  ULLSYNC_NOTIFICA
1d150 54 49 4f 4e 29 3b 0a 20 20 20 20 20 20 4f 53 53  TION);.      OSS
1d160 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b 28 26 6e  pinLockUnlock(&n
1d170 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20  otify_lock);.   
1d180 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20   }.#else.    rc 
1d190 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  = osFcntl(fd, F_
1d1a0 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 23  FULLFSYNC, 0);.#
1d1b0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
1d1c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
1d1d0 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
1d1e0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
1d1f0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
1d200 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
1d210 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
1d220 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
1d230 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
1d240 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
1d250 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
1d260 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
1d270 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
1d280 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
1d290 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
1d2a0 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
1d2b0 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
1d2c0 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
1d2d0 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
1d2e0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
1d2f0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
1d300 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
1d310 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
1d320 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
1d330 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
1d340 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
1d350 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
1d360 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
1d370 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
1d380 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
1d390 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
1d3a0 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
1d3b0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1d3c0 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
1d3d0 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
1d3e0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
1d3f0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
1d400 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
1d410 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
1d420 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
1d430 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
1d440 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
1d450 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
1d460 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
1d470 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
1d480 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
1d490 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
1d4a0 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
1d4b0 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
1d4c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
1d4d0 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
1d4e0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
1d4f0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
1d500 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1d510 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
1d520 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
1d530 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
1d540 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
1d550 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1d560 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d570 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1d580 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1d590 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1d5a0 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1d5b0 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1d5c0 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1d5d0 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1d5e0 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1d5f0 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1d600 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1d610 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1d620 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1d630 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1d640 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1d650 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1d660 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1d670 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1d680 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1d690 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1d6a0 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1d6b0 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1d6c0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1d6d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1d6e0 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1d6f0 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1d700 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1d710 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1d720 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1d730 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1d740 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1d750 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1d760 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1d770 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1d780 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1d790 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1d7a0 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1d7b0 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1d7c0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1d7d0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1d7e0 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1d7f0 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1d800 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1d810 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1d820 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1d830 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1d840 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1d850 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1d860 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1d870 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1d880 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1d890 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1d8a0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1d8b0 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1d8c0 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1d8d0 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1d8e0 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1d8f0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1d900 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1d910 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1d920 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1d930 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1d940 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1d950 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1d960 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1d970 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1d980 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1d990 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1d9a0 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1d9b0 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1d9c0 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1d9d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1d9e0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1d9f0 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1da00 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1da10 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1da20 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1da30 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1da40 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1da50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1da60 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1da70 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1da80 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1da90 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1daa0 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1dab0 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1dac0 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1dad0 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1dae0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1daf0 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1db00 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1db10 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1db20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1db30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1db40 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f  RR_FSYNC, "full_
1db50 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  fsync", pFile->z
1db60 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Path);.  }.  if(
1db70 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
1db80 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
1db90 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28  ("DIRSYNC %-3d (
1dba0 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
1dbb0 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
1dbc0 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  ", pFile->dirfd,
1dbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
1dbe0 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
1dbf0 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e 64  ullsync));.#ifnd
1dc00 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
1dc10 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a  E_DIRSYNC.    /*
1dc20 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   The directory s
1dc30 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ync is only atte
1dc40 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73  mpted if full_fs
1dc50 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75  ync is.    ** tu
1dc60 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76  rned off or unav
1dc70 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66  ailable.  If a f
1dc80 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72  ull_fsync occurr
1dc90 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a  ed above,.    **
1dca0 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74   then the direct
1dcb0 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65  ory sync is supe
1dcc0 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a  rfluous..    */.
1dcd0 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46      if( (!HAVE_F
1dce0 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46  ULLFSYNC || !isF
1dcf0 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c  ullsync) && full
1dd00 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69  _fsync(pFile->di
1dd10 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  rfd,0,0) ){.    
1dd20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20     /*.       ** 
1dd30 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64  We have received
1dd40 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74   multiple report
1dd50 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74  s of fsync() ret
1dd60 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a  urning.       **
1dd70 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70   errors when app
1dd80 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72  lied to director
1dd90 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66  ies on certain f
1dda0 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ile systems..   
1ddb0 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20      ** A failed 
1ddc0 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
1ddd0 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c  s not a big deal
1dde0 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20  .  So it seems. 
1ddf0 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
1de00 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72  to ignore the er
1de10 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36  ror.  Ticket #16
1de20 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  57.       */.   
1de30 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61      /* pFile->la
1de40 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1de50 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65   */.       /* re
1de60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1de70 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  R; */.    }.#end
1de80 69 66 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  if.  /* Only nee
1de90 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
1dea0 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 20 64 69  so close the  di
1deb0 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77 65 20  rectory when we 
1dec0 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 23 69 66 20  are done */.#if 
1ded0 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c  OSCLOSE_CHECK_CL
1dee0 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 69 66  OSE_IOERR.    if
1def0 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64  ( close(pFile->d
1df00 69 72 66 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  irfd)==0 ){.    
1df10 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d    pFile->dirfd =
1df20 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
1df30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1df40 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1df50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1df60 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
1df70 45 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  E;.    }.#else. 
1df80 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
1df90 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69  pFile, pFile->di
1dfa0 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
1dfb0 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64      pFile->dirfd
1dfc0 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20 20   = -1;.#endif.  
1dfd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1dfe0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
1dff0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
1e000 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
1e010 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1e020 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c  unixTruncate(sql
1e030 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1e040 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69  64 nByte){.  uni
1e050 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1e060 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
1e070 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
1e080 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
1e090 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1e0a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e0b0 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a  RR_TRUNCATE );..
1e0c0 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
1e0d0 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
1e0e0 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
1e0f0 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
1e100 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
1e110 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
1e120 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
1e130 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
1e140 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
1e150 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
1e160 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
1e170 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
1e180 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1e190 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
1e1a0 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
1e1b0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e1c0 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
1e1d0 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
1e1e0 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
1e1f0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1e200 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1e210 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75    }..  rc = robu
1e220 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1e230 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42  le->h, (off_t)nB
1e240 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  yte);.  if( rc )
1e250 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
1e260 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1e270 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1e280 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1e290 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1e2a0 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1e2b0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
1e2c0 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se{.#ifndef NDEB
1e2d0 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  UG.    /* If we 
1e2e0 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1e2f0 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1e300 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1e310 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a  opposed to.    *
1e320 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1e330 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1e340 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1e350 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1e360 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  n a.    ** norma
1e370 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1e380 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65   and we truncate
1e390 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1e3a0 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a  o length,.    **
1e3b0 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c   that effectivel
1e3c0 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1e3d0 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54  ange counter.  T
1e3e0 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1e3f0 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73  .    ** when res
1e400 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73  toring a databas
1e410 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b  e using the back
1e420 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65  up API from a ze
1e430 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  ro-length.    **
1e440 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a   source..    */.
1e450 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
1e460 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
1e470 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1e480 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1e490 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20  trChng = 1;.    
1e4a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65  }.#endif..    re
1e4b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e4c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74    }.}../*.** Det
1e4d0 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
1e4e0 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
1e4f0 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
1e500 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1e510 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
1e520 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69  le *id, i64 *pSi
1e530 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
1e540 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1e550 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1e560 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
1e570 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
1e580 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69  ->h, &buf);.  Si
1e590 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1e5a0 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21  c=1 );.  if( rc!
1e5b0 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  =0 ){.    ((unix
1e5c0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1e5d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1e5e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e5f0 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
1e600 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
1e610 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
1e620 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
1e630 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
1e640 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
1e650 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
1e660 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
1e670 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
1e680 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
1e690 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
1e6a0 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
1e6b0 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
1e6c0 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
1e6d0 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
1e6e0 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
1e6f0 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
1e700 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
1e710 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
1e720 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
1e730 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
1e740 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
1e750 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
1e760 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
1e770 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
1e780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e790 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
1e7a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1e7b0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1e7c0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
1e7d0 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
1e7e0 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
1e7f0 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
1e800 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
1e810 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
1e820 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
1e830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e840 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1e850 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
1e860 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
1e870 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
1e880 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1e890 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
1e8a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1e8b0 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
1e8c0 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
1e8d0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
1e8e0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1e8f0 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1e900 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1e910 69 74 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  it could be.** t
1e920 68 61 74 20 74 68 65 20 66 69 6c 65 20 6e 65 65  hat the file nee
1e930 64 73 20 74 6f 20 62 65 20 65 78 74 65 6e 64 65  ds to be extende
1e940 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
1e950 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
1e960 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1e970 53 49 5a 45 5f 48 49 4e 54 20 6f 70 65 72 61 74  SIZE_HINT operat
1e980 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  ion is a no-op f
1e990 6f 72 20 55 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74  or Unix..*/.stat
1e9a0 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65  ic int fcntlSize
1e9b0 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  Hint(unixFile *p
1e9c0 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29  File, i64 nByte)
1e9d0 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  {.  if( pFile->s
1e9e0 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 69 36  zChunk ){.    i6
1e9f0 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 nSize;        
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ea10 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1ea20 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
1ea30 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20  stat buf;       
1ea40 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1ea50 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61  o hold return va
1ea60 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20  lues of fstat() 
1ea70 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f  */.   .    if( o
1ea80 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
1ea90 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
1eaa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1eab0 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d  AT;..    nSize =
1eac0 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
1ead0 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
1eae0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1eaf0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1eb00 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
1eb10 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
1eb20 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
1eb30 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1eb40 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
1eb50 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
1eb60 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
1eb70 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
1eb80 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1eb90 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
1eba0 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
1ebb0 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
1ebc0 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
1ebd0 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
1ebe0 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
1ebf0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
1ec00 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
1ec10 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
1ec20 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
1ec30 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1ec40 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
1ec50 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
1ec60 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
1ec70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
1ec80 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
1ec90 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
1eca0 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
1ecb0 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
1ecc0 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
1ecd0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1ece0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1ecf0 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1ed00 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1ed10 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1ed20 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20  it. First use.  
1ed30 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65      ** ftruncate
1ed40 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66 69  () to set the fi
1ed50 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72  le size, then wr
1ed60 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ite a single byt
1ed70 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  e to.      ** th
1ed80 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1ed90 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e  ach block within
1eda0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1edb0 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20  gion. This.     
1edc0 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
1edd0 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20 62  technique used b
1ede0 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65  y glibc to imple
1edf0 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  ment posix_fallo
1ee00 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  cate().      ** 
1ee10 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  on systems that 
1ee20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  do not have a re
1ee30 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73  al fallocate() s
1ee40 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20  ystem call..    
1ee50 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
1ee60 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
1ee70 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
1ee80 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
1ee90 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
1eea0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1eeb0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
1eec0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
1eed0 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72   */..      if( r
1eee0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1eef0 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29  pFile->h, nSize)
1ef00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1ef10 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1ef20 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
1ef30 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1ef40 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1ef50 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1ef60 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1ef70 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
1ef80 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75     iWrite = ((bu
1ef90 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42  f.st_size + 2*nB
1efa0 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42  lk - 1)/nBlk)*nB
1efb0 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c  lk-1;.      whil
1efc0 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20  e( iWrite<nSize 
1efd0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
1efe0 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
1eff0 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
1f000 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
1f010 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
1f020 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
1f030 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1f040 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d         iWrite +=
1f050 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23   nBlk;.      }.#
1f060 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1f070 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f080 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 28 53 51 4c  _OK;.}..#if (SQL
1f090 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
1f0a0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
1f0b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 69  ed(__APPLE__).#i
1f0c0 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f  nclude "sqlite3_
1f0d0 70 72 69 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c  private.h".#incl
1f0e0 75 64 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e  ude <copyfile.h>
1f0f0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 44  .static int getD
1f100 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
1f110 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1f120 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 3b  , char *dbPath);
1f130 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
1f140 6e 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  nt isProxyLockin
1f150 67 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65 20 2a  gMode(unixFile *
1f160 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
1f170 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
1f180 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
1f190 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
1f1a0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1f1b0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1f1c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1f1d0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1f1e0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1f1f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f200 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1f210 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1f220 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65  Arg = ((unixFile
1f230 2a 29 69 64 29 2d 3e 65 46 69 6c 65 4c 6f 63 6b  *)id)->eFileLock
1f240 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1f250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1f260 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f270 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
1f280 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1f290 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  = ((unixFile*)id
1f2a0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  )->lastErrno;.  
1f2b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f2c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f2d0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f2e0 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
1f2f0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1f300 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d  *)id)->szChunk =
1f310 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
1f320 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f330 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1f340 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f350 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
1f360 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 63 6e        return fcn
1f370 74 6c 53 69 7a 65 48 69 6e 74 28 28 75 6e 69 78  tlSizeHint((unix
1f380 46 69 6c 65 20 2a 29 69 64 2c 20 2a 28 69 36 34  File *)id, *(i64
1f390 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a   *)pArg);.    }.
1f3a0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1f3b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1f3c0 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f  calls this metho
1f3d0 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74  d to signal that
1f3e0 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20   it has done.   
1f3f0 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61   ** a rollback a
1f400 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
1f410 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72  base is therefor
1f420 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a  e unchanged and.
1f430 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20      ** it hence 
1f440 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65  it is OK for the
1f450 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61   transaction cha
1f460 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62  nge counter to b
1f470 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67  e.    ** unchang
1f480 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ed..    */.    c
1f490 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f4a0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b  _DB_UNCHANGED: {
1f4b0 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
1f4c0 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65  e*)id)->dbUpdate
1f4d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
1f4e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f4f0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
1f500 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1f510 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1f520 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f530 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f540 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
1f550 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  LE:.    case SQL
1f560 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
1f570 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72  YFILE: {.      r
1f580 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43  eturn proxyFileC
1f590 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72  ontrol(id,op,pAr
1f5a0 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  g);.    }.#endif
1f5b0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1f5c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1f5d0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1f5e0 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66 20 28 53 51  LE__) */.#if (SQ
1f5f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
1f600 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
1f610 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1f620 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1f630 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45  RUNCATE_DATABASE
1f640 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
1f650 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1f660 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
1f670 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f680 5f 4f 4b 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  _OK;.      void 
1f690 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  *pLock = NULL;. 
1f6a0 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
1f6b0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f   0;.      int co
1f6c0 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 20 3d 20  rruptFileLock = 
1f6d0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 43  0;.      int isC
1f6e0 6f 72 72 75 70 74 20 3d 20 30 3b 0a 0a 23 69 66  orrupt = 0;..#if
1f6f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
1f700 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
1f710 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 70 46       flags |= pF
1f720 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a  ile->protFlags;.
1f730 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1f740 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1f750 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28  _STYLE.      if(
1f760 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d   isProxyLockingM
1f770 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ode(pFile) ){.  
1f780 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
1f790 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1f7a0 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ROXY;.      }.#e
1f7b0 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20 20 20  ndif.      .    
1f7c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65    rc = sqlite3de
1f7d0 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69  mo_superlock(pFi
1f7e0 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c  le->zPath, 0, fl
1f7f0 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63  ags, 0, 0, &pLoc
1f800 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
1f810 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1f820 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
1f830 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  PT || rc==SQLITE
1f840 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20  _NOTADB ){.     
1f850 20 20 20 20 20 69 73 43 6f 72 72 75 70 74 20 3d       isCorrupt =
1f860 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   1;.          rc
1f870 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
1f880 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
1f890 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
1f8a0 5f 45 58 43 4c 55 53 49 56 45 2c 20 26 63 6f 72  _EXCLUSIVE, &cor
1f8b0 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  ruptFileLock);. 
1f8c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f8d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1f8e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f8f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f900 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 46 69  }.      rc = pFi
1f910 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 54 72  le->pMethod->xTr
1f920 75 6e 63 61 74 65 28 69 64 2c 20 28 28 70 46 69  uncate(id, ((pFi
1f930 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
1f940 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
1f950 4d 53 44 4f 53 29 20 21 3d 20 30 29 20 3f 20 31  MSDOS) != 0) ? 1
1f960 4c 20 3a 20 30 4c 29 3b 0a 0a 20 20 20 20 20 20  L : 0L);..      
1f970 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f980 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  K ){.        cha
1f990 72 20 6a 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r jPath[MAXPATHL
1f9a0 45 4e 2b 39 5d 3b 0a 20 20 20 20 20 20 20 20 69  EN+9];.        i
1f9b0 6e 74 20 7a 4c 65 6e 20 3d 20 73 74 72 6c 63 70  nt zLen = strlcp
1f9c0 79 28 6a 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  y(jPath, pFile->
1f9d0 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
1f9e0 4e 2b 39 29 3b 0a 20 20 20 20 20 20 20 20 69 66  N+9);.        if
1f9f0 28 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c 45  ( zLen<MAXPATHLE
1fa00 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  N ){.          s
1fa10 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20 20 20  ize_t jLen;.    
1fa20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1fa30 20 65 78 74 65 6e 73 69 6f 6e 73 5b 32 5d 5b 39   extensions[2][9
1fa40 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20 22 2d  ] = { "-wal", "-
1fa50 6a 6f 75 72 6e 61 6c 22 20 2f 2a 2c 20 22 2d 73  journal" /*, "-s
1fa60 68 6d 22 20 2a 2f 20 7d 3b 0a 20 20 20 20 20 20  hm" */ };.      
1fa70 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20      int j = 0;. 
1fa80 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 6a 3d           for( j=
1fa90 30 3b 20 6a 3c 32 3b 20 6a 2b 2b 20 29 7b 0a 20  0; j<2; j++ ){. 
1faa0 20 20 20 20 20 20 20 20 20 20 20 6a 4c 65 6e 20             jLen 
1fab0 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61 74 68  = strlcpy(&jPath
1fac0 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73 69 6f  [zLen], extensio
1fad0 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20 20 20  ns[j], 9);.     
1fae0 20 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e 20         if( jLen 
1faf0 3c 20 39 20 29 7b 0a 20 20 20 20 20 20 20 20 20  < 9 ){.         
1fb00 20 20 20 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f       int jfd = o
1fb10 70 65 6e 28 6a 50 61 74 68 2c 20 4f 5f 54 52 55  pen(jPath, O_TRU
1fb20 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NC);.           
1fb30 20 20 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31 29     if( jfd==(-1)
1fb40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fb50 20 20 20 20 69 66 20 28 20 65 72 72 6e 6f 21 3d      if ( errno!=
1fb60 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  ENOENT ){.      
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 70 65 72 72              perr
1fb80 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20 20  or(jPath);.     
1fb90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1fba0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1fbb0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
1fbc0 20 20 20 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a      fsync(jfd);.
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 63 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20  close(jfd);.    
1fbf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fc00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fc10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1fc20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70          pFile->p
1fc30 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69 64  Method->xSync(id
1fc40 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  , SQLITE_SYNC_FU
1fc50 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
1fc60 20 20 20 69 66 28 20 69 73 43 6f 72 72 75 70 74     if( isCorrupt
1fc70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1fc80 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
1fc90 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20  ock_corrupt(id, 
1fca0 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29  corruptFileLock)
1fcb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1fcc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 64 65         sqlite3de
1fcd0 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70  mo_superunlock(p
1fce0 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
1fcf0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fd00 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
1fd10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 50   case SQLITE_REP
1fd20 4c 41 43 45 5f 44 41 54 41 42 41 53 45 3a 20 7b  LACE_DATABASE: {
1fd30 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
1fd40 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1fd50 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 73 71  le*)id;.      sq
1fd60 6c 69 74 65 33 20 2a 73 72 63 64 62 20 3d 20 28  lite3 *srcdb = (
1fd70 73 71 6c 69 74 65 33 20 2a 29 70 41 72 67 3b 0a  sqlite3 *)pArg;.
1fd80 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 53 72        Btree *pSr
1fd90 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 20  cBtree = NULL;. 
1fda0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
1fdb0 65 20 2a 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55  e *src_file = NU
1fdc0 4c 4c 3b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  LL;.      unixFi
1fdd0 6c 65 20 2a 70 53 72 63 46 69 6c 65 20 3d 20 4e  le *pSrcFile = N
1fde0 55 4c 4c 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ULL;.      char 
1fdf0 73 72 63 57 61 6c 50 61 74 68 5b 4d 41 58 50 41  srcWalPath[MAXPA
1fe00 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20 20 20  THLEN+5];.      
1fe10 69 6e 74 20 73 72 63 57 61 6c 46 44 20 3d 20 2d  int srcWalFD = -
1fe20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  1;.      int rc 
1fe30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1fe40 20 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d     void *pLock =
1fe50 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 69 6e 74   NULL;.      int
1fe60 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20   flags = 0;.    
1fe70 20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62    sqlite3 *srcdb
1fe80 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  2 = NULL;.      
1fe90 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74  copyfile_state_t
1fea0 20 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f   s;.      int co
1feb0 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b  rruptSrcFileLock
1fec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
1fed0 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f  corruptDstFileLo
1fee0 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ck = 0;.      in
1fef0 74 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d  t isSrcCorrupt =
1ff00 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   0;.      int is
1ff10 44 73 74 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a  DstCorrupt = 0;.
1ff20 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
1ff30 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1ff40 28 73 72 63 64 62 29 20 29 7b 0a 20 20 20 20 20  (srcdb) ){.     
1ff50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ff60 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20 7d  _MISUSE;.      }
1ff70 0a 20 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49  .      .#if SQLI
1ff80 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
1ff90 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20  ROTECTION.      
1ffa0 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e  flags |= pFile->
1ffb0 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
1ffc0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1ffd0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1ffe0 45 0a 20 20 20 20 20 20 69 66 28 20 69 73 50 72  E.      if( isPr
1fff0 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
20000 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 20  File) ){.       
20010 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
20020 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b  _OPEN_AUTOPROXY;
20030 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
20040 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
20050 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  = sqlite3demo_su
20060 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a  perlock(pFile->z
20070 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73 2c 20  Path, 0, flags, 
20080 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20  0, 0, &pLock);. 
20090 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
200a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
200b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
200c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41   rc==SQLITE_NOTA
200d0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
200e0 69 73 44 73 74 43 6f 72 72 75 70 74 20 3d 20 31  isDstCorrupt = 1
200f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20100 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
20110 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  erlock_corrupt(i
20120 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
20130 58 43 4c 55 53 49 56 45 2c 20 26 63 6f 72 72 75  XCLUSIVE, &corru
20140 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a  ptDstFileLock);.
20150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20160 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20170 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20190 20 7d 0a 20 20 20 20 20 20 2f 2a 20 67 65 74 20   }.      /* get 
201a0 74 68 65 20 73 72 63 20 66 69 6c 65 20 64 65 73  the src file des
201b0 63 72 69 70 74 6f 72 20 61 64 68 65 72 69 6e 67  criptor adhering
201c0 20 74 6f 20 74 68 65 20 64 62 20 73 74 72 75 63   to the db struc
201d0 74 20 61 63 63 65 73 73 20 72 75 6c 65 73 20 0a  t access rules .
201e0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
201f0 6f 64 65 20 69 73 20 6d 6f 64 65 6c 65 64 20 61  ode is modeled a
20200 66 74 65 72 20 73 71 6c 69 74 65 33 5f 66 69 6c  fter sqlite3_fil
20210 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 69 6e 20 6d  e_control() in m
20220 61 69 6e 2e 63 0a 20 20 20 20 20 20 20 2a 2f 20  ain.c.       */ 
20230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
20240 75 74 65 78 5f 65 6e 74 65 72 28 73 72 63 64 62  utex_enter(srcdb
20250 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
20260 69 66 28 20 73 72 63 64 62 2d 3e 6e 44 62 3e 30  if( srcdb->nDb>0
20270 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63   ){.        pSrc
20280 42 74 72 65 65 20 3d 20 73 72 63 64 62 2d 3e 61  Btree = srcdb->a
20290 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[0].pBt;.     
202a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53 72   }.      if( pSr
202b0 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20  cBtree ){.      
202c0 20 20 50 61 67 65 72 20 2a 70 53 72 63 50 61 67    Pager *pSrcPag
202d0 65 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  er;.        sqli
202e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 53  te3BtreeEnter(pS
202f0 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20  rcBtree);.      
20300 20 20 70 53 72 63 50 61 67 65 72 20 3d 20 73 71    pSrcPager = sq
20310 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
20320 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20  pSrcBtree);.    
20330 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
20340 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
20350 20 20 20 20 73 72 63 5f 66 69 6c 65 20 3d 20 73      src_file = s
20360 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
20370 70 53 72 63 50 61 67 65 72 29 3b 0a 20 20 20 20  pSrcPager);.    
20380 20 20 20 20 61 73 73 65 72 74 28 20 73 72 63 5f      assert( src_
20390 66 69 6c 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  file!=0 );.     
203a0 20 20 20 69 66 28 20 73 72 63 5f 66 69 6c 65 2d     if( src_file-
203b0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
203c0 20 20 20 20 20 20 20 69 6e 74 20 73 72 63 46 6c         int srcFl
203d0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ags = 0;.       
203e0 20 20 20 70 53 72 63 46 69 6c 65 20 3d 20 28 75     pSrcFile = (u
203f0 6e 69 78 46 69 6c 65 20 2a 29 73 72 63 5f 66 69  nixFile *)src_fi
20400 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  le;.          /*
20410 20 77 61 6c 20 6d 6f 64 65 20 64 62 20 63 61 6e   wal mode db can
20420 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 20 72 65  not be opened re
20430 61 64 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 20 20  adonly */.      
20440 20 20 20 20 69 66 20 28 28 70 53 72 63 46 69 6c      if ((pSrcFil
20450 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  e->openFlags & O
20460 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52 44 57 52  _RDWR) == O_RDWR
20470 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
20480 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  srcFlags = SQLIT
20490 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
204a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ;.          } el
204b0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
204c0 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49   srcFlags = SQLI
204d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
204e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 69  ;.          }.#i
204f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20500 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
20510 20 20 20 20 20 20 20 20 20 20 73 72 63 46 6c 61            srcFla
20520 67 73 20 7c 3d 20 70 53 72 63 46 69 6c 65 2d 3e  gs |= pSrcFile->
20530 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
20540 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
20550 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20560 45 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  E.          if( 
20570 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
20580 64 65 28 70 53 72 63 46 69 6c 65 29 20 29 7b 0a  de(pSrcFile) ){.
20590 20 20 20 20 20 20 20 20 20 20 20 20 73 72 63 46              srcF
205a0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
205b0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20  PEN_AUTOPROXY;. 
205c0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
205d0 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
205e0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
205f0 28 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68  (pSrcFile->zPath
20600 2c 20 26 73 72 63 64 62 32 2c 20 73 72 63 46 6c  , &srcdb2, srcFl
20610 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
20620 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20640 20 20 20 20 2f 2a 20 73 74 61 72 74 20 61 20 64      /* start a d
20650 65 66 65 72 72 65 64 20 74 72 61 6e 73 61 63 74  eferred transact
20660 69 6f 6e 20 61 6e 64 20 72 65 61 64 20 74 6f 20  ion and read to 
20670 65 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64  establish a read
20680 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
20690 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
206a0 33 5f 65 78 65 63 28 73 72 63 64 62 32 2c 20 22  3_exec(srcdb2, "
206b0 42 45 47 49 4e 20 44 45 46 45 52 52 45 44 3b 20  BEGIN DEFERRED; 
206c0 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
206d0 72 73 69 6f 6e 22 2c 20 30 2c 20 30 2c 20 30 29  rsion", 0, 0, 0)
206e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
206f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
20700 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  RUPT || rc==SQLI
20710 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20  TE_NOTADB ){.   
20720 20 20 20 20 20 20 20 20 20 20 20 69 73 53 72 63             isSrc
20730 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20  Corrupt = 1;.   
20740 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
20750 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
20760 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 72  rlock_corrupt(sr
20770 63 5f 66 69 6c 65 2c 20 53 51 4c 49 54 45 5f 4c  c_file, SQLITE_L
20780 4f 43 4b 5f 53 48 41 52 45 44 2c 20 26 63 6f 72  OCK_SHARED, &cor
20790 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29  ruptSrcFileLock)
207a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
207b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
207c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
207d0 20 20 20 20 69 66 28 20 21 73 72 63 64 62 32 20      if( !srcdb2 
207e0 7c 7c 20 70 53 72 63 46 69 6c 65 3d 3d 4e 55 4c  || pSrcFile==NUL
207f0 4c 20 7c 7c 20 70 53 72 63 46 69 6c 65 2d 3e 68  L || pSrcFile->h
20800 3c 30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  <0){.        rc 
20810 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  = SQLITE_INTERNA
20820 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
20830 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
20850 74 6f 20 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64  to end_replace_d
20860 61 74 61 62 61 73 65 3b 0a 20 20 20 20 20 20 7d  atabase;.      }
20870 0a 20 20 20 20 20 20 2f 2a 20 62 6f 74 68 20 64  .      /* both d
20880 61 74 61 62 61 73 65 73 20 61 72 65 20 6c 6f 63  atabases are loc
20890 6b 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ked appropriatel
208a0 79 2c 20 63 6f 70 79 20 74 68 65 20 73 72 63 20  y, copy the src 
208b0 77 61 6c 20 6a 6f 75 72 6e 61 6c 20 69 66 20 0a  wal journal if .
208c0 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 65 78 69        ** one exi
208d0 73 74 73 20 61 6e 64 20 74 68 65 6e 20 74 68 65  sts and then the
208e0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
208f0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20   file.      */. 
20900 20 20 20 20 20 73 74 72 6c 63 70 79 28 73 72 63       strlcpy(src
20910 57 61 6c 50 61 74 68 2c 20 70 53 72 63 46 69 6c  WalPath, pSrcFil
20920 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
20930 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 20 20 73  HLEN+5);.      s
20940 74 72 6c 63 61 74 28 73 72 63 57 61 6c 50 61 74  trlcat(srcWalPat
20950 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41  h, "-wal", MAXPA
20960 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 20 20  THLEN+5);.      
20970 73 72 63 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28  srcWalFD = open(
20980 73 72 63 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44  srcWalPath, O_RD
20990 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28  ONLY);.      if(
209a0 20 21 28 73 72 63 57 61 6c 46 44 3c 30 29 20 29   !(srcWalFD<0) )
209b0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64  {.        char d
209c0 73 74 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  stWalPath[MAXPAT
209d0 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20 20 20 20  HLEN+5];.       
209e0 20 69 6e 74 20 64 73 74 57 61 6c 46 44 20 3d 20   int dstWalFD = 
209f0 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6c  -1;.        strl
20a00 63 70 79 28 64 73 74 57 61 6c 50 61 74 68 2c 20  cpy(dstWalPath, 
20a10 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41  pFile->zPath, MA
20a20 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20  XPATHLEN+5);.   
20a30 20 20 20 20 20 73 74 72 6c 63 61 74 28 64 73 74       strlcat(dst
20a40 57 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c  WalPath, "-wal",
20a50 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a   MAXPATHLEN+5);.
20a60 20 20 20 20 20 20 20 20 64 73 74 57 61 6c 46 44          dstWalFD
20a70 20 3d 20 6f 70 65 6e 28 64 73 74 57 61 6c 50 61   = open(dstWalPa
20a80 74 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  th, O_RDWR|O_CRE
20a90 41 54 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  AT, SQLITE_DEFAU
20aa0 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
20ab0 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ONS);.        if
20ac0 28 20 21 28 64 73 74 57 61 6c 46 44 3c 30 29 20  ( !(dstWalFD<0) 
20ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 20 3d  ){.          s =
20ae0 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f   copyfile_state_
20af0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
20b00 20 20 20 6c 73 65 65 6b 28 73 72 63 57 61 6c 46     lseek(srcWalF
20b10 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b  D, 0, SEEK_SET);
20b20 0a 20 20 20 20 20 20 20 20 20 20 6c 73 65 65 6b  .          lseek
20b30 28 64 73 74 57 61 6c 46 44 2c 20 30 2c 20 53 45  (dstWalFD, 0, SE
20b40 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 20  EK_SET);.       
20b50 20 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65     if( fcopyfile
20b60 28 73 72 63 57 61 6c 46 44 2c 20 64 73 74 57 61  (srcWalFD, dstWa
20b70 6c 46 44 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45  lFD, s, COPYFILE
20b80 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
20b90 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72       int err=err
20ba0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
20bb0 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20  switch(err) {.  
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
20bd0 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20   ENOMEM:.       
20be0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
20bf0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
20c00 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
20c10 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
20c20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
20c30 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
20c40 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
20c50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20c60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
20c70 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERR;.           
20c80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
20c90 20 20 20 20 20 20 20 20 20 63 6f 70 79 66 69 6c           copyfil
20ca0 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b  e_state_free(s);
20cb0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
20cc0 28 64 73 74 57 61 6c 46 44 29 3b 0a 20 20 20 20  (dstWalFD);.    
20cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c      }.        cl
20ce0 6f 73 65 28 73 72 63 57 61 6c 46 44 29 3b 0a 20  ose(srcWalFD);. 
20cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20d00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20d10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 62 65 66  {.        /* bef
20d20 6f 72 65 20 77 65 20 63 6f 70 79 2c 20 65 6e 73  ore we copy, ens
20d30 75 72 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ure that the fil
20d40 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
20d50 20 77 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65   will be modifie
20d60 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 69 6e  d */.        uin
20d70 74 33 32 5f 74 20 73 72 63 43 68 61 6e 67 65 20  t32_t srcChange 
20d80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 69 6e  = 0;.        uin
20d90 74 33 32 5f 74 20 64 73 74 43 68 61 6e 67 65 20  t32_t dstChange 
20da0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 72 65  = 0;.        pre
20db0 61 64 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20  ad(pSrcFile->h, 
20dc0 26 73 72 63 43 68 61 6e 67 65 2c 20 34 2c 20 32  &srcChange, 4, 2
20dd0 34 29 3b 0a 20 20 20 20 20 20 20 20 70 72 65 61  4);.        prea
20de0 64 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74  d(pFile->h, &dst
20df0 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a  Change, 4, 24);.
20e00 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
20e10 20 2f 2a 20 63 6f 70 79 20 74 68 65 20 61 63 74   /* copy the act
20e20 75 61 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ual database */.
20e30 20 20 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79          s = copy
20e40 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63  file_state_alloc
20e50 28 29 3b 0a 20 20 20 20 20 20 20 20 6c 73 65 65  ();.        lsee
20e60 6b 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30  k(pSrcFile->h, 0
20e70 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
20e80 20 20 20 20 20 6c 73 65 65 6b 28 70 46 69 6c 65       lseek(pFile
20e90 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  ->h, 0, SEEK_SET
20ea0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
20eb0 63 6f 70 79 66 69 6c 65 28 70 53 72 63 46 69 6c  copyfile(pSrcFil
20ec0 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  e->h, pFile->h, 
20ed0 73 2c 20 43 4f 50 59 46 49 4c 45 5f 41 4c 4c 29  s, COPYFILE_ALL)
20ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
20ef0 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
20f00 20 20 20 20 20 20 20 73 77 69 74 63 68 28 65 72         switch(er
20f10 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r) {.           
20f20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20   case ENOMEM:.  
20f30 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
20f40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
20f60 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
20f70 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
20f80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
20f90 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 3b 0a 20  stErrno = err;. 
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
20fb0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
20fc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6f      }.        co
20fe0 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65  pyfile_state_fre
20ff0 65 28 73 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  e(s);.        . 
21000 20 20 20 20 20 20 20 69 66 20 28 73 72 63 43 68         if (srcCh
21010 61 6e 67 65 20 3d 3d 20 64 73 74 43 68 61 6e 67  ange == dstChang
21020 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e) {.          /
21030 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 63 68 61  * modify the cha
21040 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 66  nge counter to f
21050 6f 72 63 65 20 70 61 67 65 20 7a 65 72 6f 20 74  orce page zero t
21060 6f 20 62 65 20 72 65 6c 6f 61 64 65 64 20 2a 2f  o be reloaded */
21070 0a 20 20 20 20 20 20 20 20 20 20 64 73 74 43 68  .          dstCh
21080 61 6e 67 65 20 2b 2b 3b 0a 20 20 20 20 20 20 20  ange ++;.       
21090 20 20 20 70 77 72 69 74 65 28 70 46 69 6c 65 2d     pwrite(pFile-
210a0 3e 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20  >h, &dstChange, 
210b0 34 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  4, 24);.        
210c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
210d0 69 66 28 20 69 73 53 72 63 43 6f 72 72 75 70 74  if( isSrcCorrupt
210e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
210f0 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
21100 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f  ock_corrupt(src_
21110 66 69 6c 65 2c 20 63 6f 72 72 75 70 74 53 72 63  file, corruptSrc
21120 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  FileLock);.     
21130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21140 2f 2a 20 64 6f 6e 65 20 77 69 74 68 20 74 68 65  /* done with the
21150 20 73 6f 75 72 63 65 20 64 62 20 73 6f 20 65 6e   source db so en
21160 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
21170 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  n */.        sql
21180 69 74 65 33 5f 65 78 65 63 28 73 72 63 64 62 32  ite3_exec(srcdb2
21190 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
211a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
211b0 20 20 20 20 2f 2a 20 7a 65 72 6f 20 6f 75 74 20      /* zero out 
211c0 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20  any old journal 
211d0 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20 20 20 20  clutter */.     
211e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
211f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  OK ){.        ch
21200 61 72 20 6a 50 61 74 68 5b 4d 41 58 50 41 54 48  ar jPath[MAXPATH
21210 4c 45 4e 2b 39 5d 3b 0a 20 20 20 20 20 20 20 20  LEN+9];.        
21220 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74 72 6c 63  int zLen = strlc
21230 70 79 28 6a 50 61 74 68 2c 20 70 46 69 6c 65 2d  py(jPath, pFile-
21240 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  >zPath, MAXPATHL
21250 45 4e 2b 39 29 3b 0a 20 20 20 20 20 20 20 20 69  EN+9);.        i
21260 66 28 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c  f( zLen<MAXPATHL
21270 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
21280 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20 20  size_t jLen;.   
21290 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
212a0 72 20 65 78 74 65 6e 73 69 6f 6e 73 5b 32 5d 5b  r extensions[2][
212b0 39 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20 22  9] = { "-wal", "
212c0 2d 6a 6f 75 72 6e 61 6c 22 20 2f 2a 20 22 2d 73  -journal" /* "-s
212d0 68 6d 22 20 2a 2f 20 7d 3b 0a 20 20 20 20 20 20  hm" */ };.      
212e0 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 73 72 63      int j = (src
212f0 57 61 6c 46 44 3c 30 29 3f 30 3a 31 3b 20 2f 2a  WalFD<0)?0:1; /*
21300 20 73 6b 69 70 20 74 68 65 20 77 61 6c 20 69 66   skip the wal if
21310 20 77 65 20 72 65 70 6c 61 63 65 64 20 69 74 20   we replaced it 
21320 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
21330 28 20 3b 20 6a 3c 32 3b 20 6a 2b 2b 20 29 7b 0a  ( ; j<2; j++ ){.
21340 20 20 20 20 20 20 20 20 20 20 20 20 6a 4c 65 6e              jLen
21350 20 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61 74   = strlcpy(&jPat
21360 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73 69  h[zLen], extensi
21370 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20 20  ons[j], 9);.    
21380 20 20 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e          if( jLen
21390 20 3c 20 39 20 29 7b 0a 20 20 20 20 20 20 20 20   < 9 ){.        
213a0 20 20 20 20 20 20 69 6e 74 20 6a 66 64 20 3d 20        int jfd = 
213b0 6f 70 65 6e 28 6a 50 61 74 68 2c 20 4f 5f 54 52  open(jPath, O_TR
213c0 55 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  UNC);.          
213d0 20 20 20 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31      if( jfd==(-1
213e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
213f0 20 20 20 20 20 69 66 20 28 20 65 72 72 6e 6f 21       if ( errno!
21400 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 70 65 72               per
21420 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20  ror(jPath);.    
21430 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21440 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
21450 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
21460 20 20 20 20 20 66 73 79 6e 63 28 6a 66 64 29 3b       fsync(jfd);
21470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21480 20 63 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20   close(jfd);.   
21490 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
214a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
214b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
214c0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
214d0 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69  pMethod->xSync(i
214e0 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  d, SQLITE_SYNC_F
214f0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
21500 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 72 65 70      .    end_rep
21510 6c 61 63 65 5f 64 61 74 61 62 61 73 65 3a 0a 20  lace_database:. 
21520 20 20 20 20 20 69 66 28 20 70 53 72 63 42 74 72       if( pSrcBtr
21530 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
21540 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 72 63 64  lite3_close(srcd
21550 62 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b2);.        sql
21560 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21570 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 20  SrcBtree);.     
21580 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
21590 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72 63  _mutex_leave(src
215a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
215b0 20 20 69 66 28 20 69 73 44 73 74 43 6f 72 72 75    if( isDstCorru
215c0 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pt ){.        sq
215d0 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
215e0 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64  nlock_corrupt(id
215f0 2c 20 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65  , corruptDstFile
21600 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Lock);.      }el
21610 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
21620 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
21630 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ock(pLock);.    
21640 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
21650 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   rc;.    }.#endi
21660 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41  f /* (SQLITE_ENA
21670 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
21680 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
21690 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61  PLE__) */.    ca
216a0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
216b0 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a  SYNC_OMITTED: {.
216c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
216d0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f  ITE_OK;  /* A no
216e0 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  -op */.    }.  }
216f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21700 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
21710 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
21720 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
21730 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
21740 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
21750 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
21760 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
21770 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
21780 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
21790 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
217a0 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
217b0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
217c0 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
217d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
217e0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
217f0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
21800 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
21810 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
21820 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
21830 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
21840 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
21850 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
21860 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
21870 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
21880 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
21890 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
218a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
218b0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
218c0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
218d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
218e0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
218f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
21900 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
21910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21920 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
21930 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
21940 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
21950 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20  is always 0 for 
21960 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
21970 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
21980 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
21990 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
219a0 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
219b0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
219c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
219d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
219e0 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
219f0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
21a00 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
21a10 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
21a20 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
21a30 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
21a40 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
21a50 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
21a60 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
21a70 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
21a80 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
21a90 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
21aa0 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
21ab0 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
21ac0 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
21ad0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
21ae0 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
21af0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
21b00 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
21b10 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
21b20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
21b30 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
21b40 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
21b50 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
21b60 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
21b70 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
21b80 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
21b90 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
21ba0 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
21bb0 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
21bc0 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
21bd0 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
21be0 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
21bf0 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
21c00 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
21c10 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
21c20 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
21c30 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
21c40 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
21c50 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
21c60 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
21c70 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
21c80 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
21c90 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
21ca0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
21cb0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
21cc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
21cd0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
21ce0 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
21cf0 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
21d00 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
21d10 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
21d20 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
21d30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
21d40 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
21d50 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
21d60 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
21d70 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
21d80 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
21d90 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
21da0 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
21db0 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
21dc0 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
21dd0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
21de0 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
21df0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
21e00 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
21e10 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
21e20 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
21e30 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
21e40 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
21e50 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
21e60 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
21e70 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
21e80 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
21e90 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
21ea0 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
21eb0 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
21ec0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
21ed0 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
21ee0 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
21ef0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
21f00 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
21f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
21f20 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
21f30 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f50 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
21f60 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
21f70 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f90 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
21fa0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
21fb0 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21fd0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
21fe0 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
21ff0 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
22000 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
22010 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
22020 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
22030 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
22040 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
22050 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
22060 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
22070 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
22080 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22090 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
220a0 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
220b0 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
220c0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
220d0 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
220e0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
220f0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
22100 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22110 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
22120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22130 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
22140 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
22150 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
22160 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
22170 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
22180 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
22190 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
221b0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
221c0 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
221d0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
221e0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
221f0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
22200 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
22210 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
22220 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
22230 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
22240 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
22250 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
22260 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
22270 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
22280 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
22290 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
222a0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
222b0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
222c0 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
222d0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
222e0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
222f0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
22300 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
22310 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
22320 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
22330 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
22340 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
22350 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
22360 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
22370 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
22380 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
22390 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
223a0 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
223b0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
223c0 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
223d0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
223e0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
223f0 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
22400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22410 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
22420 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
22430 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
22440 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
22450 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
22460 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
22470 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
22480 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
22490 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
224a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
224b0 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  eld */.#ifdef SQ
224c0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
224d0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
224e0 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
224f0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
22500 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78   within its unix
22510 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
22520 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
22530 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
22540 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
22550 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
22560 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
22570 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
22580 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
22590 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
225a0 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
225b0 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
225c0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
225d0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
225e0 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
225f0 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
22600 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
22610 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
22620 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
22630 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
22640 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
22650 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
22660 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
22670 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
22680 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
22690 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
226a0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
226b0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
226c0 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c  Node, /* Apply l
226d0 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
226e0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
226f0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
22700 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
22710 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
22720 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
22730 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
22740 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
22750 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
22760 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
22770 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22790 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
227a0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
227b0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
227c0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
227d0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
227e0 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
227f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
22800 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65  LITE_OK;   /* Re
22810 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
22820 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
22830 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
22840 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
22850 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
22860 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
22870 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22880 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
22890 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  mNode->mutex) ||
228a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
228b0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72  =0 );..  /* Shar
228c0 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73  ed locks never s
228d0 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  pan more than on
228e0 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65  e byte */.  asse
228f0 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b  rt( n==1 || lock
22900 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b  Type!=F_RDLCK );
22910 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65  ..  /* Locks are
22920 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f   within range */
22930 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
22940 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  && n<SQLITE_SHM_
22950 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
22960 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
22970 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
22980 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
22990 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
229a0 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20    memset(&f, 0, 
229b0 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20  sizeof(f));.    
229c0 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54  f.l_type = lockT
229d0 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65  ype;.    f.l_whe
229e0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
229f0 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20      f.l_start = 
22a00 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65  ofst;.    f.l_le
22a10 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d  n = n;..    rc =
22a20 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64   osFcntl(pShmNod
22a30 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
22a40 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
22a50 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
22a60 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
22a70 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
22a80 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
22a90 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
22aa0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
22ab0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
22ac0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
22ad0 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
22ae0 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
22af0 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
22b00 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
22b10 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
22b30 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
22b40 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
22b50 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
22b60 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
22b70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
22b80 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
22b90 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
22ba0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
22bb0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
22bc0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
22bd0 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
22be0 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
22bf0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
22c00 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
22c10 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
22c20 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
22c30 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
22c40 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  |= mask;.    }el
22c50 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
22c60 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
22c70 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
22c80 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
22c90 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
22ca0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
22cb0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
22cc0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
22cd0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
22ce0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
22cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
22d00 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
22d10 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
22d20 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66  CE(("unlock %d f
22d30 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
22d40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
22d50 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
22d60 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
22d70 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69  (("read-lock fai
22d80 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  led"));.    }els
22d90 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
22da0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
22db0 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
22dc0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
22dd0 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
22de0 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
22df0 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66   OSTRACE((" - af
22e00 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30  terwards %03x,%0
22e10 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
22e20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
22e30 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65  edMask, pShmNode
22e40 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
22e50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
22e60 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d  rn rc;        .}
22e70 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  .../*.** Purge t
22e80 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
22e90 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
22ea0 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
22eb0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
22ec0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
22ed0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
22ee0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
22ef0 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
22f00 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
22f10 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
22f20 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
22f30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
22f40 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
22f50 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
22f60 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
22f70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
22f80 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
22f90 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
22fa0 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
22fb0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
22fc0 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
22fd0 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
22fe0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
22ff0 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20   if( p->mutex ) 
23000 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
23010 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
23020 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
23030 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  nRegion; i++){. 
23040 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30       if( p->h>=0
23050 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e 6d   ){.        munm
23060 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ap(p->apRegion[i
23070 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b  ], p->szRegion);
23080 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23090 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
230a0 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ee(p->apRegion[i
230b0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
230c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
230d0 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b  ee(p->apRegion);
230e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30  .    if( p->h>=0
230f0 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
23100 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68  _close(pFd, p->h
23110 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
23120 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20     p->h = -1;.  
23130 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64    }.    p->pInod
23140 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e->pShmNode = 0;
23150 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23160 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  e(p);.  }.}..sta
23170 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
23180 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72  proxySharedMemor
23190 79 42 61 73 65 50 61 74 68 28 75 6e 69 78 46 69  yBasePath(unixFi
231a0 6c 65 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70  le *);../*.** Op
231b0 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
231c0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
231d0 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74  ed with open dat
231e0 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
231f0 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74  .  .** This part
23200 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74  icular implement
23210 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70  ation uses mmapp
23220 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
23230 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  The file used to
23240 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65   implement share
23250 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74  d-memory is in t
23260 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
23270 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e  y.** as the open
23280 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
23290 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
232a0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e  name as the open
232b0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
232c0 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d  e with the "-shm
232d0 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20  " suffix added. 
232e0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
232f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23300 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f  le.** is "/home/
23310 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22  user1/config.db"
23320 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74   then the file t
23330 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61  hat is created a
23340 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f  nd mmapped.** fo
23350 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
23360 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22  will be called "
23370 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
23380 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a  ig.db-shm".  .**
23390 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72  .** Another appr
233a0 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73  oach to is to us
233b0 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f  e files in /dev/
233c0 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20  shm or /dev/tmp 
233d0 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74  or an.** some ot
233e0 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e  her tmpfs mount.
233f0 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69   But if a file i
23400 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
23410 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20  rectory.** from 
23420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23430 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  e is used, then 
23440 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73  differing access
23450 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
23460 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69  or a chroot() mi
23470 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69  ght cause two di
23480 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65  fferent processe
23490 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
234a0 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64   database to end
234b0 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72   up using differ
234c0 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68  ent files for sh
234d0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a  ared memory - .*
234e0 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  * meaning that t
234f0 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c  heir memory woul
23500 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  d not really be 
23510 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69  shared - resulti
23520 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  ng.** in databas
23530 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e  e corruption.  N
23540 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69  evertheless, thi
23550 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61  s tmpfs file usa
23560 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61  ge.** can be ena
23570 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
23580 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c  time using -DSQL
23590 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
235a0 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20  Y="/dev/shm".** 
235b0 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
235c0 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74  t.  The use of t
235d0 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
235e0 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
235f0 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72  time.** option r
23600 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63  esults in an inc
23610 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20  ompatible build 
23620 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c  of SQLite;  buil
23630 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20  ds of SQLite.** 
23640 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72  that with differ
23650 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  ing SQLITE_SHM_D
23660 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67  IRECTORY setting
23670 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  s attempt to use
23680 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74   the.** same dat
23690 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
236a0 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74  e same time, dat
236b0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
236c0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
236d0 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49  result. The SQLI
236e0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
236f0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
23700 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  tion is consider
23710 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74  ed.** "unsupport
23720 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61  ed" and may go a
23730 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20  way in a future 
23740 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a  SQLite release..
23750 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
23760 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
23770 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
23780 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
23790 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
237a0 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
237b0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
237c0 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
237d0 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
237e0 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
237f0 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
23800 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
23810 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
23820 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  er cleared..**.*
23830 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
23840 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
23850 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67  (pDbFd) is using
23860 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22   the "unix-excl"
23870 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61   VFS.** that mea
23880 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75  ns that an exclu
23890 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c  sive lock is hel
238a0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
238b0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
238c0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
238d0 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74  esses are able t
238e0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
238f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
23900 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20  n.** that case, 
23910 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  we do not really
23920 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d   need shared mem
23930 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20  ory.  No shared 
23940 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69  memory.** file i
23950 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
23960 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
23970 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20  ll be simulated 
23980 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79  with heap memory
23990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
239a0 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
239b0 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  mory(unixFile *p
239c0 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
239d0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20  unixShm *p = 0; 
239e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
239f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
23a00 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
23a10 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
23a20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  *pShmNode;   /* 
23a30 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
23a40 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
23a50 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
23a80 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
23a90 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
23aa0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64       /* The inod
23ab0 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61  e of fd */.  cha
23ac0 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  r *zShmFilename;
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ae0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
23af0 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
23b00 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
23b10 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
23b20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
23b30 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
23b40 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
23b50 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
23b60 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
23b70 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
23b80 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
23b90 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
23ba0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
23bb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
23bc0 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
23bd0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
23be0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
23bf0 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
23c00 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
23c10 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
23c20 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
23c30 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e  exists. Reuse an
23c40 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
23c50 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43  ne if present. C
23c60 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
23c70 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
23c80 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
23c90 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
23ca0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
23cb0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
23cc0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
23cd0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
23ce0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
23cf0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
23d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
23d10 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
23d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
23d30 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73  ..    /* Call fs
23d40 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  tat() to figure 
23d50 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69  out the permissi
23d60 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ons on the datab
23d70 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20  ase file. If.   
23d80 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20   ** a new *-shm 
23d90 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
23da0 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c   an attempt will
23db0 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61   be made to crea
23dc0 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74  te it.    ** wit
23dd0 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  h the same permi
23de0 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75  ssions. The actu
23df0 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74  al permissions t
23e00 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  he file is creat
23e10 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  ed.    ** with a
23e20 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  re subject to th
23e30 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20  e current umask 
23e40 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
23e50 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
23e60 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
23e70 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72  ) && pInode->bPr
23e80 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
23e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23ea0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
23eb0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
23ec0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
23ed0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23ee0 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64  BasePath = pDbFd
23ef0 2d 3e 7a 50 61 74 68 3b 0a 23 69 66 20 64 65 66  ->zPath;.#if def
23f00 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
23f10 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
23f20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
23f30 20 20 20 2f 2a 20 49 66 20 70 44 62 46 64 20 69     /* If pDbFd i
23f40 73 20 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74  s configured wit
23f50 68 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  h proxy locking 
23f60 6d 6f 64 65 2c 20 75 73 65 20 74 68 65 20 6c 6f  mode, use the lo
23f70 63 61 6c 20 0a 20 20 20 20 20 2a 2a 20 6c 6f 63  cal .     ** loc
23f80 6b 20 66 69 6c 65 20 70 61 74 68 20 74 6f 20 64  k file path to d
23f90 65 74 65 72 6d 69 6e 65 20 74 68 65 20 2d 73 68  etermine the -sh
23fa0 6d 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20  m file path.    
23fb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 50 72   */.    if( isPr
23fc0 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
23fd0 44 62 46 64 29 20 29 7b 0a 20 20 20 20 20 20 7a  DbFd) ){.      z
23fe0 42 61 73 65 50 61 74 68 20 3d 20 70 72 6f 78 79  BasePath = proxy
23ff0 53 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65  SharedMemoryBase
24000 50 61 74 68 28 70 44 62 46 64 29 3b 0a 20 20 20  Path(pDbFd);.   
24010 20 20 20 69 66 28 20 21 7a 42 61 73 65 50 61 74     if( !zBasePat
24020 68 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  h ){.        rc 
24030 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
24040 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
24050 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
24060 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
24070 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
24080 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
24090 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68  IRECTORY.    nSh
240a0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65  mFilename = size
240b0 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  of(SQLITE_SHM_DI
240c0 52 45 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23  RECTORY) + 30;.#
240d0 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c  else.    nShmFil
240e0 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74  ename = 5 + (int
240f0 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74  )strlen(zBasePat
24100 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
24110 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
24120 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
24130 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
24140 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
24150 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
24160 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
24170 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
24180 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
24190 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
241a0 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
241b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
241c0 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53 68  mNode));.    zSh
241d0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d  mFilename = pShm
241e0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
241f0 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
24200 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
24210 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
24220 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
24230 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
24240 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
24250 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
24260 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
24270 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
24280 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
24290 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
242a0 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
242b0 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
242c0 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
242d0 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
242e0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
242f0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
24300 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
24310 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20   zBasePath);.   
24320 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
24330 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
24340 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
24350 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
24360 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
24370 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
24380 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
24390 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
243a0 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
243b0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
243c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
243d0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
243e0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
243f0 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
24400 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
24410 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
24420 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
24430 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
24440 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
24450 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
24460 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
24470 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   ){.      pShmNo
24480 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f  de->h = robust_o
24490 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  pen(zShmFilename
244a0 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
244b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244d0 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20   (sStat.st_mode 
244e0 26 20 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20  & 0777));.      
244f0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  if( pShmNode->h<
24500 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
24510 73 74 20 63 68 61 72 20 2a 7a 52 4f 3b 0a 20 20  st char *zRO;.  
24520 20 20 20 20 20 20 7a 52 4f 20 3d 20 73 71 6c 69        zRO = sqli
24530 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
24540 72 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  r(pDbFd->zPath, 
24550 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 29 3b  "readonly_shm");
24560 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 52 4f  .        if( zRO
24570 20 26 26 20 73 71 6c 69 74 65 33 47 65 74 42 6f   && sqlite3GetBo
24580 6f 6c 65 61 6e 28 7a 52 4f 29 20 29 7b 0a 20 20  olean(zRO) ){.  
24590 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
245a0 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65  ->h = robust_ope
245b0 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  n(zShmFilename, 
245c0 4f 5f 52 44 4f 4e 4c 59 2c 0a 20 20 20 20 20 20  O_RDONLY,.      
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
245f0 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
24600 37 37 37 29 29 3b 0a 20 20 20 20 20 20 20 20 20  777));.         
24610 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
24620 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
24630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
24640 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
24650 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24660 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
24670 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
24680 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d  PT, "open", zShm
24690 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
246a0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
246b0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20  en_err;.        
246c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  }.      }.  .   
246d0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
246e0 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
246f0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
24700 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
24710 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49  itch..      ** I
24720 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
24730 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
24740 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20   length. .      
24750 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
24760 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
24770 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  f( unixShmSystem
24780 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
24790 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
247a0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
247b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
247c0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
247d0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
247e0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
247f0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
24800 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
24810 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
24820 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
24830 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  me);.        }el
24840 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
24850 20 49 66 20 72 75 6e 6e 69 6e 67 20 61 73 20 72   If running as r
24860 6f 6f 74 20 73 65 74 20 74 68 65 20 75 69 64 2f  oot set the uid/
24870 67 69 64 20 6f 66 20 74 68 65 20 73 68 6d 20 66  gid of the shm f
24880 69 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ile to match the
24890 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
248a0 20 20 20 20 20 20 20 75 69 64 5f 74 20 65 75 69         uid_t eui
248b0 64 20 3d 20 67 65 74 65 75 69 64 28 29 3b 0a 20  d = geteuid();. 
248c0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 75 69           if( eui
248d0 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d 73  d==0 && (euid!=s
248e0 53 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c 20 67  Stat.st_uid || g
248f0 65 74 65 67 69 64 28 29 21 3d 73 53 74 61 74 2e  etegid()!=sStat.
24900 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20 20 20  st_gid) ){.     
24910 20 20 20 20 20 20 20 69 66 28 20 66 63 68 6f 77         if( fchow
24920 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  n(pShmNode->h, s
24930 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74  Stat.st_uid, sSt
24940 61 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20  at.st_gid) ){.  
24950 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
24960 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
24970 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20  MOPEN;.         
24980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
24990 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
249a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
249b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
249c0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
249d0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
249e0 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
249f0 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
24a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24a10 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
24a20 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
24a30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
24a40 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
24a50 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
24a60 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
24a70 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
24a80 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
24a90 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
24aa0 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
24ab0 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
24ac0 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
24ad0 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
24ae0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
24af0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
24b00 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
24b10 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
24b20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
24b30 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
24b40 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
24b50 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
24b60 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
24b70 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
24b80 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
24b90 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
24ba0 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
24bb0 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
24bc0 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
24bd0 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
24be0 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
24bf0 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
24c00 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
24c10 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
24c20 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
24c30 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
24c40 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
24c50 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
24c60 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
24c70 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
24c80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
24c90 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
24ca0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
24cb0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
24cc0 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
24cd0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
24ce0 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
24cf0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
24d00 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
24d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24d20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
24d30 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
24d40 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
24d50 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
24d60 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
24d70 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
24d80 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
24d90 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
24da0 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
24db0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
24dc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24dd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24de0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
24df0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
24e00 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
24e10 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
24e20 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
24e30 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
24e40 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
24e50 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
24e60 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
24e70 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
24e80 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
24e90 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
24ea0 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
24eb0 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
24ec0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
24ed0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
24ee0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
24ef0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
24f00 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
24f10 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
24f20 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20   if the bExtend 
24f30 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
24f40 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
24f50 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
24f60 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
24f70 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
24f80 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
24f90 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
24fa0 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
24fb0 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
24fc0 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
24fd0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
24fe0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
24ff0 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20   If .** bExtend 
25000 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
25010 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
25020 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
25030 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
25040 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
25050 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
25060 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
25070 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
25080 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
25090 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
250a0 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
250b0 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
250c0 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
250d0 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
250e0 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
250f0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
25100 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
25110 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
25120 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
25130 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
25140 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
25150 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
25160 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
25170 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
25180 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
25190 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
251a0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
251b0 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
251c0 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
251d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
251e0 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
251f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25200 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
25210 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
25220 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
25230 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
25240 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
25250 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20  nt bExtend,     
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25270 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
25280 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
25290 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
252a0 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
252b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
252c0 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
252d0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
252e0 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
252f0 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d  e*)fd;.  unixShm
25300 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f   *p;.  unixShmNo
25310 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
25320 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25330 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  OK;..  /* If the
25340 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
25350 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
25360 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
25370 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69  n it now. */.  i
25380 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  f( pDbFd->pShm==
25390 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  0 ){.    rc = un
253a0 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
253b0 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
253c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
253d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
253e0 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  }..  p = pDbFd->
253f0 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  pShm;.  pShmNode
25400 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
25410 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
25420 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
25430 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
25440 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
25450 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
25460 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
25470 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ion==0 );.  asse
25480 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
25490 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
254a0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
254b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
254c0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
254d0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
254e0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
254f0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
25500 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
25510 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
25520 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
25530 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
25540 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ion ){.    char 
25550 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20  **apNew;        
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25570 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20   New apRegion[] 
25580 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
25590 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
255a0 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  n+1)*szRegion;  
255b0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
255c0 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
255d0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
255e0 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
255f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
25600 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20  by fstat() */.. 
25610 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
25620 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
25630 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ;..    if( pShmN
25640 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
25650 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
25660 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
25670 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
25680 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
25690 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
256a0 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
256b0 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
256c0 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
256d0 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
256e0 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20  x file is.      
256f0 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
25700 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
25710 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
25720 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25730 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68   if( osFstat(pSh
25740 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74  mNode->h, &sStat
25750 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
25760 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
25770 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  HMSIZE;.        
25780 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
25790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
257a0 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f     if( sStat.st_
257b0 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20  size<nByte ){.  
257c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
257d0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
257e0 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
257f0 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20  ist. If bExtend 
25800 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
25810 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74    ** false, exit
25820 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
25830 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
25840 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
25850 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20  turned..        
25860 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c  **.        ** Al
25870 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
25880 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
25890 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
258a0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
258b0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
258c0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
258d0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
258e0 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78          if( !bEx
258f0 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68 6d 70  tend ) goto shmp
25900 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
25910 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
25920 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
25930 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  h, nByte) ){.   
25940 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
25950 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
25960 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22  IOERR_SHMSIZE, "
25970 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20 20 20  ftruncate",.    
25980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25990 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
259a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
259b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
259c0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
259d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
259e0 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
259f0 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
25a00 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
25a10 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
25a20 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
25a30 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61      apNew = (cha
25a40 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  r **)sqlite3_rea
25a50 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53  lloc(.        pS
25a60 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
25a70 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
25a80 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20  zeof(char *).   
25a90 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
25aa0 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
25ab0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
25ac0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
25ad0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
25ae0 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
25af0 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  >apRegion = apNe
25b00 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53 68  w;.    while(pSh
25b10 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
25b20 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20  iRegion){.      
25b30 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20  void *pMem;.    
25b40 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
25b50 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
25b60 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73  pMem = mmap(0, s
25b70 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20  zRegion,.       
25b80 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
25b90 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54  sReadonly ? PROT
25ba0 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41  _READ : PROT_REA
25bb0 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20  D|PROT_WRITE, . 
25bc0 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53             MAP_S
25bd0 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d  HARED, pShmNode-
25be0 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  >h, pShmNode->nR
25bf0 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20  egion*szRegion. 
25c00 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
25c10 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f    if( pMem==MAP_
25c20 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
25c30 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
25c40 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
25c50 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70  RR_SHMMAP, "mmap
25c60 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  ", pShmNode->zFi
25c70 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
25c80 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
25c90 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
25ca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25cb0 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74      pMem = sqlit
25cc0 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69  e3_malloc(szRegi
25cd0 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  on);.        if(
25ce0 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   pMem==0 ){.    
25cf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25d00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
25d10 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
25d20 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
25d30 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d         memset(pM
25d40 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29  em, 0, szRegion)
25d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25d60 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
25d70 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
25d80 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20  gion] = pMem;.  
25d90 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
25da0 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
25db0 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
25dc0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
25dd0 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
25de0 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
25df0 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
25e00 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
25e10 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
25e20 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
25e30 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
25e40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
25e50 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
25e60 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
25e70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
25e80 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25ea0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
25eb0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
25ec0 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
25ed0 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
25ee0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
25ef0 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
25f00 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
25f10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
25f20 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
25f30 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
25f40 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
25f50 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
25f60 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
25f70 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
25f80 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
25f90 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
25fa0 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
25fb0 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
25fc0 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
25fd0 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
25fe0 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
25ff0 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
26000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
26010 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
26020 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
26030 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
26040 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
26050 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
26060 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26080 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
26090 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
260a0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
260b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
260c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
260d0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
260e0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
260f0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26110 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
26120 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
26130 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
26140 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
26150 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
26160 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
26170 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
26180 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
26190 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
261a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
261b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
261c0 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
261d0 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
26200 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
26210 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
26220 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
26230 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
26240 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
26250 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
26260 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26270 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
26280 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
26290 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
262a0 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
262d0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
262e0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
262f0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
26300 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
26310 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
26320 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
26330 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
26340 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
26350 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
26360 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
26370 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
26380 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
26390 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
263a0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
263b0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
263c0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
263d0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
263e0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
263f0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
26400 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
26410 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
26420 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
26430 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
26440 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
26450 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
26460 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
26470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
26480 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
26490 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
264a0 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  VE)!=0 );.  asse
264b0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
264c0 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
264d0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
264e0 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
264f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
26500 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
26510 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
26520 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
26530 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
26540 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
26550 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
26560 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
26570 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
26580 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
26590 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
265a0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
265b0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
265c0 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
265d0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
265e0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
265f0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
26600 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
26610 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
26620 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
26630 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
26640 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
26650 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
26660 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
26670 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26680 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
26690 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
266a0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
266b0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
266c0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
266d0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
266e0 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
266f0 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
26700 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
26710 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
26720 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
26730 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
26740 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b  ShmNode, F_UNLCK
26750 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
26760 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
26770 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
26780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
26790 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
267a0 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
267b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
267c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
267d0 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
267e0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
267f0 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
26800 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
26810 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
26820 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
26830 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
26840 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
26850 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
26860 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
26870 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
26880 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
26890 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
268a0 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
268b0 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
268c0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
268d0 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
268e0 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
268f0 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
26900 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
26910 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
26920 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
26930 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
26940 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
26950 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
26960 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
26970 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
26980 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
26990 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
269a0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
269b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
269c0 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
269d0 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
269e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
269f0 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
26a00 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
26a10 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
26a20 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
26a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26a40 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
26a50 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
26a60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
26a70 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
26a80 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43  pShmNode, F_RDLC
26a90 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
26aa0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
26ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
26ae0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
26af0 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
26b00 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
26b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26b20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
26b30 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
26b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
26b50 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
26b60 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
26b70 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
26b80 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
26b90 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
26ba0 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
26bb0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
26bc0 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
26bd0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
26be0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
26bf0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
26c00 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
26c10 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
26c20 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
26c30 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
26c40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
26c50 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
26c60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26c70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
26c80 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
26c90 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
26ca0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
26cb0 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
26cc0 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
26cd0 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
26ce0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
26cf0 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
26d00 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
26d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26d20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
26d30 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
26d40 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  de, F_WRLCK, ofs
26d50 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
26d60 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
26d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26d80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26d90 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
26da0 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
26db0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
26dc0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
26dd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
26de0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
26df0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
26e00 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
26e10 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
26e20 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
26e30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
26e40 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
26e50 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65  tpid(), p->share
26e60 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
26e70 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
26e80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
26e90 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
26ea0 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
26eb0 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
26ec0 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
26ed0 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
26ee0 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
26ef0 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
26f00 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
26f10 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
26f20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
26f30 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
26f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26f50 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
26f60 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
26f70 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
26f80 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
26f90 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
26fa0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
26fb0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
26fc0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e  AMETER(fd);.  un
26fd0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
26fe0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
26ff0 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
27000 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
27010 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
27020 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
27030 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
27040 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
27050 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
27060 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
27070 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
27080 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
27090 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
270a0 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
270b0 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
270c0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
270d0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
270e0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
270f0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
27100 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
27110 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
27120 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
27130 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
27140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
27150 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
27160 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
27170 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27190 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
271a0 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
271b0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
271c0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
271d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
271e0 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
271f0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
27200 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
27230 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
27240 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
27250 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27270 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
27280 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
27290 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
272a0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
272b0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
272c0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
272d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
272e0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
272f0 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
27300 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
27310 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
27320 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
27330 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
27340 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
27350 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
27360 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
27370 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
27380 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
27390 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
273a0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
273b0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
273c0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
273d0 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
273e0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
273f0 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
27400 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
27410 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
27420 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
27430 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
27440 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27450 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
27460 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
27470 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
27480 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
27490 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
274a0 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
274b0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
274c0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
274d0 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
274e0 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
274f0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
27500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
27510 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
27520 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
27530 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
27540 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
27550 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
27560 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
27570 68 3e 3d 30 20 29 20 75 6e 6c 69 6e 6b 28 70 53  h>=0 ) unlink(pS
27580 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
27590 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50  e);.    unixShmP
275a0 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d  urge(pDbFd);.  }
275b0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
275c0 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
275d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65  QLITE_OK;.}...#e
275e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
275f0 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  xShmMap     0.# 
27600 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f  define unixShmLo
27610 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
27620 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20   unixShmBarrier 
27630 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
27640 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
27650 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
27660 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
27670 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
27680 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
27690 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
276a0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
276b0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
276c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
276d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
276e0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
276f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27700 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
27710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27750 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
27760 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
27770 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
27780 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
27790 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
277a0 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
277b0 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
277c0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
277d0 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
277e0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
277f0 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
27800 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
27810 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
27820 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
27830 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
27840 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
27850 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
27860 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
27870 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
27880 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
27890 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
278a0 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
278b0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
278c0 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
278d0 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
278e0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
278f0 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
27900 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
27910 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
27920 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
27930 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
27940 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
27950 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
27960 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
27970 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
27980 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
27990 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
279a0 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
279b0 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
279c0 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
279d0 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
279e0 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
279f0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
27a00 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
27a10 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
27a20 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
27a30 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
27a40 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
27a50 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
27a60 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
27a70 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
27a80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
27a90 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
27aa0 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
27ab0 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
27ac0 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
27ad0 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
27ae0 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
27af0 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
27b00 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
27b10 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
27b20 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
27b30 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
27b40 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
27b50 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
27b60 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
27b70 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
27b80 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
27b90 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
27ba0 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
27bb0 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
27bc0 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
27bd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
27be0 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
27bf0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
27c00 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
27c10 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
27c20 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
27c30 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
27c40 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
27c50 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
27c60 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
27c70 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
27c80 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
27c90 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
27ca0 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
27cb0 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
27cc0 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
27cd0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
27ce0 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
27cf0 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
27d00 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
27d10 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20  OCK, CKLOCK)    
27d20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
27d30 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27d40 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d70 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20   \.   VERSION,  
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d90 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
27da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dc0 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27de0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
27e10 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27e60 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e80 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
27eb0 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27ed0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
27f00 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27f20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f40 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
27f50 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
27f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
27f70 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
27fa0 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
27fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
27fc0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fe0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
27ff0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
28000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
28010 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
28040 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
28050 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
28060 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
28070 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28080 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28090 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
280a0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
280b0 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
280e0 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
280f0 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
28100 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
28130 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
28140 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
28150 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
28160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28170 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
28180 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
28190 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
281a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c     \.   unixShmL
281d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
281e0 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
281f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28210 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61    \.   unixShmBa
28220 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
28230 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
28240 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
28250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28260 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d   \.   unixShmUnm
28270 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
28280 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
28290 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282b0 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28300 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
28310 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28320 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
28330 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
28340 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
28350 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28360 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
28370 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
283a0 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
28440 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
28450 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
28460 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
28470 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
28480 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
28490 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
284a0 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
284b0 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
284c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
284d0 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
284e0 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
284f0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
28500 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
28510 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
28520 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
28530 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
28540 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
28550 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
28560 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
28570 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
28580 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
28590 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
285a0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
285b0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
285c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20   name */.  2,   
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285e0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
285f0 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64  emory is enabled
28600 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
28630 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
28660 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28680 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
28690 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
286a0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
286b0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
286c0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
286d0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  ).IOMETHODS(.  n
286e0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  olockIoFinder,  
286f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
28700 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
28710 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65   */.  nolockIoMe
28720 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
28730 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
28740 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
28750 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
28780 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
28790 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
287b0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
287c0 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
287e0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
287f0 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
28800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28810 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
28820 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
28830 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20  servedLock   /* 
28840 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
28850 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
28860 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
28870 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
28880 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
28890 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
288a0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
288b0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
288c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
288d0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
288e0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28900 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
28910 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
28920 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
28930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28940 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
28950 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
28960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
28970 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
28980 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
28990 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
289a0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
289b0 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
289c0 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68  rvedLock  /* xCh
289d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
289e0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
289f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
28a00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
28a10 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45  !OS_VXWORKS.IOME
28a20 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
28a30 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
28a40 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
28a50 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
28a60 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
28a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
28a80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28a90 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
28aa0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
28ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
28ac0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
28ad0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
28ae0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
28af0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
28b00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
28b10 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
28b20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
28b30 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
28b40 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
28b50 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
28b60 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
28b70 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
28b80 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
28b90 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
28ba0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
28bb0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
28bc0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
28bd0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
28be0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
28bf0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
28c00 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
28c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
28c20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28c30 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
28c40 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28c60 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
28c70 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
28c80 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20   semClose,      
28c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28ca0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
28cb0 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20   semLock,       
28cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
28cd0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28ce0 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  semUnlock,      
28cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
28d00 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
28d10 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
28d20 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
28d30 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28d40 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
28d50 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
28d60 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
28d70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28d80 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
28d90 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e  HODS(.  afpIoFin
28da0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
28db0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
28dc0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61  tion name */.  a
28dd0 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fpIoMethods,    
28de0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
28df0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28e00 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
28e10 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
28e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
28e30 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
28e40 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43  sabled */.  afpC
28e50 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
28e60 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
28e70 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c  method */.  afpL
28e80 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
28e90 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
28ea0 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e  ethod */.  afpUn
28eb0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
28ec0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
28ed0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43  method */.  afpC
28ee0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28ef0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
28f00 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
28f10 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
28f20 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
28f30 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
28f40 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
28f50 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
28f60 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
28f70 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
28f80 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
28f90 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
28fa0 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
28fb0 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
28fc0 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
28fd0 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
28fe0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
28ff0 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
29000 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
29010 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
29020 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
29030 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
29040 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
29050 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
29060 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
29070 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
29080 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
29090 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
290a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
290b0 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
290c0 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
290d0 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
290e0 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
290f0 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
29100 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
29110 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29120 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29130 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
29140 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
29150 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
29160 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
29170 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
29180 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
29190 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
291a0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
291b0 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
291c0 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
291d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
291e0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
291f0 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
29200 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
29210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
29220 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
29230 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
29240 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
29250 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29260 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29270 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20  me */.  2,      
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29290 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
292a0 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ry is enabled */
292b0 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20  .  proxyClose,  
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292d0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
292e0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20  .  proxyLock,   
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29300 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
29310 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20    proxyUnlock,  
29320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29330 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29340 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  .  proxyCheckRes
29350 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20  ervedLock    /* 
29360 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29370 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
29380 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f  endif../* nfs lo
29390 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b  ckd on OSX 10.3+
293a0 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77   doesn't clear w
293b0 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20  rite locks when 
293c0 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
293d0 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  et */.#if define
293e0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
293f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29400 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
29410 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69  THODS(.  nfsIoFi
29420 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
29430 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29440 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29450 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20   nfsIoMethods,  
29460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29470 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29480 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29490 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
294b0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
294c0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
294d0 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
294e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
294f0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
29500 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
29510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29520 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29530 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   nfsUnlock,     
29540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29550 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29560 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
29570 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
29580 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29590 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
295a0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
295b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
295c0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
295d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
295e0 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
295f0 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
29600 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
29610 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
29620 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
29630 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
29640 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
29650 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
29660 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
29670 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
29680 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
29690 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
296a0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
296b0 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79   for MacOSX only
296c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
296d0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
296e0 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
296f0 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
29700 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
29710 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
29720 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
29730 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
29740 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
29750 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f    /* open file o
29760 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61  bject for the da
29770 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
29780 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
29790 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
297a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
297b0 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20   *zFilesystem;  
297c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
297d0 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e  ilesystem type n
297e0 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ame */.    const
297f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29800 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20  ods *pMethods;  
29810 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20   /* Appropriate 
29820 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a  locking method *
29830 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b  /.  } aMap[] = {
29840 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20  .    { "hfs",   
29850 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
29860 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c   },.    { "ufs",
29870 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
29880 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  ods },.    { "af
29890 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  pfs",  &afpIoMet
298a0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73  hods },.    { "s
298b0 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  mbfs",  &afpIoMe
298c0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
298d0 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b  webdav", &nolock
298e0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
298f0 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
29900 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
29910 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
29920 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
29930 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
29940 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
29950 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
29960 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
29970 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
29980 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
29990 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
299a0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
299b0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
299c0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
299d0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
299e0 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  }.  if( statfs(f
299f0 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
29a00 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
29a10 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
29a20 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
29a30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
29a40 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
29a50 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
29a60 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  =0; aMap[i].zFil
29a70 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  esystem; i++){. 
29a80 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
29a90 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
29aa0 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  ame, aMap[i].zFi
29ab0 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a  lesystem)==0 ){.
29ac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
29ad0 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b  Map[i].pMethods;
29ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29af0 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74   }..  /* Default
29b00 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20   case. Handles, 
29b10 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20  amongst others, 
29b20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74  "nfs"..  ** Test
29b30 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
29b40 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20   using fcntl(). 
29b50 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63  If the call succ
29b60 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75  eeds, .  ** assu
29b70 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
29b80 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
29b90 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
29ba0 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  ks. .  */.  lock
29bb0 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
29bc0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
29bd0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
29be0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
29bf0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
29c00 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
29c10 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
29c20 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
29c30 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
29c40 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20  =-1 ) {.    if( 
29c50 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
29c60 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73  fstypename, "nfs
29c70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ")==0 ){.      r
29c80 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68  eturn &nfsIoMeth
29c90 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ods;.    } else 
29ca0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
29cb0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
29cc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
29cd0 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f     return &dotlo
29ce0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
29cf0 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
29d00 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29d10 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
29d20 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
29d30 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
29d40 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
29d50 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
29d60 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
29d70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
29d80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29d90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
29da0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20  .#if OS_VXWORKS 
29db0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29dc0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
29dd0 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
29de0 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
29df0 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
29e00 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
29e10 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
29e20 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
29e30 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
29e40 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
29e50 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
29e60 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
29e70 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
29e80 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
29e90 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
29ea0 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e  s for VXWorks on
29eb0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
29ec0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
29ed0 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
29ee0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
29ef0 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
29f00 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
29f10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
29f20 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
29f30 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
29f40 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20      /* the open 
29f50 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  file object */.)
29f60 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
29f70 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
29f80 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
29f90 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
29fa0 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
29fb0 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
29fc0 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
29fd0 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
29fe0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
29ff0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2a000 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2a010 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2a020 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
2a030 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
2a040 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
2a050 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
2a060 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
2a070 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
2a080 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
2a090 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
2a0a0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
2a0b0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
2a0c0 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
2a0d0 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
2a0e0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
2a0f0 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
2a100 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
2a110 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
2a120 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
2a130 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
2a140 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2a150 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
2a160 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65  {.    return &se
2a170 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  mIoMethods;.  }.
2a180 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
2a190 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a1a0 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
2a1b0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
2a1c0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2a1d0 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
2a1e0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
2a1f0 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
2a200 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45  ORKS && SQLITE_E
2a210 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2a220 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  YLE */../*.** An
2a230 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66   abstract type f
2a240 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
2a250 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64  a IO method find
2a260 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a  er function:.*/.
2a270 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71  typedef const sq
2a280 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a290 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29   *(*finder_type)
2a2a0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2a2b0 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a  xFile*);.../****
2a2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a300 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2a310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a320 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
2a330 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
2a340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a350 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
2a360 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
2a370 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
2a380 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
2a390 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
2a3a0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
2a3b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
2a3c0 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lize the content
2a3d0 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
2a3e0 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
2a3f0 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a  ted to by pId..*
2a400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2a410 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73  lInUnixFile(.  s
2a420 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2a430 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
2a440 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
2a450 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  */.  int h,     
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a470 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
2a480 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
2a490 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
2a4a0 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20 20 20  nt dirfd,       
2a4b0 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
2a4c0 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
2a4d0 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
2a4e0 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
2a4f0 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
2a500 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2a510 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2a520 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2a530 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
2a540 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2a550 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
2a560 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  noLock,         
2a570 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b      /* Omit lock
2a580 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ing if true */. 
2a590 20 69 6e 74 20 69 73 44 65 6c 65 74 65 2c 20 20   int isDelete,  
2a5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
2a5b0 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74  te on close if t
2a5c0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  rue */.  int isR
2a5d0 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20  eadOnly         
2a5e0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2a5f0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
2a600 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20  ead-only */.){. 
2a610 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a620 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b  o_methods *pLock
2a630 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
2a640 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
2a650 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
2a660 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a670 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2a680 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c  New->pInode==NUL
2a690 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d  L );..  /* Param
2a6a0 65 74 65 72 20 69 73 44 65 6c 65 74 65 20 69 73  eter isDelete is
2a6b0 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78   only used on vx
2a6c0 77 6f 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74  works. Express t
2a6d0 68 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a  his explicitly .
2a6e0 20 20 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65    ** here to pre
2a6f0 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61  vent compiler wa
2a700 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75  rnings about unu
2a710 73 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  sed parameters..
2a720 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41    */.  UNUSED_PA
2a730 52 41 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65  RAMETER(isDelete
2a740 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  );..  /* Usually
2a750 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e   the path zFilen
2a760 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ame should not b
2a770 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  e a relative pat
2a780 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20  hname. The.  ** 
2a790 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65  exception is whe
2a7a0 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72  n opening the pr
2a7b0 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65  oxy "conch" file
2a7c0 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a   in builds that.
2a7d0 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65    ** include the
2a7e0 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c   special Apple l
2a7f0 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20  ocking styles.. 
2a800 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2a810 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2a820 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2a830 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65  ING_STYLE.  asse
2a840 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
2a850 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
2a860 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56  =='/' .    || pV
2a870 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76  fs->pAppData==(v
2a880 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
2a890 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a  Finder );.#else.
2a8a0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2a8b0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
2a8c0 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23  ame[0]=='/' );.#
2a8d0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
2a8e0 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  (("OPEN    %-3d 
2a8f0 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  %s\n", h, zFilen
2a900 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68  ame));.  pNew->h
2a910 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69   = h;.  pNew->di
2a920 72 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 70  rfd = dirfd;.  p
2a930 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69  New->zPath = zFi
2a940 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65  lename;.  if( me
2a950 6d 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65  mcmp(pVfs->zName
2a960 2c 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29  ,"unix-excl",10)
2a970 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ==0 ){.    pNew-
2a980 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49  >ctrlFlags = UNI
2a990 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65  XFILE_EXCL;.  }e
2a9a0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  lse{.    pNew->c
2a9b0 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  trlFlags = 0;.  
2a9c0 7d 0a 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e  }.  if( isReadOn
2a9d0 6c 79 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ly ){.    pNew->
2a9e0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2a9f0 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  XFILE_RDONLY;.  
2aa00 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2aa10 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
2aa20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
2aa30 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
2aa40 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
2aa50 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d   ){.    noLock =
2aa60 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
2aa70 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
2aa80 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c  endif..  if( noL
2aa90 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
2aaa0 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f  ingStyle = &nolo
2aab0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2aac0 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  else{.    pLocki
2aad0 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69  ngStyle = (**(fi
2aae0 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d  nder_type*)pVfs-
2aaf0 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65  >pAppData)(zFile
2ab00 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66  name, pNew);.#if
2ab10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2ab20 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
2ab30 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e   /* Cache zFilen
2ab40 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ame in the locki
2ab50 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20  ng context (AFP 
2ab60 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72  and dotlock over
2ab70 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a  ride) for.    **
2ab80 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76   proxyLock activ
2ab90 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  ation is possibl
2aba0 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20  e (remote proxy 
2abb0 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e  is based on db n
2abc0 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c  ame).    ** zFil
2abd0 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61  ename remains va
2abe0 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69  lid until file i
2abf0 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70  s closed, to sup
2ac00 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77  port */.    pNew
2ac10 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2ac20 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e   = (void*)zFilen
2ac30 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ame;.#endif.  }.
2ac40 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  .  if( pLockingS
2ac50 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f  tyle == &posixIo
2ac60 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69  Methods.#if defi
2ac70 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2ac80 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2ac90 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2aca0 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79    || pLockingSty
2acb0 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68  le == &nfsIoMeth
2acc0 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ods.#endif.  ){.
2acd0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2ace0 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2acf0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2ad00 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2ad10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ad20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ad30 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2ad40 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64   occured in find
2ad50 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f  InodeInfo(), clo
2ad60 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
2ad70 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20  riptor.      ** 
2ad80 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66  immediately, bef
2ad90 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68  ore releasing th
2ada0 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f  e mutex. findIno
2adb0 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69  deInfo() may fai
2adc0 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77  l.      ** in tw
2add0 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20  o scenarios:.   
2ade0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
2adf0 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66   (a) A call to f
2ae00 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20  stat() failed.. 
2ae10 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20       **   (b) A 
2ae20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20  malloc failed.. 
2ae30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2ae40 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61   Scenario (b) ma
2ae50 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  y only occur if 
2ae60 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68  the process is h
2ae70 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a  olding no other.
2ae80 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65        ** file de
2ae90 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f  scriptors open o
2aea0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
2aeb0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f   If there were o
2aec0 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20  ther file.      
2aed0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  ** descriptors o
2aee0 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
2aef0 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c  n no malloc woul
2af00 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79  d be required by
2af10 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e  .      ** findIn
2af20 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68  odeInfo(). If th
2af30 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
2af40 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65  it is quite safe
2af50 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20   to close.      
2af60 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73  ** handle h - as
2af70 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2af80 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20  d that no posix 
2af90 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65  locks will be re
2afa0 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  leased.      ** 
2afb0 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20  by doing so..   
2afc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2afd0 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63  f scenario (a) c
2afe0 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20  aused the error 
2aff0 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20  then things are 
2b000 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65  not so safe. The
2b010 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63  .      ** implic
2b020 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65  it assumption he
2b030 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73  re is that if fs
2b040 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69  tat() fails, thi
2b050 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20  ngs are in.     
2b060 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61   ** such bad sha
2b070 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67  pe that dropping
2b080 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64   a lock or two d
2b090 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75  oesn't matter mu
2b0a0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
2b0b0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2b0c0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2b0d0 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  _);.      h = -1
2b0e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
2b0f0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2b100 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
2b110 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b120 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
2b130 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
2b140 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2b150 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
2b160 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
2b170 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2b180 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2b190 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2b1a0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2b1b0 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
2b1c0 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
2b1d0 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
2b1e0 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
2b1f0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2b200 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
2b210 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
2b220 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
2b230 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
2b240 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2b250 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2b260 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
2b270 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
2b280 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
2b290 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
2b2a0 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
2b2b0 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
2b2c0 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
2b2d0 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
2b2e0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
2b2f0 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
2b300 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
2b310 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
2b320 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
2b330 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
2b340 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
2b350 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
2b360 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
2b370 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2b380 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2b390 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2b3a0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2b3b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b3c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b3d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2b3e0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2b3f0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  t);.        robu
2b400 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2b410 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2b420 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2b430 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c     }.      unixL
2b440 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
2b450 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
2b460 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66  endif..  else if
2b470 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2b480 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
2b490 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
2b4a0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
2b4b0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2b4c0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2b4d0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2b4e0 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
2b4f0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
2b500 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
2b510 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
2b520 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
2b530 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d  .    nFilename =
2b540 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69   (int)strlen(zFi
2b550 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20  lename) + 6;.   
2b560 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68   zLockFile = (ch
2b570 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
2b580 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  loc(nFilename);.
2b590 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c      if( zLockFil
2b5a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
2b5b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2b5c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b5d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2b5e0 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c  tf(nFilename, zL
2b5f0 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f  ockFile, "%s" DO
2b600 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46  TLOCK_SUFFIX, zF
2b610 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
2b620 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
2b630 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b  gContext = zLock
2b640 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  File;.  }..#if O
2b650 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65  S_VXWORKS.  else
2b660 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
2b670 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68  le == &semIoMeth
2b680 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61  ods ){.    /* Na
2b690 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
2b6a0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2b6b0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2b6c0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
2b6d0 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
2b6e0 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e semLockingCont
2b6f0 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ext.    */.    u
2b700 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2b710 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
2b720 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2b730 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2b740 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
2b750 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e  E_OK) && (pNew->
2b760 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55  pInode->pSem==NU
2b770 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
2b780 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
2b790 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d  ew->pInode->aSem
2b7a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Name;.      int 
2b7b0 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
2b7c0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
2b7d0 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65  THNAME, zSemName
2b7e0 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20  , "/%s.sem",.   
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b800 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a      pNew->pId->z
2b810 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
2b820 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20        for( n=1; 
2b830 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b  zSemName[n]; n++
2b840 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   ).        if( z
2b850 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20  SemName[n]=='/' 
2b860 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20  ) zSemName[n] = 
2b870 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  '_';.      pNew-
2b880 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20  >pInode->pSem = 
2b890 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d  sem_open(zSemNam
2b8a0 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36  e, O_CREAT, 0666
2b8b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
2b8c0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2b8d0 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44  em == SEM_FAILED
2b8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b8f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b900 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e         pNew->pIn
2b910 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d  ode->aSemName[0]
2b920 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
2b930 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2b940 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2b950 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65  .#endif.  .  pNe
2b960 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  w->lastErrno = 0
2b970 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
2b980 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2b990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2b9a0 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
2b9b0 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2b9c0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20  INE__);.    h = 
2b9d0 2d 31 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a  -1;.    unlink(z
2b9e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
2b9f0 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d  sDelete = 0;.  }
2ba00 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74  .  pNew->isDelet
2ba10 65 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65  e = isDelete;.#e
2ba20 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
2ba30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ba40 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 72  if( dirfd>=0 ) r
2ba50 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2ba60 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
2ba70 5f 29 3b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30  _);.    if( h>=0
2ba80 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2ba90 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2baa0 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  _);.  }else{.   
2bab0 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
2bac0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a   pLockingStyle;.
2bad0 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
2bae0 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  +1);.  }.  retur
2baf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
2bb00 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  pen a file descr
2bb10 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72  iptor to the dir
2bb20 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
2bb30 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65  g file zFilename
2bb40 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
2bb50 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20  ul, *pFd is set 
2bb60 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
2bb70 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
2bb80 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  d.** SQLITE_OK i
2bb90 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2bba0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2bbb0 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f  either SQLITE_NO
2bbc0 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  MEM.** or SQLITE
2bbd0 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74  _CANTOPEN is ret
2bbe0 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69  urned and *pFd i
2bbf0 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65  s set to an unde
2bc00 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a  fined.** value..
2bc10 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
2bc20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
2bc30 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
2bc40 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c  sponsible for cl
2bc50 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c  osing.** the fil
2bc60 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46  e descriptor *pF
2bc70 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e  d using close().
2bc80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
2bc90 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
2bca0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2bcb0 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20  me, int *pFd){. 
2bcc0 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66   int ii;.  int f
2bcd0 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a  d = -1;.  char z
2bce0 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Dirname[MAX_PATH
2bcf0 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69  NAME+1];..  sqli
2bd00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
2bd10 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e  _PATHNAME, zDirn
2bd20 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ame, "%s", zFile
2bd30 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  name);.  for(ii=
2bd40 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72  (int)strlen(zDir
2bd50 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a  name); ii>1 && z
2bd60 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27  Dirname[ii]!='/'
2bd70 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69  ; ii--);.  if( i
2bd80 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e  i>0 ){.    zDirn
2bd90 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a  ame[ii] = '\0';.
2bda0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
2bdb0 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f  open(zDirname, O
2bdc0 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59  _RDONLY|O_BINARY
2bdd0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
2bde0 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44  >=0 ){.#ifdef FD
2bdf0 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 6f  _CLOEXEC.      o
2be00 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54  sFcntl(fd, F_SET
2be10 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  FD, osFcntl(fd, 
2be20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
2be30 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
2be40 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
2be50 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
2be60 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
2be70 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
2be80 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72    *pFd = fd;.  r
2be90 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c  eturn (fd>=0?SQL
2bea0 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72  ITE_OK:unixLogEr
2beb0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2bec0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
2bed0 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a  , zDirname));.}.
2bee0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2bef0 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  e name of a dire
2bf00 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74  ctory in which t
2bf10 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20  o put temporary 
2bf20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  files..** If no 
2bf30 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61  suitable tempora
2bf40 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72  ry file director
2bf50 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  y can be found, 
2bf60 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
2bf70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2bf80 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44  r *unixTempFileD
2bf90 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ir(void){.  stat
2bfa0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
2bfb0 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
2bfc0 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
2bfd0 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
2bfe0 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
2bff0 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
2c000 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
2c010 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
2c020 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
2c030 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
2c040 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
2c050 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
2c060 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ..  azDirs[0] = 
2c070 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2c080 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61  ectory;.  if( !a
2c090 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
2c0a0 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[1] = getenv("T
2c0b0 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69  MPDIR");.  for(i
2c0c0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
2c0d0 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
2c0e0 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44  rs[0]); zDir=azD
2c0f0 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69  irs[i++]){.    i
2c100 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e  f( zDir==0 ) con
2c110 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f  tinue;.    if( o
2c120 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66  sStat(zDir, &buf
2c130 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2c140 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
2c150 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
2c160 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c170 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30  osAccess(zDir, 0
2c180 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  7) ) continue;. 
2c190 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
2c1a0 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a  return zDir;.}..
2c1b0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
2c1c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
2c1d0 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
2c1e0 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
2c1f0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
2c200 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
2c210 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
2c220 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
2c230 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
2c240 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
2c250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2c260 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69  nixGetTempname(i
2c270 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2c280 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
2c290 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2c2a0 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
2c2b0 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
2c2c0 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
2c2d0 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
2c2e0 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
2c2f0 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
2c300 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2c310 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63   i, j;.  const c
2c320 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a  har *zDir;..  /*
2c330 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
2c340 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
2c350 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
2c360 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
2c370 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
2c380 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
2c390 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
2c3a0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
2c3b0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
2c3c0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
2c3d0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
2c3e0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2c3f0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
2c400 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d    zDir = unixTem
2c410 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66  pFileDir();.  if
2c420 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72  ( zDir==0 ) zDir
2c430 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68   = ".";..  /* Ch
2c440 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
2c450 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
2c460 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
2c470 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
2c480 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66  e .  ** name. If
2c490 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75   it is not, retu
2c4a0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
2c4b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72  .  */.  if( (str
2c4c0 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c  len(zDir) + strl
2c4d0 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  en(SQLITE_TEMP_F
2c4e0 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37  ILE_PREFIX) + 17
2c4f0 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75  ) >= (size_t)nBu
2c500 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2c510 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2c520 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  }..  do{.    sql
2c530 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2c540 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73  uf-17, zBuf, "%s
2c550 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
2c560 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
2c570 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73  ;.    j = (int)s
2c580 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
2c590 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2c5a0 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
2c5b0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2c5c0 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
2c5d0 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
2c5e0 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
2c5f0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
2c600 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
2c610 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
2c620 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
2c630 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f  = 0;.  }while( o
2c640 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d  sAccess(zBuf,0)=
2c650 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
2c660 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
2c670 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2c680 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2c690 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2c6a0 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
2c6b0 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2c6c0 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
2c6d0 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
2c6e0 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
2c6f0 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
2c700 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
2c710 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
2c720 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
2c730 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
2c740 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
2c750 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
2c760 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
2c770 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
2c780 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
2c790 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
2c7a0 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2c7b0 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
2c7c0 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
2c7d0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
2c7e0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
2c7f0 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
2c800 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
2c810 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
2c820 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
2c830 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
2c840 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
2c850 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
2c860 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
2c870 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
2c880 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2c890 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
2c8a0 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
2c8b0 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
2c8c0 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
2c8d0 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
2c8e0 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
2c8f0 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
2c900 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
2c910 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
2c920 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
2c930 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
2c940 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
2c950 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
2c960 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
2c970 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
2c980 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
2c990 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
2c9a0 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
2c9b0 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
2c9c0 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
2c9d0 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
2c9e0 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
2c9f0 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
2ca00 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
2ca10 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
2ca20 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
2ca30 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
2ca40 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2ca50 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
2ca60 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
2ca70 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
2ca80 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
2ca90 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
2caa0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2cab0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
2cac0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
2cad0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2cae0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
2caf0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2cb00 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
2cb10 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
2cb20 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2cb30 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
2cb40 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
2cb50 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
2cb60 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
2cb70 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
2cb80 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
2cb90 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
2cba0 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
2cbb0 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
2cbc0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
2cbd0 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
2cbe0 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
2cbf0 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
2cc00 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
2cc10 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
2cc20 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
2cc30 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
2cc40 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
2cc50 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
2cc60 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
2cc70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2cc80 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
2cc90 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
2cca0 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
2ccb0 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
2ccc0 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
2ccd0 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
2cce0 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
2ccf0 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
2cd00 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
2cd10 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
2cd20 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
2cd30 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2cd40 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2cd50 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
2cd60 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
2cd70 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
2cd80 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
2cd90 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
2cda0 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
2cdb0 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
2cdc0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
2cdd0 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
2cde0 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
2cdf0 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
2ce00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
2ce10 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
2ce20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
2ce30 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
2ce40 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
2ce50 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
2ce60 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65   for a resusable
2ce70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ce80 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
2ce90 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 61 74  */.  if( 0==stat
2cea0 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
2ceb0 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
2cec0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
2ced0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2cee0 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
2cef0 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
2cf00 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
2cf10 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
2cf20 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
2cf30 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
2cf40 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
2cf50 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
2cf60 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
2cf70 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
2cf80 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
2cf90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
2cfa0 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
2cfb0 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
2cfc0 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
2cfd0 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
2cfe0 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
2cff0 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
2d000 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
2d010 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2d020 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
2d030 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2d040 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
2d050 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2d060 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2d070 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2d080 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
2d090 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
2d0a0 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
2d0b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2d0c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2d0d0 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
2d0e0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2d0f0 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
2d100 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
2d110 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
2d120 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
2d130 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2d140 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
2d150 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
2d160 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
2d170 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
2d180 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
2d190 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
2d1a0 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
2d1b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2d1c0 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
2d1d0 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
2d1e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2d1f0 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
2d200 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
2d210 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2d220 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2d230 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2d240 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61  file, it is alwa
2d250 79 73 20 63 72 65 61 74 65 64 20 77 69 74 68 0a  ys created with.
2d260 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72  ** the octal per
2d270 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72  missions 0600 (r
2d280 65 61 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20  ead/writable by 
2d290 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20  owner only). If 
2d2a0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
2d2b0 20 64 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73   database or mas
2d2c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2d2d0 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
2d2e0 77 69 74 68 20 74 68 65 20 70 65 72 6d 69 73 73  with the permiss
2d2f0 69 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51  ions .** mask SQ
2d300 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2d310 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a  E_PERMISSIONS..*
2d320 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  *.** Finally, if
2d330 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2d340 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
2d350 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
2d360 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
2d370 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2d380 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
2d390 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2d3a0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
2d3b0 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
2d3c0 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
2d3d0 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
2d3e0 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
2d3f0 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
2d400 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
2d410 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
2d420 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
2d430 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
2d440 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
2d450 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
2d460 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2d470 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
2d480 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
2d490 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2d4a0 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
2d4b0 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
2d4c0 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
2d4d0 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
2d4e0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
2d4f0 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
2d500 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
2d510 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
2d520 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
2d530 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
2d540 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
2d550 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2d560 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2d570 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2d580 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2d590 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2d5a0 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
2d5b0 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
2d5c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5e0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
2d5f0 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
2d600 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
2d610 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
2d620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d630 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
2d640 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
2d650 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69  ile with */.  ui
2d660 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20  d_t *pUid,      
2d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d680 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74   OUT: uid to set
2d690 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2d6a0 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6c0 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f    /* OUT: gid to
2d6d0 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2d6e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2d6f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d700 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2d710 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
2d720 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
2d730 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2d740 53 49 4f 4e 53 3b 0a 20 20 69 66 28 20 66 6c 61  SIONS;.  if( fla
2d750 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
2d760 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
2d770 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
2d780 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
2d790 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
2d7a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2d7b0 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2d7c0 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
2d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2d7f0 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
2d800 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
2d810 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2d820 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
2d830 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
2d840 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2d850 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
2d860 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
2d870 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2d880 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2d890 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
2d8a0 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
2d8b0 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2d8c0 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
2d8d0 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
2d8e0 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
2d8f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
2d900 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
2d910 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2d920 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2d930 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
2d940 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2d950 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
2d960 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2d970 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
2d980 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
2d990 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
2d9a0 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
2d9b0 61 20 34 20 64 69 67 69 74 20 64 65 63 69 6d 61  a 4 digit decima
2d9c0 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e  l number. The NN
2d9d0 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20   naming schemes 
2d9e0 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64  are .    ** used
2d9f0 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c   by the test_mul
2da00 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e  tiplex.c module.
2da10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20  .    */.    nDb 
2da20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2da30 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20  0(zPath) - 1; . 
2da40 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20     while( nDb>0 
2da50 26 26 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  && zPath[nDb]!='
2da60 2d 27 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20  -' ) nDb--;.    
2da70 69 66 28 20 6e 44 62 3d 3d 30 20 29 20 72 65 74  if( nDb==0 ) ret
2da80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2da90 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a     memcpy(zDb, z
2daa0 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20  Path, nDb);.    
2dab0 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b  zDb[nDb] = '\0';
2dac0 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 61  ..    if( 0==sta
2dad0 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29  t(zDb, &sStat) )
2dae0 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d  {.      *pMode =
2daf0 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26   sStat.st_mode &
2db00 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55   0777;.      *pU
2db10 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69  id = sStat.st_ui
2db20 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d  d;.      *pGid =
2db30 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20   sStat.st_gid;. 
2db40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2db50 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2db60 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
2db70 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
2db80 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2db90 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
2dba0 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
2dbb0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
2dbc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
2dbd0 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68  n the file zPath
2dbe0 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75  ..** .** Previou
2dbf0 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20  sly, the SQLite 
2dc00 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68  OS layer used th
2dc10 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ree functions in
2dc20 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a   place of this.*
2dc30 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  * one:.**.**    
2dc40 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2dc50 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20  adWrite();.**   
2dc60 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2dc70 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20  eadOnly();.**   
2dc80 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45    sqlite3OsOpenE
2dc90 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a  xclusive();.**.*
2dca0 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f  * These calls co
2dcb0 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
2dcc0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
2dcd0 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a  ations of flags:
2dce0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57  .**.**     ReadW
2dcf0 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52  rite() ->     (R
2dd00 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2dd10 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e  E).**     ReadOn
2dd20 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45  ly()  ->     (RE
2dd30 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20  ADONLY) .**     
2dd40 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2dd50 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20  -> (READWRITE | 
2dd60 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49  CREATE | EXCLUSI
2dd70 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c  VE).**.** The ol
2dd80 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  d OpenExclusive(
2dd90 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f  ) accepted a boo
2dda0 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20  lean argument - 
2ddb0 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a  "delFlag". If.**
2ddc0 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20   true, the file 
2ddd0 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74  was configured t
2dde0 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
2ddf0 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
2de00 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64  the.** file hand
2de10 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63  le closed. To ac
2de20 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65  hieve the same e
2de30 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73  ffect using this
2de40 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61   new .** interfa
2de50 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45  ce, add the DELE
2de60 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74  TEONCLOSE flag t
2de70 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
2de80 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20  d above for .** 
2de90 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e  OpenExclusive().
2dea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2deb0 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  nixOpen(.  sqlit
2dec0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2ded0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
2dee0 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  FS for which thi
2def0 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d  s is the xOpen m
2df00 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
2df10 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2df20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e          /* Pathn
2df30 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2df40 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  e opened */.  sq
2df50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2df60 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2df70 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2df80 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69  r to be filled i
2df90 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  n */.  int flags
2dfa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2dfb0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61      /* Input fla
2dfc0 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  gs to control th
2dfd0 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69  e opening */.  i
2dfe0 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
2dff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e000 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75  utput flags retu
2e010 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63  rned to SQLite c
2e020 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ore */.){.  unix
2e030 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46  File *p = (unixF
2e040 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
2e050 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  nt fd = -1;     
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e070 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2e080 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65   returned by ope
2e090 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  n() */.  int dir
2e0a0 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
2e0b0 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
2e0c0 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
2e0d0 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ptor */.  int op
2e0e0 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  enFlags = 0;    
2e0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2e100 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65  s to pass to ope
2e110 6e 28 29 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  n() */.#if SQLIT
2e120 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
2e130 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74 20 65  OTECTION.  int e
2e140 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
2e150 46 30 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  F0FFF00;  /* Typ
2e160 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
2e170 6e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 74  n */.#else.  int
2e180 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
2e190 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
2e1a0 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
2e1b0 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  pen */.#endif.  
2e1c0 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20  int noLock;     
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e1e0 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c  * True to omit l
2e1f0 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
2e200 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
2e210 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2e220 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2e230 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
2e240 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
2e250 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
2e260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
2e270 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
2e280 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
2e290 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2e2a0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
2e2b0 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
2e2c0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2e2d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2e2e0 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
2e2f0 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
2e300 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2e310 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
2e320 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
2e330 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2e340 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
2e350 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2e360 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2e370 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78    int isAutoProx
2e380 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  y  = (flags & SQ
2e390 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
2e3a0 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  OXY);.#endif..  
2e3b0 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
2e3c0 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d   master or main-
2e3d0 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  file journal, th
2e3e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
2e3f0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c   open.  ** a fil
2e400 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e-descriptor on 
2e410 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
2e420 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  o. The first tim
2e430 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a  e unixSync().  *
2e440 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  * is called the 
2e450 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
2e460 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
2e470 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20  e fsync()ed and 
2e480 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20  close()d..  */. 
2e490 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72 65 63   int isOpenDirec
2e4a0 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61 74 65  tory = (isCreate
2e4b0 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
2e4c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2e4d0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2e4e0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
2e4f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2e500 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
2e510 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2e520 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a  OPEN_WAL.  ));..
2e530 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
2e540 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
2e550 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
2e560 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
2e570 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
2e580 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2e590 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
2e5a0 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
2e5b0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
2e5c0 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
2e5d0 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
2e5e0 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  1];.  const char
2e5f0 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b   *zName = zPath;
2e600 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
2e610 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
2e620 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
2e630 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
2e640 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
2e650 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
2e660 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
2e670 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
2e680 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
2e690 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
2e6a0 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
2e6b0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
2e6c0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
2e6d0 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
2e6e0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
2e6f0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2e700 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
2e710 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
2e720 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
2e730 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2e740 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
2e750 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
2e760 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
2e770 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
2e780 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
2e790 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
2e7a0 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
2e7b0 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
2e7c0 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
2e7d0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
2e7e0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
2e7f0 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
2e800 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
2e810 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
2e820 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
2e830 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
2e840 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a  l are never .  *
2e850 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2e860 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
2e870 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
2e880 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
2e890 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2e8a0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2e8b0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2e8c0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
2e8d0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2e8e0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2e8f0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2e900 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2e910 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
2e920 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2e930 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2e940 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2e950 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
2e960 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2e970 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2e980 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2e990 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
2e9a0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
2e9b0 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
2e9c0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
2e9d0 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
2e9e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
2e9f0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2ea00 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
2ea10 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ea20 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
2ea30 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2ea40 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2ea50 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
2ea60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2ea70 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
2ea80 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2ea90 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2eaa0 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
2eab0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2eac0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
2ead0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2eae0 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
2eaf0 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
2eb00 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
2eb10 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  );..  memset(p, 
2eb20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
2eb30 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  le));..  if( eTy
2eb40 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2eb50 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55  MAIN_DB ){.    U
2eb60 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
2eb70 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65  used;.    pUnuse
2eb80 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
2eb90 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29  Fd(zName, flags)
2eba0 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65  ;.    if( pUnuse
2ebb0 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20  d ){.      fd = 
2ebc0 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20  pUnused->fd;.   
2ebd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55   }else{.      pU
2ebe0 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
2ebf0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
2ec00 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20  Unused));.      
2ec10 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2ec20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2ec30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2ec40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2ec50 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
2ec60 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  sed;.  }else if(
2ec70 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f   !zName ){.    /
2ec80 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55  * If zName is NU
2ec90 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  LL, the upper la
2eca0 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e  yer is requestin
2ecb0 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a  g a temp file. *
2ecc0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44  /.    assert(isD
2ecd0 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e  elete && !isOpen
2ece0 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  Directory);.    
2ecf0 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70  rc = unixGetTemp
2ed00 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d  name(MAX_PATHNAM
2ed10 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  E+1, zTmpname);.
2ed20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ed30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2ed40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2ed50 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70      zName = zTmp
2ed60 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
2ed70 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
2ed80 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
2ed90 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
2eda0 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
2edb0 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
2edc0 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
2edd0 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
2ede0 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
2edf0 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
2ee00 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
2ee10 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
2ee20 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e  e file handle an
2ee30 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  d used by the . 
2ee40 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27   ** 'conch file'
2ee50 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f   locking functio
2ee60 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f  ns later on.  */
2ee70 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
2ee80 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
2ee90 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
2eea0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
2eeb0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2eec0 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
2eed0 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
2eee0 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
2eef0 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
2ef00 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
2ef10 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
2ef20 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
2ef30 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
2ef40 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 23 69 66  |O_BINARY);..#if
2ef50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
2ef60 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
2ef70 20 70 2d 3e 70 72 6f 74 46 6c 61 67 73 20 3d 20   p->protFlags = 
2ef80 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2ef90 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
2efa0 49 4f 4e 5f 4d 41 53 4b 29 3b 0a 23 65 6e 64 69  ION_MASK);.#endi
2efb0 66 0a 20 20 20 20 0a 20 20 69 66 28 20 66 64 3c  f.    .  if( fd<
2efc0 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
2efd0 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
2efe0 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
2eff0 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
2f000 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
2f010 20 75 69 64 5f 74 20 75 69 64 3b 0a 20 20 20 20   uid_t uid;.    
2f020 67 69 64 5f 74 20 67 69 64 3b 0a 20 20 20 20 72  gid_t gid;.    r
2f030 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69  c = findCreateFi
2f040 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c  leMode(zName, fl
2f050 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20  ags, &openMode, 
2f060 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20  &uid, &gid);.   
2f070 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f080 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2f090 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20  rt( !p->pUnused 
2f0a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f0b0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f0c0 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65  PEN_WAL || eType
2f0d0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2f0e0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
2f0f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f100 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f     }.    fd = ro
2f110 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
2f120 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
2f130 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  Mode);.    OSTRA
2f140 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33  CE(("OPENX   %-3
2f150 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c  d %s 0%o\n", fd,
2f160 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67   zName, openFlag
2f170 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  s));.    if( fd<
2f180 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
2f190 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
2f1a0 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
2f1b0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61  e ){.      /* Fa
2f1c0 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
2f1d0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
2f1e0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
2f1f0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
2f200 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
2f210 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f220 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2f230 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
2f240 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28   openFlags &= ~(
2f250 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b  O_RDWR|O_CREAT);
2f260 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
2f270 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f280 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ONLY;.      open
2f290 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
2f2a0 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  Y;.      isReado
2f2b0 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  nly = 1;.      f
2f2c0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
2f2d0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
2f2e0 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
2f2f0 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
2f300 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
2f310 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2f320 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
2f330 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
2f340 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
2f350 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
2f360 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 27 72 65  .    /* if we're
2f370 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 77 61 6c   opening the wal
2f380 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   or journal and 
2f390 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c  running as root,
2f3a0 20 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   set the journal
2f3b0 20 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20 20 20   uid/gid */.    
2f3c0 69 66 28 20 21 69 73 52 65 61 64 6f 6e 6c 79 20  if( !isReadonly 
2f3d0 26 26 20 28 66 6c 61 67 73 20 26 20 28 53 51 4c  && (flags & (SQL
2f3e0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
2f3f0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2f400 55 52 4e 41 4c 29 29 20 29 7b 0a 20 20 20 20 20  URNAL)) ){.     
2f410 20 75 69 64 5f 74 20 65 75 69 64 20 3d 20 67 65   uid_t euid = ge
2f420 74 65 75 69 64 28 29 3b 0a 20 20 20 20 20 20 69  teuid();.      i
2f430 66 28 20 65 75 69 64 3d 3d 30 20 26 26 20 28 65  f( euid==0 && (e
2f440 75 69 64 21 3d 75 69 64 20 7c 7c 20 67 65 74 65  uid!=uid || gete
2f450 67 69 64 28 29 21 3d 67 69 64 29 20 29 7b 0a 20  gid()!=gid) ){. 
2f460 20 20 20 20 20 20 20 69 66 28 20 66 63 68 6f 77         if( fchow
2f470 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 20  n(fd, uid, gid) 
2f480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2f490 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2f4a0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
2f4b0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
2f4c0 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  shed;.        }.
2f4d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f4e0 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d  }.  assert( fd>=
2f4f0 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46  0 );.  if( pOutF
2f500 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75  lags ){.    *pOu
2f510 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
2f520 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55    }..  if( p->pU
2f530 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  nused ){.    p->
2f540 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
2f550 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  ;.    p->pUnused
2f560 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
2f570 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65  .  }..  if( isDe
2f580 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56  lete ){.#if OS_V
2f590 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68  XWORKS.    zPath
2f5a0 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a   = zName;.#else.
2f5b0 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65      unlink(zName
2f5c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
2f5d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2f5e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2f5f0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
2f600 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
2f610 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  gs;.  }.#endif..
2f620 20 20 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65    if( isOpenDire
2f630 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20  ctory ){.    rc 
2f640 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
2f650 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
2f660 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
2f680 2a 20 49 74 20 69 73 20 73 61 66 65 20 74 6f 20  * It is safe to 
2f690 63 6c 6f 73 65 20 66 64 20 61 74 20 74 68 69 73  close fd at this
2f6a0 20 70 6f 69 6e 74 2c 20 62 65 63 61 75 73 65 20   point, because 
2f6b0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
2f6c0 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f   not.      ** to
2f6d0 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61   be open on a da
2f6e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
2f6f0 69 74 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20  it were open on 
2f700 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
2f710 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77 6f 75  .      ** it wou
2f720 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
2f730 6f 20 63 6c 6f 73 65 20 61 73 20 74 68 69 73 20  o close as this 
2f740 77 6f 75 6c 64 20 72 65 6c 65 61 73 65 20 61 6e  would release an
2f750 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20  y locks held.   
2f760 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c     ** on the fil
2f770 65 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73  e by this proces
2f780 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  s.  */.      ass
2f790 65 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49  ert( eType!=SQLI
2f7a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2f7b0 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
2f7c0 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
2f7d0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 67 6f  INE__);.      go
2f7e0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
2f7f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
2f800 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
2f810 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53   osFcntl(fd, F_S
2f820 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64  ETFD, osFcntl(fd
2f830 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
2f840 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
2f850 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  dif..  noLock = 
2f860 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2f870 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a  EN_MAIN_DB;..  .
2f880 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2f890 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
2f8a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2f8b0 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
2f8c0 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
2f8d0 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
2f8e0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
2f8f0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2f900 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
2f910 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2f920 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20   if( dirfd>=0 ) 
2f930 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2f940 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  dirfd, __LINE__)
2f950 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
2f960 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
2f970 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  __);.    return 
2f980 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
2f990 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  ESS;.  }.  if (0
2f9a0 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64   == strncmp("msd
2f9b0 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  os", fsInfo.f_fs
2f9c0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
2f9d0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
2f9e0 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
2f9f0 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
2fa00 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
2fa10 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
2fa20 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e  mp("exfat", fsIn
2fa30 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2fa40 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
2fa50 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
2fa60 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2fa70 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
2fa80 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  S;.  }.#endif.  
2fa90 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2faa0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2fab0 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
2fac0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2fad0 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d  .  isAutoProxy =
2fae0 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
2faf0 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20   isAutoProxy && 
2fb00 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26  (zPath!=NULL) &&
2fb10 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56   (!noLock) && pV
2fb20 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20  fs->xOpen ){.   
2fb30 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20   char *envforce 
2fb40 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
2fb50 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2fb60 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20  KING");.    int 
2fb70 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20  useProxy = 0;.. 
2fb80 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
2fb90 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2fba0 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20  ==1 means force 
2fbb0 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79  always use proxy
2fbc0 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a  , 0 means .    *
2fbd0 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78  * never use prox
2fbe0 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73  y, NULL means us
2fbf0 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d  e proxy for non-
2fc00 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79  local files only
2fc10 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e  .  */.    if( en
2fc20 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a  vforce!=NULL ){.
2fc30 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
2fc40 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e   atoi(envforce)>
2fc50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2fc60 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21      useProxy = !
2fc70 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26  (fsInfo.f_flags&
2fc80 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20  MNT_LOCAL);.    
2fc90 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f  }.    if( usePro
2fca0 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  xy ){.      rc =
2fcb0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
2fcc0 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
2fcd0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
2fce0 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  oLock,.         
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd00 20 69 73 44 65 6c 65 74 65 2c 20 69 73 52 65 61   isDelete, isRea
2fd10 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 69 66  donly);.      if
2fd20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fd30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61  ){.        /* ca
2fd40 63 68 65 20 74 68 65 20 70 4d 65 74 68 6f 64 20  che the pMethod 
2fd50 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e  in case the tran
2fd60 73 66 6f 72 6d 20 66 61 69 6c 73 20 2a 2f 0a 20  sform fails */. 
2fd70 20 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74 72         const str
2fd80 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  uct sqlite3_io_m
2fd90 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 20  ethods *pMethod 
2fda0 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
2fdb0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
2fdc0 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
2fdd0 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65  ixFile((unixFile
2fde0 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a  *)pFile, ":auto:
2fdf0 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
2fe00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fe10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  .          /* Us
2fe20 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63  e unixClose to c
2fe30 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f  lean up the reso
2fe40 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66  urces added in f
2fe50 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20  illInUnixFile . 
2fe60 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
2fe70 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74  clear all the st
2fe80 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65  ructure's refere
2fe90 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61  nces.  Specifica
2fea0 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  lly, .          
2feb0 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  ** pFile->pMetho
2fec0 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  ds will be NULL 
2fed0 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  so sqlite3OsClos
2fee0 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f  e will be a no-o
2fef0 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  p .          */.
2ff00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
2ff10 65 74 68 6f 64 21 3d 4e 55 4c 4c 20 29 7b 0a 20  ethod!=NULL ){. 
2ff20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 74 68             pMeth
2ff30 6f 64 2d 3e 78 43 6c 6f 73 65 28 70 46 69 6c 65  od->xClose(pFile
2ff40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2ff50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2ff60 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29  unixClose(pFile)
2ff70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ff80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2ff90 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2ffa0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
2ffb0 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
2ffc0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2ffd0 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
2ffe0 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
2fff0 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c  d, dirfd, pFile,
30000 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a   zPath, noLock,.
30010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30020 20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20        isDelete, 
30030 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 6f 70 65  isReadonly);.ope
30040 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  n_finished:.  if
30050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30060 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
30070 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b  ree(p->pUnused);
30080 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
30090 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ;.}.../*.** Dele
300a0 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a  te the file at z
300b0 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
300c0 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
300d0 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a   true, fsync().*
300e0 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
300f0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74  after deleting t
30100 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
30110 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74  ic int unixDelet
30120 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
30130 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f   *NotUsed,     /
30140 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  * VFS containing
30150 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65   this as the xDe
30160 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lete method */. 
30170 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
30180 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  th,        /* Na
30190 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
301a0 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e   deleted */.  in
301b0 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20  t dirSync       
301c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
301d0 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65  ue, fsync() dire
301e0 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
301f0 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  ting file */.){.
30200 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30210 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50  E_OK;.  UNUSED_P
30220 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
30230 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
30240 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
30250 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
30260 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a  ;.  if( unlink(z
30270 50 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20 65  Path)==(-1) && e
30280 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno!=ENOENT ){.
30290 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
302a0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
302b0 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e  OERR_DELETE, "un
302c0 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20  link", zPath);. 
302d0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
302e0 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
302f0 43 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20  C.  if( dirSync 
30300 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20  ){.    int fd;. 
30310 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65     rc = openDire
30320 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64  ctory(zPath, &fd
30330 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
30340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20  QLITE_OK ){.#if 
30350 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20  OS_VXWORKS.     
30360 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d   if( fsync(fd)==
30370 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20  -1 ).#else.     
30380 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29   if( fsync(fd) )
30390 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
303a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
303b0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
303c0 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
303d0 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68  , "fsync", zPath
303e0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 4f  );.      }.#if O
303f0 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
30400 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 69  SE_IOERR.      i
30410 66 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72  f( close(fd)&&!r
30420 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
30430 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
30440 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  IR_CLOSE;.      
30450 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 6f  }.#else.      ro
30460 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
30470 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e  , __LINE__);.#en
30480 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  dif.    }.  }.#e
30490 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
304a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
304b0 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
304c0 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69   or access permi
304d0 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a  ssions of file z
304e0 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73  Path. The.** tes
304f0 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65  t performed depe
30500 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
30510 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
30520 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
30530 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72  SS_EXISTS: Retur
30540 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
30550 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51  exists.**     SQ
30560 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
30570 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20  WRITE: Return 1 
30580 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
30590 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65  ead and writable
305a0 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  ..**     SQLITE_
305b0 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a  ACCESS_READONLY:
305c0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
305d0 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c   file is readabl
305e0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
305f0 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  se return 0..*/.
30600 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41  static int unixA
30610 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
30620 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
30630 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74   /* The VFS cont
30640 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63  aining this xAcc
30650 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ess method */.  
30660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
30670 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20  h,      /* Path 
30680 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65  of the file to e
30690 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  xamine */.  int 
306a0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
306b0 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77      /* What do w
306c0 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20  e want to learn 
306d0 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20  about the zPath 
306e0 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a  file? */.  int *
306f0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
30700 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
30710 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20  lt boolean here 
30720 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64  */.){.  int amod
30730 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  e = 0;.  UNUSED_
30740 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
30750 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
30760 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
30770 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
30780 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  S; );.  switch( 
30790 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
307a0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
307b0 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d  EXISTS:.      am
307c0 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20  ode = F_OK;.    
307d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
307e0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
307f0 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
30800 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f   amode = W_OK|R_
30810 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
30820 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
30830 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
30840 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b      amode = R_OK
30850 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
30860 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
30870 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
30880 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
30890 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
308a0 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73  sOut = (osAccess
308b0 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d  (zPath, amode)==
308c0 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d  0);.  if( flags=
308d0 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
308e0 58 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75  XISTS && *pResOu
308f0 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
30900 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66  stat buf;.    if
30910 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c  ( 0==stat(zPath,
30920 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74   &buf) && buf.st
30930 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _size==0 ){.    
30940 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
30950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
30960 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30970 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
30980 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
30990 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
309a0 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74  hname. The relat
309b0 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73  ive path.** is s
309c0 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74  tored as a nul-t
309d0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
309e0 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
309f0 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
30a00 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f  zPath. .**.** zO
30a10 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ut points to a b
30a20 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
30a30 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  t sqlite3_vfs.mx
30a40 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a  Pathname bytes .
30a50 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65  ** (in this case
30a60 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62  , MAX_PATHNAME b
30a70 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d  ytes). The full-
30a80 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  path is written 
30a90 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  to.** this buffe
30aa0 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
30ab0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
30ac0 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  t unixFullPathna
30ad0 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
30ae0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
30af0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
30b00 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
30b10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
30b20 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
30b30 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
30b40 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
30b50 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20  */.  int nOut,  
30b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b70 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
30b80 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
30b90 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
30ba0 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
30bb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
30bc0 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a  t buffer */.){..
30bd0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
30be0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
30bf0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
30c00 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
30c10 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
30c20 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
30c30 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
30c40 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
30c50 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
30c60 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
30c70 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
30c80 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
30c90 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
30ca0 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
30cb0 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
30cc0 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
30cd0 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
30ce0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
30cf0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
30d00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  ;..  assert( pVf
30d10 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d  s->mxPathname==M
30d20 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20  AX_PATHNAME );. 
30d30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30d40 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74  R(pVfs);..  zOut
30d50 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b  [nOut-1] = '\0';
30d60 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
30d70 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  ='/' ){.    sqli
30d80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
30d90 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
30da0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
30db0 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20      int nCwd;.  
30dc0 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a    if( osGetcwd(z
30dd0 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20  Out, nOut-1)==0 
30de0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
30df0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
30e00 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
30e10 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61  T, "getcwd", zPa
30e20 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  th);.    }.    n
30e30 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Cwd = (int)strle
30e40 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  n(zOut);.    sql
30e50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
30e60 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e  ut-nCwd, &zOut[n
30e70 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61  Cwd], "/%s", zPa
30e80 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
30e90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
30ea0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30eb0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
30ec0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
30ed0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
30ee0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
30ef0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
30f00 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
30f10 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
30f20 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
30f30 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
30f40 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
30f50 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
30f60 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
30f70 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
30f80 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
30f90 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
30fa0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
30fb0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
30fc0 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
30fd0 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
30fe0 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
30ff0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
31000 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
31010 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
31020 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
31030 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
31040 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
31050 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
31060 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
31070 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
31080 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
31090 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
310a0 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
310b0 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
310c0 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
310d0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
310e0 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
310f0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
31100 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
31110 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
31120 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
31130 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
31140 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
31150 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
31160 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
31170 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ut){.  const cha
31180 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45  r *zErr;.  UNUSE
31190 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
311a0 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  sed);.  unixEnte
311b0 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72  rMutex();.  zErr
311c0 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20   = dlerror();.  
311d0 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
311e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
311f0 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20  (nBuf, zBufOut, 
31200 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  "%s", zErr);.  }
31210 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
31220 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  x();.}.static vo
31230 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73  id (*unixDlSym(s
31240 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31250 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f  sed, void *p, co
31260 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28  nst char*zSym))(
31270 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  void){.  /* .  *
31280 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61  * GCC with -peda
31290 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73  ntic-errors says
312a0 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e   that C90 does n
312b0 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a  ot allow a void*
312c0 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74   to be.  ** cast
312d0 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
312e0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
312f0 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72  And yet the libr
31300 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74  ary dlsym() rout
31310 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ine.  ** returns
31320 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69   a void* which i
31330 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74  s really a point
31340 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
31350 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a  .  So how do we.
31360 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29    ** use dlsym()
31370 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
31380 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a  errors?.  **.  *
31390 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c  * Variable x bel
313a0 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  ow is defined to
313b0 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
313c0 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69   a function taki
313d0 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65  ng.  ** paramete
313e0 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e  rs void* and con
313f0 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74  st char* and ret
31400 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  urning a pointer
31410 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a   to a function..
31420 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69    ** We initiali
31430 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e  ze x by assignin
31440 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74  g it a pointer t
31450 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75  o the dlsym() fu
31460 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68  nction..  ** (Th
31470 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65  at assignment re
31480 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20  quires a cast.) 
31490 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68   Then we call th
314a0 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  e function that.
314b0 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f    ** x points to
314c0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
314d0 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  is work-around i
314e0 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f  s unlikely to wo
314f0 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20  rk correctly on 
31500 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65  any system where
31510 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79  .  ** you really
31520 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66   cannot cast a f
31530 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
31540 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74  into void*.  But
31550 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20   then, on the.  
31560 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64  ** other hand, d
31570 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20  lsym() will not 
31580 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73  work on such a s
31590 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f  ystem either, so
315a0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f   we have.  ** no
315b0 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e  t really lost an
315c0 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76  ything..  */.  v
315d0 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a  oid (*(*x)(void*
315e0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
315f0 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  oid);.  UNUSED_P
31600 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31610 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a  );.  x = (void(*
31620 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  (*)(void*,const 
31630 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c  char*))(void))dl
31640 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a  sym;.  return (*
31650 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  x)(p, zSym);.}.s
31660 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
31670 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
31680 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
31690 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
316a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
316b0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c  NotUsed);.  dlcl
316c0 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  ose(pHandle);.}.
316d0 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
316e0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
316f0 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
31700 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
31710 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20  unixDlOpen  0.  
31720 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72  #define unixDlEr
31730 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
31740 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20  unixDlSym   0.  
31750 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c  #define unixDlCl
31760 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ose 0.#endif../*
31770 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62  .** Write nBuf b
31780 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64  ytes of random d
31790 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ata to the suppl
317a0 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e  ied buffer zBuf.
317b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
317c0 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  nixRandomness(sq
317d0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
317e0 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
317f0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
31800 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31810 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  tUsed);.  assert
31820 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28  ((size_t)nBuf>=(
31830 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
31840 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
31850 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
31860 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
31870 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
31880 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
31890 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
318a0 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
318b0 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
318c0 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
318d0 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
318e0 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
318f0 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
31900 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
31910 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
31920 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
31930 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
31940 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
31950 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
31960 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
31970 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
31980 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
31990 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
319a0 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
319b0 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
319c0 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
319d0 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
319e0 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
319f0 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
31a00 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
31a10 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
31a20 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
31a30 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
31a40 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
31a50 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
31a60 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
31a70 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
31a80 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
31a90 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
31aa0 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
31ab0 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
31ac0 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
31ad0 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64  0, nBuf);.#if !d
31ae0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
31af0 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ST).  {.    int 
31b00 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20  pid, fd;.    fd 
31b10 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f  = robust_open("/
31b20 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
31b30 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20  RDONLY, 0);.    
31b40 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
31b50 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20    time_t t;.    
31b60 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20    time(&t);.    
31b70 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26    memcpy(zBuf, &
31b80 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20  t, sizeof(t));. 
31b90 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69       pid = getpi
31ba0 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  d();.      memcp
31bb0 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74  y(&zBuf[sizeof(t
31bc0 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  )], &pid, sizeof
31bd0 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73  (pid));.      as
31be0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b  sert( sizeof(t)+
31bf0 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69  sizeof(pid)<=(si
31c00 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
31c10 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
31c20 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64  (t) + sizeof(pid
31c30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
31c40 20 20 20 20 64 6f 7b 20 6e 42 75 66 20 3d 20 6f      do{ nBuf = o
31c50 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20  sRead(fd, zBuf, 
31c60 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e  nBuf); }while( n
31c70 42 75 66 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  Buf<0 && errno==
31c80 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72  EINTR );.      r
31c90 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66  obust_close(0, f
31ca0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
31cb0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
31cc0 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a   return nBuf;.}.
31cd0 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
31ce0 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
31cf0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
31d00 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
31d10 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  pt..** The argum
31d20 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ent is the numbe
31d30 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
31d40 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65  s we want to sle
31d50 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ep..** The retur
31d60 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
31d70 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
31d80 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61  conds of sleep a
31d90 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65  ctually.** reque
31da0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e  sted from the un
31db0 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69  derlying operati
31dc0 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d  ng system, a num
31dd0 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  ber which.** mig
31de0 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ht be greater th
31df0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
31e00 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74  he argument, but
31e10 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61   not less.** tha
31e20 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
31e30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
31e40 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  ixSleep(sqlite3_
31e50 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
31e60 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b  t microseconds){
31e70 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
31e80 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
31e90 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73  c sp;..  sp.tv_s
31ea0 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64  ec = microsecond
31eb0 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73  s / 1000000;.  s
31ec0 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63  p.tv_nsec = (mic
31ed0 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30  roseconds % 1000
31ee0 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e  000) * 1000;.  n
31ef0 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55  anosleep(&sp, NU
31f00 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  LL);.  UNUSED_PA
31f10 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31f20 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
31f30 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64  seconds;.#elif d
31f40 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
31f50 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
31f60 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72  EP.  usleep(micr
31f70 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  oseconds);.  UNU
31f80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31f90 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
31fa0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
31fb0 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e  else.  int secon
31fc0 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ds = (microsecon
31fd0 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30  ds+999999)/10000
31fe0 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f  00;.  sleep(seco
31ff0 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
32000 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32010 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f  );.  return seco
32020 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e  nds*1000000;.#en
32030 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
32040 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
32050 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
32060 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
32070 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
32080 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
32090 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
320a0 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
320b0 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
320c0 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
320d0 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
320e0 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
320f0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
32100 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
32110 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
32120 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
32130 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
32140 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
32150 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
32160 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
32170 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
32180 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
32190 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
321a0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
321b0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
321c0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
321d0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
321e0 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
321f0 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
32200 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
32210 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
32220 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
32230 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
32240 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
32250 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
32260 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
32270 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
32280 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
32290 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
322a0 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
322b0 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
322c0 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
322d0 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
322e0 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
322f0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
32300 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
32310 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c  entTimeInt64(sql
32320 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
32330 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
32340 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74   *piNow){.  stat
32350 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
32360 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
32370 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
32380 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
32390 30 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  00;.#if defined(
323a0 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d  NO_GETTOD).  tim
323b0 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
323c0 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28  );.  *piNow = ((
323d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29  sqlite3_int64)t)
323e0 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63  *1000 + unixEpoc
323f0 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f  h;.#elif OS_VXWO
32400 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
32410 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c  espec sNow;.  cl
32420 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43  ock_gettime(CLOC
32430 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f  K_REALTIME, &sNo
32440 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75  w);.  *piNow = u
32450 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
32460 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
32470 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
32480 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30  w.tv_nsec/100000
32490 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  0;.#else.  struc
324a0 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
324b0 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26    gettimeofday(&
324c0 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 69 4e  sNow, 0);.  *piN
324d0 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
324e0 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
324f0 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
32500 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
32510 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  1000;.#endif..#i
32520 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
32530 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
32540 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
32550 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
32560 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
32570 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
32580 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
32590 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
325a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
325b0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
325c0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn 0;.}../*.** F
325d0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
325e0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
325f0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
32600 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
32610 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
32620 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
32630 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
32640 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
32650 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
32660 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
32670 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
32680 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
32690 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
326a0 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
326b0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
326c0 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
326d0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
326e0 34 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  4 i;.  UNUSED_PA
326f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32700 3b 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54  ;.  unixCurrentT
32710 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b  imeInt64(0, &i);
32720 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36  .  *prNow = i/86
32730 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75  400000.0;.  retu
32740 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn 0;.}../*.** W
32750 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65 74  e added the xGet
32760 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68  LastError() meth
32770 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74 65  od with the inte
32780 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69  ntion of providi
32790 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77  ng.** better low
327a0 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73  -level error mes
327b0 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61  sages when opera
327c0 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62  ting-system prob
327d0 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20  lems come up.** 
327e0 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70  during SQLite op
327f0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f  eration.  But so
32800 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68   far, none of th
32810 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c  at has been impl
32820 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68  emented.** in th
32830 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73  e core.  So this
32840 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
32850 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e  r called.  For n
32860 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79  ow, it is merely
32870 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  .** a place-hold
32880 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
32890 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72  t unixGetLastErr
328a0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
328b0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
328c0 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74  Used2, char *Not
328d0 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44  Used3){.  UNUSED
328e0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
328f0 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed);.  UNUSED_PA
32900 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32  RAMETER(NotUsed2
32910 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32920 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b  METER(NotUsed3);
32930 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
32940 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./*.************
32950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
32960 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
32970 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
32980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32990 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
329a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329e0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
329f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32a30 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
32a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
32a50 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b  Begin Proxy Lock
32a60 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
32a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32a80 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ****.**.** Proxy
32a90 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75   locking is a "u
32aa0 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
32ab0 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73  od" in this sens
32ac0 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a  e:  It uses the.
32ad0 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
32ae0 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f   methods on seco
32af0 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73  ndary lock files
32b00 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  .  Proxy locking
32b10 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61   is a.** meta-la
32b20 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20  yer over top of 
32b30 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
32b40 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65  cking implemente
32b50 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a  d above.  For.**
32b60 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
32b70 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
32b80 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72  implements of pr
32b90 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  oxy locking is d
32ba0 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c  eferred.** until
32bb0 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c   late in the fil
32bc0 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61  e (here) after a
32bd0 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ll of the other 
32be0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65  I/O methods have
32bf0 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64  .** been defined
32c00 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70   - so that the p
32c10 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
32c20 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61   methods are ava
32c30 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72  ilable.** as ser
32c40 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69  vices to help wi
32c50 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  th the implement
32c60 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c  ation of proxy l
32c70 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a  ocking..**.****.
32c80 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
32c90 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  t locking scheme
32ca0 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20  s in SQLite use 
32cb0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
32cc0 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
32cd0 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72  ase file to coor
32ce0 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e  dinate safe, con
32cf0 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62  current access b
32d00 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65  y multiple reade
32d10 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72  rs.** and writer
32d20 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65  s [http://sqlite
32d30 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68  .org/lockingv3.h
32d40 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20  tml].  The five 
32d50 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
32d60 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44  states (UNLOCKED
32d70 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45  , PENDING, SHARE
32d80 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43  D, RESERVED, EXC
32d90 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c  LUSIVE) are impl
32da0 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f  emented.** as PO
32db0 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65  SIX read & write
32dc0 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65   locks over fixe
32dd0 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f  d set of locatio
32de0 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a  ns (via fsctl),.
32df0 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d  ** on AFP and SM
32e00 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65  B only exclusive
32e10 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
32e20 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
32e30 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74  via fsctl.** wit
32e40 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c  h _IOWR('z', 23,
32e50 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
32e60 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61  eLockPB2) to tra
32e70 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74  ck the same 5 st
32e80 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75  ates..** To simu
32e90 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f  late a F_RDLCK o
32ea0 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
32eb0 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e  ge, on AFP a ran
32ec0 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a  domly selected.*
32ed0 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65  * address in the
32ee0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
32ef0 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41   taken for a SHA
32f00 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e  RED lock, the en
32f10 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72  tire.** shared r
32f20 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
32f30 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
32f40 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ock):.**.**     
32f50 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20   PENDING_BYTE   
32f60 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 09       0x40000000.
32f70 09 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45  .   ..**      RE
32f80 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20  SERVED_BYTE     
32f90 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20    0x40000001.** 
32fa0 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47       SHARED_RANG
32fb0 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
32fc0 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30  002 -> 0x4000020
32fd0 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  0.**.** This wor
32fe0 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c  ks well on the l
32ff0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
33000 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65  , but shows a ne
33010 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f  arly 100x.** slo
33020 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65  wdown in read pe
33030 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50  rformance on AFP
33040 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50   because the AFP
33050 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73   client disables
33060 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63  .** the read cac
33070 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e  he when byte-ran
33080 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65  ge locks are pre
33090 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20  sent.  Enabling 
330a0 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68  the read.** cach
330b0 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68  e exposes a cach
330c0 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62  e coherency prob
330d0 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73  lem that is pres
330e0 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a  ent on all OS X.
330f0 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74  ** supported net
33100 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d  work file system
33110 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20  s.  NFS and AFP 
33120 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65  both observe the
33130 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65  .** close-to-ope
33140 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20  n semantics for 
33150 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63  ensuring cache c
33160 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74  oherency.** [htt
33170 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f  p://nfs.sourcefo
33180 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d  rge.net/#faq_a8]
33190 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  , which does not
331a0 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20   effectively.** 
331b0 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75  address the requ
331c0 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e  irements for con
331d0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
331e0 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
331f0 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61  ple.** readers a
33200 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68  nd writers.** [h
33210 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65  ttp://www.nabble
33220 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e  .com/SQLite-on-N
33230 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e  FS-cache-coheren
33240 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74  cy-td15655701.ht
33250 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64  ml]..**.** To ad
33260 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72  dress the perfor
33270 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20  mance and cache 
33280 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73  coherency issues
33290 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  , proxy file loc
332a0 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
332b0 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65  the way database
332c0 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72   access is contr
332d0 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e  olled by limitin
332e0 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a  g access to a.**
332f0 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20   single host at 
33300 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e  a time and movin
33310 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66  g file locks off
33320 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33330 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74   file.** and ont
33340 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f  o a proxy file o
33350 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
33360 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a   system.  .**.**
33370 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20  .** Using proxy 
33380 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  locks.** -------
33390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
333a0 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73   C APIs.**.**  s
333b0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
333c0 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
333d0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
333e0 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20  ROXYFILE,.**    
333f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33400 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20     <proxy_path> 
33410 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20  | ":auto:");.** 
33420 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
33430 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
33440 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
33450 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72  KPROXYFILE, &<pr
33460 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a  oxy_path>);.**.*
33470 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73  *.** SQL pragmas
33480 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  .**.**  PRAGMA [
33490 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
334a0 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79  roxy_file=<proxy
334b0 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a  _path> | :auto:.
334c0 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
334d0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
334e0 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63  _file.**.** Spec
334f0 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20  ifying ":auto:" 
33500 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
33510 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66  ere is a conch f
33520 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68  ile with a match
33530 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69  ing.** host ID i
33540 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20  n it, the proxy 
33550 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  path in the conc
33560 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
33570 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a  sed, otherwise.*
33580 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62  * a proxy path b
33590 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72  ased on the user
335a0 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28  's temp dir.** (
335b0 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f  via confstr(_CS_
335c0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
335d0 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20  _DIR,...)) will 
335e0 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  be used and the.
335f0 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20  ** actual proxy 
33600 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e  file name is gen
33610 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
33620 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66  name and path of
33630 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
33640 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d   file.  For exam
33650 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
33660 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61   For database pa
33670 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f  th "/Users/me/fo
33680 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20  o.db" .**       
33690 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  The lock path wi
336a0 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f  ll be "<tmpdir>/
336b0 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73  sqliteplocks/_Us
336c0 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75  ers_me_foo.db:au
336d0 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  to:").**.** Once
336e0 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73   a lock proxy is
336f0 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
33700 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
33710 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f  ction, it can no
33720 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c  t.** be removed,
33730 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20   however it may 
33740 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61  be switched to a
33750 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79   different proxy
33760 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65   path via.** the
33770 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73   above APIs (ass
33780 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20  uming the conch 
33790 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e  file is not bein
337a0 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  g held by anothe
337b0 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  r.** connection 
337c0 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a  or process). .**
337d0 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79  .**.** How proxy
337e0 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a   locking works.*
337f0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
33800 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
33810 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  Proxy file locki
33820 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72  ng relies primar
33830 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73  ily on two new s
33840 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a  upporting files:
33850 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e   .**.**   *  con
33860 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74  ch file to limit
33870 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
33880 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
33890 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a  a single host.**
338a0 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a        at a time.
338b0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79  **.**   *  proxy
338c0 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20   file to act as 
338d0 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20  a proxy for the 
338e0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e  advisory locks n
338f0 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20  ormally.**      
33900 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
33910 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  abase.**.** The 
33920 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20  conch file - to 
33930 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65  use a proxy file
33940 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69  , sqlite must fi
33950 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f  rst "hold the co
33960 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e  nch".** by takin
33970 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c  g an sqlite-styl
33980 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  e shared lock on
33990 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c   the conch file,
339a0 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
339b0 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d  contents and com
339c0 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27  paring the host'
339d0 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44  s unique host ID
339e0 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64   (see below) and
339f0 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70   lock.** proxy p
33a00 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  ath against the 
33a10 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
33a20 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65   the conch.  The
33a30 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a   conch file is.*
33a40 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
33a50 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
33a60 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
33a70 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
33a80 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74   name.** is patt
33a90 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  erned after the 
33aa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
33ab0 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73  me as ".<databas
33ac0 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a  ename>-conch"..*
33ad0 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66  * If the conch f
33ae0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
33af0 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74  st, or it's cont
33b00 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
33b10 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44  h the.** host ID
33b20 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61   and/or proxy pa
33b30 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  th, then the loc
33b40 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74  k is escalated t
33b50 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  o an exclusive.*
33b60 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63  * lock and the c
33b70 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e  onch file conten
33b80 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ts is updated wi
33b90 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  th the host ID a
33ba0 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68  nd proxy.** path
33bb0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73   and the lock is
33bc0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
33bd0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61   shared lock aga
33be0 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63  in.  If the conc
33bf0 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20  h.** is held by 
33c00 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
33c10 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c  (with a shared l
33c20 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73  ock), the exclus
33c30 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c  ive lock.** will
33c40 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45   fail and SQLITE
33c50 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
33c60 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  d..**.** The pro
33c70 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67  xy file - a sing
33c80 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65  le-byte file use
33c90 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f  d for all adviso
33ca0 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a  ry file locks.**
33cb0 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20   normally taken 
33cc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
33cd0 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c  file.   This all
33ce0 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61  ows for safe sha
33cf0 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ring.** of the d
33d00 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
33d10 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
33d20 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e  s and writers on
33d30 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73   the same.** hos
33d40 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73  t (the conch ens
33d50 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61  ures that they a
33d60 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ll use the same 
33d70 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29  local lock file)
33d80 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69  ..**.** Requesti
33d90 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78  ng the lock prox
33da0 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64  y does not immed
33db0 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20  iately take the 
33dc0 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20  conch, it is.** 
33dd0 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20  only taken when 
33de0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73  the first reques
33df0 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61  t to lock databa
33e00 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e  se file is made.
33e10 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68    .** This match
33e20 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73  es the semantics
33e30 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f   of the traditio
33e40 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61  nal locking beha
33e50 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f  vior, where.** o
33e60 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74  pening a connect
33e70 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
33e80 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
33e90 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69  take a lock on i
33ea0 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64  t..** The shared
33eb0 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65   lock and an ope
33ec0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
33ed0 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64  r are maintained
33ee0 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63   until .** the c
33ef0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
33f00 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f   database is clo
33f10 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sed. .**.** The 
33f20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74  proxy file and t
33f30 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65  he lock file are
33f40 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73   never deleted s
33f50 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64  o they only need
33f60 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65  .** to be create
33f70 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  d the first time
33f80 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a   they are used..
33f90 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  **.** Configurat
33fa0 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d  ion options.** -
33fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33fc0 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ----.**.**  SQLI
33fd0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
33fe0 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LOCKING.**.**   
33ff0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
34000 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e  es accessed on n
34010 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  on-local file sy
34020 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20  stems are.**    
34030 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79     automatically
34040 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
34050 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c  proxy locking, l
34060 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a  ock files are.**
34070 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74         named aut
34080 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67  omatically using
34090 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20   the same logic 
340a0 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47  as.**       PRAG
340b0 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  MA lock_proxy_fi
340c0 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20  le=":auto:".**  
340d0 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52    .**  SQLITE_PR
340e0 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20  OXY_DEBUG.**.** 
340f0 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68        Enables th
34100 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72  e logging of err
34110 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69  or messages duri
34120 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a  ng host id file.
34130 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76  **       retriev
34140 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a  al and creation.
34150 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59  **.**  LOCKPROXY
34160 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  DIR.**.**       
34170 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65  Overrides the de
34180 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20  fault directory 
34190 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72  used for lock pr
341a0 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a  oxy files that.*
341b0 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65  *       are name
341c0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
341d0 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22  via the ":auto:"
341e0 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20   setting.**.**  
341f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
34200 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
34210 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ONS.**.**       
34220 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75  Permissions to u
34230 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  se when creating
34240 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72   a directory for
34250 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20   storing the.** 
34260 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79        lock proxy
34270 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65   files, only use
34280 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59  d when LOCKPROXY
34290 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a  DIR is not set..
342a0 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a  **    .**    .**
342b0 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62   As mentioned ab
342c0 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c  ove, when compil
342d0 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50  ed with SQLITE_P
342e0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
342f0 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20  ING,.** setting 
34300 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  the environment 
34310 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f  variable SQLITE_
34320 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
34330 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a  ING to 1 will.**
34340 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63   force proxy loc
34350 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  king to be used 
34360 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61  for every databa
34370 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20  se file opened, 
34380 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f  and 0.** will fo
34390 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72  rce automatic pr
343a0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
343b0 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61  e disabled for a
343c0 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
343d0 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20  iles (explicity 
343e0 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49  calling the SQLI
343f0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
34400 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a  FILE pragma or.*
34410 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f  * sqlite_file_co
34420 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74  ntrol API is not
34430 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c   affected by SQL
34440 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
34450 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a  LOCKING)..*/../*
34460 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
34470 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
34480 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a  ble on MacOSX .*
34490 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
344a0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
344b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
344c0 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54  G_STYLE../*.** T
344d0 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  he proxyLockingC
344e0 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70  ontext has the p
344f0 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72  ath and file str
34500 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20  uctures for the 
34510 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c  remote .** and l
34520 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73  ocal proxy files
34530 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65   in it.*/.typede
34540 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  f struct proxyLo
34550 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f  ckingContext pro
34560 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
34570 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  ;.struct proxyLo
34580 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
34590 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
345a0 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  File;         /*
345b0 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   Open conch file
345c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
345d0 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20  hFilePath;      
345e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
345f0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
34600 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
34610 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f  Proxy;         /
34620 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63  * Open proxy loc
34630 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
34640 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b   *lockProxyPath;
34650 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
34660 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
34670 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
34680 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
34690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
346a0 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
346b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63  le */.  int conc
346c0 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  hHeld;          
346d0 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65       /* 1 if the
346e0 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20   conch is held, 
346f0 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a  -1 if lockless *
34700 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20  /.  int nFails; 
34710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34720 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
34730 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75  nch taking failu
34740 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  res */.  void *o
34750 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
34760 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
34770 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
34780 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
34790 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
347a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
347b0 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
347c0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
347d0 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
347e0 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
347f0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
34800 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
34810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
34820 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
34830 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
34840 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
34850 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
34860 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
34870 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
34880 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
34890 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
348a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
348b0 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
348c0 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
348d0 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
348e0 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
348f0 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
34900 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
34910 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
34920 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
34930 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
34940 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
34950 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
34960 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
34970 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
34980 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
34990 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
349a0 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
349b0 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
349c0 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
349d0 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
349e0 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
349f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
34a00 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
34a10 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
34a20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34a30 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
34a40 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
34a50 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
34a60 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
34a70 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
34a80 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
34a90 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
34aa0 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
34ab0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
34ac0 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
34ad0 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
34ae0 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
34af0 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
34b00 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
34b10 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
34b20 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
34b30 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
34b40 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
34b50 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
34b60 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
34b70 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74  & (i+len+7)<(int
34b80 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  )maxLen; i++){. 
34b90 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61     char c = dbPa
34ba0 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68  th[i];.    lPath
34bb0 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f  [i+len] = (c=='/
34bc0 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20  ')?'_':c;.  }.  
34bd0 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30  lPath[i+len]='\0
34be0 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61  ';.  strlcat(lPa
34bf0 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61  th, ":auto:", ma
34c00 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45  xLen);.  OSTRACE
34c10 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
34c20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
34c30 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50  %s pid=%d\n", lP
34c40 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ath, getpid()));
34c50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34c60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20  _OK;.}../* . ** 
34c70 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b  Creates the lock
34c80 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69   file and any mi
34c90 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  ssing directorie
34ca0 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a  s in lockPath. *
34cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
34cc0 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
34cd0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63  (const char *loc
34ce0 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c  kPath){.  int i,
34cf0 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66   len;.  char buf
34d00 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
34d10 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20  int start = 0;. 
34d20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50   .  assert(lockP
34d30 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a  ath!=NULL);.  /*
34d40 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
34d50 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  ll the intermedi
34d60 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  ate directories 
34d70 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29  */.  len = (int)
34d80 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29  strlen(lockPath)
34d90 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63  ;.  buf[0] = loc
34da0 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28  kPath[0];.  for(
34db0 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b   i=1; i<len; i++
34dc0 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
34dd0 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26  Path[i] == '/' &
34de0 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30  & (i - start > 0
34df0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e  ) ){.      /* on
34e00 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66  ly mkdir if leaf
34e10 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22   dir != "." or "
34e20 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20  /" or ".." */.  
34e30 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e      if( i-start>
34e40 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31  2 || (i-start==1
34e50 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
34e60 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
34e70 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20  rt] != '/') .   
34e80 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72        || (i-star
34e90 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72  t==2 && buf[star
34ea0 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
34eb0 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27  [start+1] != '.'
34ec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66  ) ){.        buf
34ed0 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20  [i]='\0';.      
34ee0 20 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c    if( mkdir(buf,
34ef0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
34f00 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
34f10 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20  IONS) ){.       
34f20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
34f30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
34f40 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a  err!=EEXIST ) {.
34f50 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
34f60 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
34f70 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65  PATH  FAILED cre
34f80 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20  ating %s, ".    
34f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fa0 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63   "'%s' proxy loc
34fb0 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
34fc0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
34fd0 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73            buf, s
34fe0 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f  trerror(err), lo
34ff0 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
35000 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
35010 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
35020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35030 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35040 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
35050 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
35060 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
35070 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
35080 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
35090 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
350a0 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
350b0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
350c0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
350d0 61 74 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79  atic int isProxy
350e0 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78  LockingMode(unix
350f0 46 69 6c 65 20 2a 70 46 69 6c 65 29 20 7b 0a 20  File *pFile) {. 
35100 20 72 65 74 75 72 6e 20 28 70 46 69 6c 65 2d 3e   return (pFile->
35110 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
35120 79 49 6f 4d 65 74 68 6f 64 73 29 20 3f 20 31 20  yIoMethods) ? 1 
35130 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  : 0;.}../*.** Re
35140 74 75 72 6e 20 74 68 65 20 73 68 61 72 65 64 20  turn the shared 
35150 6d 65 6d 6f 72 79 20 62 61 73 65 20 70 61 74 68  memory base path
35160 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6c 6f   based on the lo
35170 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 69 66  ck proxy file if
35180 20 74 68 65 20 0a 2a 2a 20 6c 6f 63 6b 20 70 72   the .** lock pr
35190 6f 78 79 20 66 69 6c 65 20 69 73 20 68 6f 73 74  oxy file is host
351a0 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 20 6d  ed on a shared m
351b0 65 6d 6f 72 79 20 63 6f 6d 70 61 74 69 62 6c 65  emory compatible
351c0 20 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f   FS.*/.static co
351d0 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53  nst char *proxyS
351e0 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50  haredMemoryBaseP
351f0 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ath(unixFile *pF
35200 69 6c 65 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f  ile) {.  proxyLo
35210 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
35220 74 78 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  tx;.  unixFile *
35230 70 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 0a 20 20  pLockFile;.  .  
35240 61 73 73 65 72 74 28 70 46 69 6c 65 21 3d 4e 55  assert(pFile!=NU
35250 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  LL && pFile->loc
35260 6b 69 6e 67 43 6f 6e 74 65 78 74 21 3d 4e 55 4c  kingContext!=NUL
35270 4c 29 3b 0a 20 20 61 73 73 65 72 74 28 70 46 69  L);.  assert(pFi
35280 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
35290 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b  proxyIoMethods);
352a0 0a 20 20 70 43 74 78 20 3d 20 28 28 70 72 6f 78  .  pCtx = ((prox
352b0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
352c0 2a 29 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *)(pFile->lockin
352d0 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 4c  gContext));.  pL
352e0 6f 63 6b 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  ockFile = pCtx->
352f0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 69 66 28  lockProxy;.  if(
35300 20 70 4c 6f 63 6b 46 69 6c 65 2d 3e 70 4d 65 74   pLockFile->pMet
35310 68 6f 64 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32  hod->iVersion>=2
35320 20 26 26 20 70 4c 6f 63 6b 46 69 6c 65 2d 3e 70   && pLockFile->p
35330 4d 65 74 68 6f 64 2d 3e 78 53 68 6d 4d 61 70 21  Method->xShmMap!
35340 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
35350 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
35360 50 61 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Path;.  }.  retu
35370 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn NULL;.}../*.*
35380 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
35390 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
353a0 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
353b0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
353c0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
353d0 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
353e0 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
353f0 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
35400 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
35410 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
35420 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
35430 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
35440 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
35450 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
35460 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
35470 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
35480 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
35490 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
354a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
354b0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
354c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
354d0 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
354e0 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
354f0 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
35500 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
35510 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
35520 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
35530 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
35540 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
35550 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
35560 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
35570 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
35580 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
35590 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
355a0 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66 64   -1;.  int dirfd
355b0 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
355c0 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
355d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
355e0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
355f0 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
35600 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  T;.  sqlite3_vfs
35610 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74   dummyVfs;.  int
35620 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55   terrno = 0;.  U
35630 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
35640 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  used = NULL;..  
35650 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20  /* 1. first try 
35660 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
35670 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20  he file.  ** 2. 
35680 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61  if that fails, a
35690 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63  nd this is a loc
356a0 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63  k file (not-conc
356b0 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67  h), try creating
356c0 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74  .  ** the parent
356d0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64   directories and
356e0 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e   then try again.
356f0 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74  .  ** 3. if that
35700 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f   fails, try to o
35710 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61  pen the file rea
35720 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  d-only.  ** othe
35730 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53  rwise return BUS
35740 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29  Y (if lock file)
35750 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72   or CANTOPEN for
35760 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a   the conch file.
35770 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d    */.  pUnused =
35780 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
35790 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29  path, openFlags)
357a0 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20  ;.  if( pUnused 
357b0 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75  ){.    fd = pUnu
357c0 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65  sed->fd;.  }else
357d0 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  {.    pUnused = 
357e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
357f0 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
35800 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
35810 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
35820 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
35830 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
35840 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
35850 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
35860 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
35870 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
35880 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
35890 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
358a0 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  rno;.    if( fd<
358b0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  0 && errno==ENOE
358c0 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65  NT && islockfile
358d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
358e0 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
358f0 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54  h(path) == SQLIT
35900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35910 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
35920 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
35930 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
35940 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
35950 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  S);.      }.    
35960 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
35970 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67   ){.    openFlag
35980 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
35990 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
359a0 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
359b0 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  gs, SQLITE_DEFAU
359c0 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
359d0 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  ONS);.    terrno
359e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
359f0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
35a00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
35a10 75 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69  used);.    if( i
35a20 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
35a30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35a40 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
35a50 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
35a60 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
35a70 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
35a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
35a90 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
35aa0 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
35ab0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
35ac0 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
35ad0 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
35ae0 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
35af0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
35b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
35b10 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
35b20 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
35b30 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
35b40 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
35b50 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
35b60 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
35b70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35b80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
35b90 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
35ba0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
35bb0 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  New, 0, sizeof(u
35bc0 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65  nixFile));.  pNe
35bd0 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  w->openFlags = o
35be0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73  penFlags;.  mems
35bf0 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c  et(&dummyVfs, 0,
35c00 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73   sizeof(dummyVfs
35c10 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70  ));.  dummyVfs.p
35c20 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  AppData = (void*
35c30 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
35c40 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a  er;.  dummyVfs.z
35c50 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a  Name = "dummy";.
35c60 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
35c70 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
35c80 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
35c90 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
35ca0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
35cb0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
35cc0 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
35cd0 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c   fd, dirfd, (sql
35ce0 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
35cf0 20 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b   path, 0, 0, 0);
35d00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
35d10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
35d20 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
35d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35d40 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
35d50 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f  _proxy:    .  ro
35d60 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
35d70 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
35d80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
35d90 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
35da0 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
35db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
35dc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
35dd0 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
35de0 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
35df0 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
35e00 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
35e10 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
35e20 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
35e30 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
35e40 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
35e50 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
35e60 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
35e70 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20  ngth */../* Not 
35e80 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
35e90 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
35ea0 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
35eb0 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
35ec0 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
35ed0 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
35ee0 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
35ef0 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  );../* get the h
35f00 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f  ost ID via getho
35f10 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49  stuuid(), pHostI
35f20 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  D must point to 
35f30 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
35f40 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69  .** bytes of wri
35f50 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  table memory..*/
35f60 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35f70 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67  yGetHostID(unsig
35f80 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49  ned char *pHostI
35f90 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
35fa0 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f  .  assert(PROXY_
35fb0 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a  HOSTIDLEN == siz
35fc0 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20  eof(uuid_t));.  
35fd0 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20  memset(pHostID, 
35fe0 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  0, PROXY_HOSTIDL
35ff0 45 4e 29 3b 0a 23 69 66 20 48 41 56 45 5f 47 45  EN);.#if HAVE_GE
36000 54 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20 20  THOSTUUID.  {.  
36010 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
36020 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20  c timeout = {1, 
36030 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d  0}; /* 1 sec tim
36040 65 6f 75 74 20 2a 2f 0a 20 20 20 20 0a 20 20 20  eout */.    .   
36050 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69 64   if( gethostuuid
36060 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f  (pHostID, &timeo
36070 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ut) ){.      int
36080 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20   err = errno;.  
36090 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
360a0 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f  {.        *pErro
360b0 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d  r = err;.      }
360c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
360d0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
360e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  }.  }.#endif.#if
360f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
36100 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75    /* simulate mu
36110 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
36120 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
36130 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
36140 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  s */.  if( sqlit
36150 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d  e3_hostid_num !=
36160 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44   0){.    pHostID
36170 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f  [0] = (char)(pHo
36180 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29  stID[0] + (char)
36190 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  (sqlite3_hostid_
361a0 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20  num & 0xFF));.  
361b0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65  }.#endif.  .  re
361c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
361d0 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20  }../* The conch 
361e0 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
361f0 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69  e header, host i
36200 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  d and lock file 
36210 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  path. */.#define
36220 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53   PROXY_CONCHVERS
36230 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74  ION 2   /* 1-byt
36240 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74  e header, 16-byt
36250 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20  e host id, path 
36260 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
36270 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20  _HEADERLEN    1 
36280 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
36290 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f  header length */
362a0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50  .#define PROXY_P
362b0 41 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f  ATHINDEX    (PRO
362c0 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
362d0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64  XY_HOSTIDLEN).#d
362e0 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43  efine PROXY_MAXC
362f0 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f  ONCHLEN  (PROXY_
36300 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
36310 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54  HOSTIDLEN+MAXPAT
36320 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61  HLEN)../* .** Ta
36330 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63  kes an open conc
36340 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74  h file, copies t
36350 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61  he contents to a
36360 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68   new path and th
36370 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20  en moves .** it 
36380 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79  back.  The newly
36390 20 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20   created file's 
363a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
363b0 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  is assigned to t
363c0 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65  he.** conch file
363d0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66   structure and f
363e0 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69  inally the origi
363f0 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  nal conch file d
36400 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a  escriptor is .**
36410 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e   closed.  Return
36420 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73  s zero if succes
36430 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sful..*/.static 
36440 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f  int proxyBreakCo
36450 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
36460 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
36470 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f  myHostID){.  pro
36480 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36490 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
364a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
364b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
364c0 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
364d0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
364e0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
364f0 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41  .  char tPath[MA
36500 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  XPATHLEN];.  cha
36510 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43  r buf[PROXY_MAXC
36520 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  ONCHLEN];.  char
36530 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e   *cPath = pCtx->
36540 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20  conchFilePath;. 
36550 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20   size_t readLen 
36560 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61  = 0;.  size_t pa
36570 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  thLen = 0;.  cha
36580 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22  r errmsg[64] = "
36590 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  ";.  int fd = -1
365a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b  ;.  int rc = -1;
365b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
365c0 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a  TER(myHostID);..
365d0 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65    /* create a ne
365e0 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63  w path by replac
365f0 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27  e the trailing '
36600 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62  -conch' with '-b
36610 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c  reak' */.  pathL
36620 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61  en = strlcpy(tPa
36630 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41  th, cPath, MAXPA
36640 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61  THLEN);.  if( pa
36650 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e  thLen>MAXPATHLEN
36660 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c   || pathLen<6 ||
36670 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28   .     (strlcpy(
36680 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35  &tPath[pathLen-5
36690 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21  ], "break", 6) !
366a0 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  = 5) ){.    sqli
366b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
366c0 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d  eof(errmsg),errm
366d0 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28  sg,"path error (
366e0 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61  len %d)",(int)pa
366f0 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  thLen);.    goto
36700 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
36710 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68    }.  /* read th
36720 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20  e conch content 
36730 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f  */.  readLen = o
36740 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65  sPread(conchFile
36750 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f  ->h, buf, PROXY_
36760 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
36770 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50  .  if( readLen<P
36780 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29  ROXY_PATHINDEX )
36790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
367a0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
367b0 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65  rmsg),errmsg,"re
367c0 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  ad error (len %d
367d0 29 22 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29  )",(int)readLen)
367e0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
367f0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
36800 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  /* write it out 
36810 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
36820 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20   break file */. 
36830 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
36840 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52  n(tPath, (O_RDWR
36850 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29  |O_CREAT|O_EXCL)
36860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36870 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
36880 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
36890 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c  IONS);.  if( fd<
368a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
368b0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
368c0 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
368d0 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64  , "create failed
368e0 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
368f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
36900 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  aklock;.  }.  if
36910 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62  ( osPwrite(fd, b
36920 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20  uf, readLen, 0) 
36930 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64  != (ssize_t)read
36940 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
36950 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
36960 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
36970 73 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65  sg, "write faile
36980 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
36990 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
369a0 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69  eaklock;.  }.  i
369b0 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c  f( rename(tPath,
369c0 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73   cPath) ){.    s
369d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
369e0 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
369f0 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20  errmsg, "rename 
36a00 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
36a10 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
36a20 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
36a30 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70  }.  rc = 0;.  fp
36a40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62  rintf(stderr, "b
36a50 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  roke stale lock 
36a60 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29  on %s\n", cPath)
36a70 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  ;.  robust_close
36a80 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c  (pFile, conchFil
36a90 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
36aa0 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20  .  conchFile->h 
36ab0 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  = fd;.  conchFil
36ac0 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  e->openFlags = O
36ad0 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
36ae0 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a  ..end_breaklock:
36af0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
36b00 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
36b10 20 20 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68      unlink(tPath
36b20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
36b30 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
36b40 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
36b50 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  }.    fprintf(st
36b60 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
36b70 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63   break stale loc
36b80 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20  k on %s, %s\n", 
36b90 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a  cPath, errmsg);.
36ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
36bb0 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20  .}../* Take the 
36bc0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f  requested lock o
36bd0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
36be0 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61   and break a sta
36bf0 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a  le lock if the .
36c00 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  ** host id match
36c10 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
36c20 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  t proxyConchLock
36c30 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
36c40 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
36c50 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29  D, int lockType)
36c60 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
36c70 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
36c80 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
36c90 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
36ca0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
36cb0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
36cc0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
36cd0 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  chFile;.  int rc
36ce0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
36cf0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
36d00 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20  conchModTime;.  
36d10 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
36d20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
36d30 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
36d40 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
36d50 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
36d60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36d70 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
36d80 20 70 43 74 78 2d 3e 6e 46 61 69 6c 73 20 2b 2b   pCtx->nFails ++
36d90 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ;.      /* If th
36da0 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62  e lock failed (b
36db0 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31  usy):.       * 1
36dc0 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20  st try: get the 
36dd0 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20  mod time of the 
36de0 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73  conch, wait 0.5s
36df0 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
36e00 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72  .       * 2nd tr
36e10 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d  y: fail if the m
36e20 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20  od time changed 
36e30 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69  or host id is di
36e40 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20  fferent, wait . 
36e50 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20        *         
36e60 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79    10 sec and try
36e70 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20   again.       * 
36e80 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74  3rd try: break t
36e90 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74  he lock unless t
36ea0 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20  he mod time has 
36eb0 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20  changed..       
36ec0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
36ed0 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
36ee0 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63  if( osFstat(conc
36ef0 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  hFile->h, &buf) 
36f00 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
36f10 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
36f20 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
36f30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
36f40 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
36f50 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
36f60 70 43 74 78 2d 3e 6e 46 61 69 6c 73 3d 3d 31 20  pCtx->nFails==1 
36f70 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68  ){.        conch
36f80 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74  ModTime = buf.st
36f90 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20  _mtimespec;.    
36fa0 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30      usleep(50000
36fb0 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20  0); /* wait 0.5 
36fc0 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20  sec and try the 
36fd0 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20  lock again*/.   
36fe0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
36ff0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
37000 61 73 73 65 72 74 28 20 70 43 74 78 2d 3e 6e 46  assert( pCtx->nF
37010 61 69 6c 73 3e 31 20 29 3b 0a 20 20 20 20 20 20  ails>1 );.      
37020 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  if( conchModTime
37030 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73  .tv_sec != buf.s
37040 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73  t_mtimespec.tv_s
37050 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ec || .         
37060 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
37070 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d  nsec != buf.st_m
37080 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63  timespec.tv_nsec
37090 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
370a0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
370b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
370c0 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6e       if( pCtx->n
370d0 46 61 69 6c 73 3d 3d 32 20 29 7b 20 20 0a 20 20  Fails==2 ){  .  
370e0 20 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b        char tBuf[
370f0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
37100 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  N];.        int 
37110 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  len = osPread(co
37120 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66  nchFile->h, tBuf
37130 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
37140 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LEN, 0);.       
37150 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20   if( len<0 ){.  
37160 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
37170 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
37180 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
37190 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
371a0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LOCK;.        }.
371b0 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
371c0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
371d0 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61  && tBuf[0]==(cha
371e0 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
371f0 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20  SION){.         
37200 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
37210 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  the lock if the 
37220 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20  host id doesn't 
37230 6d 61 74 63 68 2c 20 62 75 74 20 64 6f 20 6c 6f  match, but do lo
37240 67 0a 20 20 20 20 20 20 20 20 20 20 20 2a 20 61  g.           * a
37250 6e 20 65 72 72 6f 72 20 74 6f 20 63 6f 6e 73 6f  n error to conso
37260 6c 65 20 73 6f 20 75 73 65 72 73 20 63 61 6e 20  le so users can 
37270 64 69 61 67 6e 6f 73 65 20 73 74 61 6c 65 20 4e  diagnose stale N
37280 46 53 20 6c 6f 63 6b 73 20 6d 6f 72 65 20 0a 20  FS locks more . 
37290 20 20 20 20 20 20 20 20 20 20 2a 20 65 61 73 69            * easi
372a0 6c 79 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ly .           *
372b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
372c0 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b  0!=memcmp(&tBuf[
372d0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
372e0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
372f0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a  Y_HOSTIDLEN) ){.
37300 20 20 20 20 20 20 20 20 20 20 20 20 75 75 69 64              uuid
37310 5f 74 20 63 6f 6e 63 68 55 55 49 44 3b 0a 20 20  _t conchUUID;.  
37320 20 20 20 20 20 20 20 20 20 20 75 75 69 64 5f 73            uuid_s
37330 74 72 69 6e 67 5f 74 20 63 6f 6e 63 68 55 55 49  tring_t conchUUI
37340 44 53 74 72 69 6e 67 3b 0a 20 20 20 20 20 20 20  DString;.       
37350 20 20 20 20 20 75 75 69 64 5f 73 74 72 69 6e 67       uuid_string
37360 5f 74 20 6d 79 55 55 49 44 53 74 72 69 6e 67 3b  _t myUUIDString;
37370 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
37380 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44  ert(PROXY_HOSTID
37390 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75  LEN == sizeof(uu
373a0 69 64 5f 74 29 29 3b 0a 20 20 20 20 20 20 20 20  id_t));.        
373b0 20 20 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68      memcpy(conch
373c0 55 55 49 44 2c 20 26 74 42 75 66 5b 50 52 4f 58  UUID, &tBuf[PROX
373d0 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 50 52  Y_HEADERLEN], PR
373e0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
373f0 20 20 20 20 20 20 20 20 20 20 20 20 75 75 69 64              uuid
37400 5f 75 6e 70 61 72 73 65 28 63 6f 6e 63 68 55 55  _unparse(conchUU
37410 49 44 2c 20 63 6f 6e 63 68 55 55 49 44 53 74 72  ID, conchUUIDStr
37420 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ing);.          
37430 20 20 75 75 69 64 5f 75 6e 70 61 72 73 65 28 6d    uuid_unparse(m
37440 79 48 6f 73 74 49 44 2c 20 6d 79 55 55 49 44 53  yHostID, myUUIDS
37450 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  tring);.        
37460 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
37470 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c 69  rr, "ERROR: sqli
37480 74 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  te database is l
37490 6f 63 6b 65 64 20 62 65 63 61 75 73 65 20 69 74  ocked because it
374a0 20 69 73 20 69 6e 20 75 73 65 20 22 0a 20 20 20   is in use ".   
374b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374c0 20 22 62 79 20 61 6e 6f 74 68 65 72 20 68 6f 73   "by another hos
374d0 74 20 74 68 61 74 20 68 6f 6c 64 73 20 61 20 68  t that holds a h
374e0 6f 73 74 2d 65 78 63 6c 75 73 69 76 65 20 6c 6f  ost-exclusive lo
374f0 63 6b 20 6f 6e 20 25 73 3b 20 22 0a 20 20 20 20  ck on %s; ".    
37500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37510 22 74 68 69 73 20 68 6f 73 74 20 28 55 55 49 44  "this host (UUID
37520 20 25 73 29 20 63 61 6e 6e 6f 74 20 6f 76 65 72   %s) cannot over
37530 72 69 64 65 20 74 68 65 20 68 6f 73 74 2d 65 78  ride the host-ex
37540 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 22 0a 20  clusive lock ". 
37550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37560 20 20 20 22 75 6e 74 69 6c 20 74 68 65 20 6f 74     "until the ot
37570 68 65 72 20 68 6f 73 74 20 28 55 55 49 44 20 25  her host (UUID %
37580 73 29 20 72 65 6c 65 61 73 65 73 20 69 74 73 20  s) releases its 
37590 6c 6f 63 6b 73 20 6f 6e 20 25 73 5c 6e 22 2c 20  locks on %s\n", 
375a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
375b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74       pFile->zPat
375c0 68 2c 20 6d 79 55 55 49 44 53 74 72 69 6e 67 2c  h, myUUIDString,
375d0 20 63 6f 6e 63 68 55 55 49 44 53 74 72 69 6e 67   conchUUIDString
375e0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 7a 50 61  , conchFile->zPa
375f0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  th);.           
37600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37610 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
37620 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
37630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
37640 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
37650 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20  k on short read 
37660 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73  or a version mis
37670 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
37680 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37690 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
376a0 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
376b0 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  10000000); /* wa
376c0 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72  it 10 sec and tr
376d0 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
376e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
376f0 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20  inue; .      }. 
37700 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65       .      asse
37710 72 74 28 20 70 43 74 78 2d 3e 6e 46 61 69 6c 73  rt( pCtx->nFails
37720 3e 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=3 );.      if(
37730 20 28 70 43 74 78 2d 3e 6e 46 61 69 6c 73 3d 3d   (pCtx->nFails==
37740 33 29 26 26 28 30 3d 3d 70 72 6f 78 79 42 72 65  3)&&(0==proxyBre
37750 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  akConchLock(pFil
37760 65 2c 20 6d 79 48 6f 73 74 49 44 29 29 20 29 7b  e, myHostID)) ){
37770 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
37780 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
37790 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45   if( lockType==E
377a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
377b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
377c0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
377d0 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
377e0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
377f0 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
37800 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;          .    
37810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
37820 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
37830 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
37840 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
37850 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
37860 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
37870 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Type);.        }
37880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37890 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51   } while( rc==SQ
378a0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 43 74  LITE_BUSY && pCt
378b0 78 2d 3e 6e 46 61 69 6c 73 3c 33 20 29 3b 0a 20  x->nFails<3 );. 
378c0 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
378d0 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
378e0 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
378f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
37900 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
37910 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
37920 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
37930 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
37940 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
37950 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
37960 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
37970 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
37980 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
37990 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
379a0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
379b0 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
379c0 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
379d0 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
379e0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
379f0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
37a00 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
37a10 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
37a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
37a30 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
37a40 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
37a50 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37a60 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
37a70 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37a80 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
37a90 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
37aa0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
37ab0 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
37ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37ad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
37ae0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
37af0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
37b00 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
37b10 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
37b20 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
37b30 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
37b40 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
37b50 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
37b60 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
37b70 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
37b80 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
37b90 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
37ba0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
37bb0 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
37bc0 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
37bd0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
37be0 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
37bf0 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
37c00 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
37c10 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
37c20 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
37c30 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
37c40 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
37c50 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
37c60 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
37c70 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
37c80 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
37c90 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
37ca0 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
37cb0 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20  etpid()));..    
37cc0 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
37cd0 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
37ce0 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
37cf0 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
37d00 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
37d10 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
37d20 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
37d30 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
37d40 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
37d50 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
37d60 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
37d70 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
37d80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
37d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37da0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
37db0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
37dc0 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
37dd0 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
37de0 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
37df0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
37e00 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
37e10 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
37e20 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
37e30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
37e40 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
37e50 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
37e60 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
37e70 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
37e80 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
37e90 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
37ea0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
37eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
37ec0 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
37ed0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
37ee0 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
37ef0 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
37f00 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
37f10 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
37f20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
37f30 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
37f40 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
37f50 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
37f60 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
37f70 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
37f80 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
37f90 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
37fa0 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
37fb0 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
37fc0 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
37fd0 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
37fe0 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
37ff0 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
38000 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
38010 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
38020 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
38030 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
38040 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
38050 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
38060 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
38070 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
38080 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
38090 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
380a0 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
380b0 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
380c0 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
380d0 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
380e0 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
380f0 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
38100 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
38110 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
38120 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
38130 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
38140 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
38150 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
38160 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
38170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38180 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
38190 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
381a0 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
381b0 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
381c0 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
381d0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
381e0 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
381f0 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
38200 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
38210 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
38220 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
38230 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
38240 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
38250 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
38260 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
38270 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
38280 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
38290 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
382a0 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
382b0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
382c0 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
382d0 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
382e0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
382f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
38300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
38310 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
38320 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
38330 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
38340 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
38350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
38360 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
38370 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
38380 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
38390 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
383a0 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
383b0 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
383c0 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
383d0 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
383e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
383f0 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
38400 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
38410 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
38420 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
38430 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
38440 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
38450 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
38460 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
38470 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
38480 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
38490 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
384a0 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
384b0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
384c0 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
384d0 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
384e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
384f0 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
38500 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
38510 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
38520 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
38530 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
38540 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
38550 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
38560 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
38570 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
38580 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
38590 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
385a0 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
385b0 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
385c0 6e 27 74 20